xfs
[Top] [All Lists]

Re: swidth with mdadm and RAID6

To: Shailendra Tripathi <stripathi@xxxxxxxxx>
Subject: Re: swidth with mdadm and RAID6
From: Steve Cousins <cousins@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 19 Sep 2006 12:36:20 -0400 (EDT)
Cc: xfs@xxxxxxxxxxx
In-reply-to: <fc.004c4d192b2da8e03b9aca0078918430.2b2da8e5@xxxxxxxxxxxxxx>
Reply-to: cousins@xxxxxxxxxxxxxx
Sender: xfs-bounce@xxxxxxxxxxx
Hi Shailendra,

I ran the program and it reports:

        Level 6, disks=11 spare_disks=1 raid_disks=10

which looks good.   I don't understand why you got:

        Level 5, disks=7 spare_disks=3 raid_disks=5

Why would it have 3 spare_disks?

Thanks,

Steve

______________________________________________________________________
 Steve Cousins, Ocean Modeling Group    Email: cousins@xxxxxxxxxxxxxx
 Marine Sciences, 452 Aubert Hall       http://rocky.umeoce.maine.edu
 Univ. of Maine, Orono, ME 04469        Phone: (207) 581-4302

On Mon, 18 Sep 2006, Shailendra Tripathi wrote:

> 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
> 
>        nr=working=active=failed=spare=0;
>         ITERATE_RDEV(mddev,rdev,tmp) {
>                 nr++;
>                 if (rdev->faulty)
>                         failed++;
>                 else {
>                         working++;
>                         if (rdev->in_sync)
>                                 active++;
>                         else
>                                 spare++;
>                 }
>         }
> 
>         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;
> 
> -shailendra
> The program is pasted below:
> md_info.c. Takes /dev/md<no> as name. For example, /dev/md11.
> 
> #include<stdio.h>
> #include<fcntl.h>
> #include<sys/ioctl.h>
> #ifndef MD_MAJOR
> #define MD_MAJOR                9
> #endif
> 
> #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]);
>                 exit(1);
>         }
>         if (ioctl(fd, GET_ARRAY_INFO, &md)) {
>                 printf("Error getting MD array info from %s\n", argv[1]);
>                 exit(1);
>         }
>         close(fd);
>         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>