X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmd%2Fmultipath.c;h=8f675d17f9d0551a1e5354f495a24df5808badf8;hb=746550cff061581f89c687ada8523670768364f2;hp=9114c7c269ed49cfc38b3b62a364c9627d56791f;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 9114c7c26..8f675d17f 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c @@ -159,16 +159,25 @@ static void unplug_slaves(mddev_t *mddev) { multipath_conf_t *conf = mddev_to_conf(mddev); int i; + unsigned long flags; + spin_lock_irqsave(&conf->device_lock, flags); for (i=0; iraid_disks; i++) { mdk_rdev_t *rdev = conf->multipaths[i].rdev; if (rdev && !rdev->faulty) { request_queue_t *r_queue = bdev_get_queue(rdev->bdev); + atomic_inc(&rdev->nr_pending); + spin_unlock_irqrestore(&conf->device_lock, flags); + if (r_queue->unplug_fn) r_queue->unplug_fn(r_queue); + + spin_lock_irqsave(&conf->device_lock, flags); + atomic_dec(&rdev->nr_pending); } } + spin_unlock_irqrestore(&conf->device_lock, flags); } static void multipath_unplug(request_queue_t *q) { @@ -522,6 +531,7 @@ static int multipath_stop (mddev_t *mddev) multipath_conf_t *conf = mddev_to_conf(mddev); md_unregister_thread(mddev->thread); + mddev->thread = NULL; mempool_destroy(conf->pool); kfree(conf->multipaths); kfree(conf);