[Top] [All Lists]

Re: swidth with mdadm and RAID6

To: cousins@xxxxxxxxxxxxxx
Subject: Re: swidth with mdadm and RAID6
From: Shailendra Tripathi <stripathi@xxxxxxxxx>
Date: Tue, 19 Sep 2006 03:43:51 +0530
Cc: "\"xfs@xxxxxxxxxxx\" <xfs@xxxxxxxxxxx>" <xfs@xxxxxxxxxxx>
In-reply-to: <Pine.LNX.4.10.10609181639000.1732-100000@limpet.umeoce.maine.edu>
References: <Pine.LNX.4.10.10609181639000.1732-100000@limpet.umeoce.maine.edu>
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Mozilla Thunderbird 1.0.6 (Windows/20050716)
Hi Steve,
Your guess appears to be correct. md_ioctl returns nr which is total number of disk in the array including the spare disks. However, XFS function md_get_vol_stripe does not take spare disk into account. It needs to subtract spare_disks as well.
However, md.spare_disks returned by the call returns spare + parity (both). So, one way could be substract spare_disks directly. Otherwise, the xfs should rely on md.raid_disks. This does not include spare_disks and nr.disks should be changed for that.
When I run my program md_info on raid5 array with 5 devices and 2 spares, I get
[root@ga09 root]# ./a.out /dev/md11
Level 5, disks=7 spare_disks=3 raid_disks=5

Steve can you please compile the pasted program and run on your system with md prepared. It takes /dev/md<no> as input.
In your case, you should get above line as:
Level 6, disks=11 spare disks=3 raid_disks=10

       ITERATE_RDEV(mddev,rdev,tmp) {
               if (rdev->faulty)
               else {
                       if (rdev->in_sync)

       info.level         = mddev->level;
       info.size          = mddev->size;
       info.nr_disks      = nr;
       info.active_disks  = active;
       info.working_disks = working;
       info.failed_disks  = failed;
       info.spare_disks   = spare;

The program is pasted below:
md_info.c. Takes /dev/md<no> as name. For example, /dev/md11.

#ifndef MD_MAJOR
#define MD_MAJOR                9

#define GET_ARRAY_INFO          _IOR (MD_MAJOR, 0x11, struct md_array_info)

struct md_array_info { __uint32_t major_version; __uint32_t minor_version; __uint32_t patch_version; __uint32_t ctime; __uint32_t level; __uint32_t size; __uint32_t nr_disks; __uint32_t raid_disks; __uint32_t md_minor; __uint32_t not_persistent; /* * Generic state information */ __uint32_t utime; /* 0 Superblock update time */ __uint32_t state; /* 1 State bits (clean, ...) */ __uint32_t active_disks; /* 2 Number of currently active disks */ __uint32_t working_disks; /* 3 Number of working disks */ __uint32_t failed_disks; /* 4 Number of failed disks */ __uint32_t spare_disks; /* 5 Number of spare disks */ /* * Personality information */ __uint32_t layout; /* 0 the array's physical layout */ __uint32_t chunk_size; /* 1 chunk size in bytes */


int main(int argc, char *argv[])
       struct md_array_info    md;
       int                     fd;

/* Open device */
fd = open(argv[1], O_RDONLY);
if (fd == -1) {
printf("Could not open %s\n", argv[1]);
if (ioctl(fd, GET_ARRAY_INFO, &md)) {
printf("Error getting MD array info from %s\n", argv[1]);
printf("Level %d, disks=%d spare_disks=%d raid_disks=%d\n", md.level, md.nr_disks,
md.spare_disks, md.raid_disks);
return 0;

<Prev in Thread] Current Thread [Next in Thread>