diff options
Diffstat (limited to 'drivers/md/multipath.c')
-rw-r--r-- | drivers/md/multipath.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index c06f4474192b..145cdc5ad008 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -63,8 +63,8 @@ static int multipath_map (multipath_conf_t *conf) | |||
63 | 63 | ||
64 | rcu_read_lock(); | 64 | rcu_read_lock(); |
65 | for (i = 0; i < disks; i++) { | 65 | for (i = 0; i < disks; i++) { |
66 | mdk_rdev_t *rdev = conf->multipaths[i].rdev; | 66 | mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev); |
67 | if (rdev && rdev->in_sync) { | 67 | if (rdev && test_bit(In_sync, &rdev->flags)) { |
68 | atomic_inc(&rdev->nr_pending); | 68 | atomic_inc(&rdev->nr_pending); |
69 | rcu_read_unlock(); | 69 | rcu_read_unlock(); |
70 | return i; | 70 | return i; |
@@ -139,8 +139,9 @@ static void unplug_slaves(mddev_t *mddev) | |||
139 | 139 | ||
140 | rcu_read_lock(); | 140 | rcu_read_lock(); |
141 | for (i=0; i<mddev->raid_disks; i++) { | 141 | for (i=0; i<mddev->raid_disks; i++) { |
142 | mdk_rdev_t *rdev = conf->multipaths[i].rdev; | 142 | mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev); |
143 | if (rdev && !rdev->faulty && atomic_read(&rdev->nr_pending)) { | 143 | if (rdev && !test_bit(Faulty, &rdev->flags) |
144 | && atomic_read(&rdev->nr_pending)) { | ||
144 | request_queue_t *r_queue = bdev_get_queue(rdev->bdev); | 145 | request_queue_t *r_queue = bdev_get_queue(rdev->bdev); |
145 | 146 | ||
146 | atomic_inc(&rdev->nr_pending); | 147 | atomic_inc(&rdev->nr_pending); |
@@ -211,7 +212,7 @@ static void multipath_status (struct seq_file *seq, mddev_t *mddev) | |||
211 | for (i = 0; i < conf->raid_disks; i++) | 212 | for (i = 0; i < conf->raid_disks; i++) |
212 | seq_printf (seq, "%s", | 213 | seq_printf (seq, "%s", |
213 | conf->multipaths[i].rdev && | 214 | conf->multipaths[i].rdev && |
214 | conf->multipaths[i].rdev->in_sync ? "U" : "_"); | 215 | test_bit(In_sync, &conf->multipaths[i].rdev->flags) ? "U" : "_"); |
215 | seq_printf (seq, "]"); | 216 | seq_printf (seq, "]"); |
216 | } | 217 | } |
217 | 218 | ||
@@ -224,8 +225,8 @@ static int multipath_issue_flush(request_queue_t *q, struct gendisk *disk, | |||
224 | 225 | ||
225 | rcu_read_lock(); | 226 | rcu_read_lock(); |
226 | for (i=0; i<mddev->raid_disks && ret == 0; i++) { | 227 | for (i=0; i<mddev->raid_disks && ret == 0; i++) { |
227 | mdk_rdev_t *rdev = conf->multipaths[i].rdev; | 228 | mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev); |
228 | if (rdev && !rdev->faulty) { | 229 | if (rdev && !test_bit(Faulty, &rdev->flags)) { |
229 | struct block_device *bdev = rdev->bdev; | 230 | struct block_device *bdev = rdev->bdev; |
230 | request_queue_t *r_queue = bdev_get_queue(bdev); | 231 | request_queue_t *r_queue = bdev_get_queue(bdev); |
231 | 232 | ||
@@ -265,10 +266,10 @@ static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev) | |||
265 | /* | 266 | /* |
266 | * Mark disk as unusable | 267 | * Mark disk as unusable |
267 | */ | 268 | */ |
268 | if (!rdev->faulty) { | 269 | if (!test_bit(Faulty, &rdev->flags)) { |
269 | char b[BDEVNAME_SIZE]; | 270 | char b[BDEVNAME_SIZE]; |
270 | rdev->in_sync = 0; | 271 | clear_bit(In_sync, &rdev->flags); |
271 | rdev->faulty = 1; | 272 | set_bit(Faulty, &rdev->flags); |
272 | mddev->sb_dirty = 1; | 273 | mddev->sb_dirty = 1; |
273 | conf->working_disks--; | 274 | conf->working_disks--; |
274 | printk(KERN_ALERT "multipath: IO failure on %s," | 275 | printk(KERN_ALERT "multipath: IO failure on %s," |
@@ -298,7 +299,7 @@ static void print_multipath_conf (multipath_conf_t *conf) | |||
298 | tmp = conf->multipaths + i; | 299 | tmp = conf->multipaths + i; |
299 | if (tmp->rdev) | 300 | if (tmp->rdev) |
300 | printk(" disk%d, o:%d, dev:%s\n", | 301 | printk(" disk%d, o:%d, dev:%s\n", |
301 | i,!tmp->rdev->faulty, | 302 | i,!test_bit(Faulty, &tmp->rdev->flags), |
302 | bdevname(tmp->rdev->bdev,b)); | 303 | bdevname(tmp->rdev->bdev,b)); |
303 | } | 304 | } |
304 | } | 305 | } |
@@ -330,8 +331,8 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) | |||
330 | 331 | ||
331 | conf->working_disks++; | 332 | conf->working_disks++; |
332 | rdev->raid_disk = path; | 333 | rdev->raid_disk = path; |
333 | rdev->in_sync = 1; | 334 | set_bit(In_sync, &rdev->flags); |
334 | p->rdev = rdev; | 335 | rcu_assign_pointer(p->rdev, rdev); |
335 | found = 1; | 336 | found = 1; |
336 | } | 337 | } |
337 | 338 | ||
@@ -350,7 +351,7 @@ static int multipath_remove_disk(mddev_t *mddev, int number) | |||
350 | 351 | ||
351 | rdev = p->rdev; | 352 | rdev = p->rdev; |
352 | if (rdev) { | 353 | if (rdev) { |
353 | if (rdev->in_sync || | 354 | if (test_bit(In_sync, &rdev->flags) || |
354 | atomic_read(&rdev->nr_pending)) { | 355 | atomic_read(&rdev->nr_pending)) { |
355 | printk(KERN_ERR "hot-remove-disk, slot %d is identified" " but is still operational!\n", number); | 356 | printk(KERN_ERR "hot-remove-disk, slot %d is identified" " but is still operational!\n", number); |
356 | err = -EBUSY; | 357 | err = -EBUSY; |
@@ -482,7 +483,7 @@ static int multipath_run (mddev_t *mddev) | |||
482 | mddev->queue->max_sectors > (PAGE_SIZE>>9)) | 483 | mddev->queue->max_sectors > (PAGE_SIZE>>9)) |
483 | blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); | 484 | blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); |
484 | 485 | ||
485 | if (!rdev->faulty) | 486 | if (!test_bit(Faulty, &rdev->flags)) |
486 | conf->working_disks++; | 487 | conf->working_disks++; |
487 | } | 488 | } |
488 | 489 | ||