]> git.hungrycats.org Git - linux/commitdiff
[PATCH] MD - Add in_sync flag to each rdev
authorNeil Brown <neilb@cse.unsw.edu.au>
Fri, 19 Jul 2002 02:09:33 +0000 (19:09 -0700)
committerTrond Myklebust <trond.myklebust@fys.uio.no>
Fri, 19 Jul 2002 02:09:33 +0000 (19:09 -0700)
Add in_sync flag to each rdev

This currently mirrors the MD_DISK_SYNC superblock flag,
but soon it will be authoritative and the superblock will
only be consulted at start time.

drivers/md/md.c
drivers/md/raid1.c
drivers/md/raid5.c
include/linux/raid/md_k.h

index dac5d26ef36c1964e96ce398b91fda8df0446ed3..64dd07bf36a061470ca39fb27b32ce3d0ee8c62d 100644 (file)
@@ -1179,9 +1179,19 @@ static int analyze_sbs(mddev_t * mddev)
                        rdev->alias_device = !!i;
                        rdev->desc_nr = i++;
                        rdev->raid_disk = rdev->desc_nr;
+                       rdev->in_sync = 1;
                } else {
+                       mdp_disk_t *desc;
                        rdev->desc_nr = rdev->sb->this_disk.number;
-                       rdev->raid_disk = sb->disks[rdev->desc_nr].raid_disk;
+                       desc = sb->disks + rdev->desc_nr;
+                       rdev->raid_disk = desc->raid_disk;
+                       rdev->in_sync = rdev->faulty = 0;
+
+                       if (desc->state & (1<<MD_DISK_FAULTY))
+                               rdev->faulty = 1;
+                       else if (desc->state & (1<<MD_DISK_SYNC) &&
+                                rdev->raid_disk < mddev->sb-raid_disks)
+                               rdev->in_sync = 1;
                }
        }
        /*
@@ -2110,6 +2120,11 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
                rdev->old_dev = dev;
                rdev->desc_nr = info->number;
                rdev->raid_disk = info->raid_disk;
+               rdev->faulty = 0;
+               if (rdev->raid_disk < mddev->sb->raid_disks)
+                       rdev->in_sync = (info->state & (1<<MD_DISK_SYNC));
+               else
+                       rdev->in_sync = 0;
 
                bind_rdev_to_array(rdev, mddev);
 
@@ -2271,6 +2286,7 @@ static int hot_add_disk(mddev_t * mddev, kdev_t dev)
                err = -EINVAL;
                goto abort_export;
        }
+       rdev->in_sync = 0;
        bind_rdev_to_array(rdev, mddev);
 
        /*
@@ -2852,6 +2868,7 @@ int md_error(mddev_t *mddev, struct block_device *bdev)
        if (!mddev->pers->error_handler
                        || mddev->pers->error_handler(mddev,bdev) <= 0) {
                rrdev->faulty = 1;
+               rrdev->in_sync = 0;
        } else
                return 1;
        /*
index cdf94c0928e5bf15c7cc6bd636ab87bab9c2de0d..971a30c9ed0bf914e1b4257d120bc63f3f8b3e4f 100644 (file)
@@ -726,6 +726,7 @@ static int raid1_spare_active(mddev_t *mddev)
                failed_rdev->desc_nr = spare_desc->number;
                failed_rdev->raid_disk = spare_disk;
        }
+       spare_rdev->in_sync = 1;
 
        xchg_values(*spare_desc, *failed_desc);
        xchg_values(*fdisk, *sdisk);
index 966195f7e7572feec6669c1caafad36dd5032067..09e4735e3a9f77bbaf3a161f01ff09c886935d6c 100644 (file)
@@ -1751,6 +1751,7 @@ static int raid5_spare_active(mddev_t *mddev)
                failed_rdev->desc_nr = spare_desc->number;
                failed_rdev->raid_disk = spare_disk;
        }
+       spare_rdev->in_sync = 1;
        
        xchg_values(*spare_desc, *failed_desc);
        xchg_values(*fdisk, *sdisk);
index 18f89adb4b0c7ac54c1c310973bfcb5f80005053..f3c8dcc7d8a8f9e19623d328bc5f88277429d5fa 100644 (file)
@@ -158,6 +158,8 @@ struct mdk_rdev_s
 
        int alias_device;               /* device alias to the same disk */
        int faulty;                     /* if faulty do not issue IO requests */
+       int in_sync;                    /* device is a full member of the array */
+
        int desc_nr;                    /* descriptor index in the superblock */
        int raid_disk;                  /* role of device in array */
 };