aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-11-14 01:54:51 -0500
committerNeilBrown <neilb@suse.de>2013-11-18 23:19:17 -0500
commit29f097c4d968021ee4fad1b033be5825ff78330e (patch)
treee530eecfcf85846c26d824176cd65a60ee093b8d /drivers/md/md.c
parentedfa1f651e93261eecb034d02284ece103dd691a (diff)
md: fix some places where mddev_lock return value is not checked.
Sometimes we need to lock and mddev and cannot cope with failure due to interrupt. In these cases we should use mutex_lock, not mutex_lock_interruptible. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 1975c2d7aba3..1ca47b0f4779 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -602,11 +602,19 @@ static struct mddev * mddev_find(dev_t unit)
602 goto retry; 602 goto retry;
603} 603}
604 604
605static inline int mddev_lock(struct mddev * mddev) 605static inline int __must_check mddev_lock(struct mddev * mddev)
606{ 606{
607 return mutex_lock_interruptible(&mddev->reconfig_mutex); 607 return mutex_lock_interruptible(&mddev->reconfig_mutex);
608} 608}
609 609
610/* Sometimes we need to take the lock in a situation where
611 * failure due to interrupts is not acceptable.
612 */
613static inline void mddev_lock_nointr(struct mddev * mddev)
614{
615 mutex_lock(&mddev->reconfig_mutex);
616}
617
610static inline int mddev_is_locked(struct mddev *mddev) 618static inline int mddev_is_locked(struct mddev *mddev)
611{ 619{
612 return mutex_is_locked(&mddev->reconfig_mutex); 620 return mutex_is_locked(&mddev->reconfig_mutex);
@@ -3018,7 +3026,7 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
3018 for_each_mddev(mddev, tmp) { 3026 for_each_mddev(mddev, tmp) {
3019 struct md_rdev *rdev2; 3027 struct md_rdev *rdev2;
3020 3028
3021 mddev_lock(mddev); 3029 mddev_lock_nointr(mddev);
3022 rdev_for_each(rdev2, mddev) 3030 rdev_for_each(rdev2, mddev)
3023 if (rdev->bdev == rdev2->bdev && 3031 if (rdev->bdev == rdev2->bdev &&
3024 rdev != rdev2 && 3032 rdev != rdev2 &&
@@ -3034,7 +3042,7 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
3034 break; 3042 break;
3035 } 3043 }
3036 } 3044 }
3037 mddev_lock(my_mddev); 3045 mddev_lock_nointr(my_mddev);
3038 if (overlap) { 3046 if (overlap) {
3039 /* Someone else could have slipped in a size 3047 /* Someone else could have slipped in a size
3040 * change here, but doing so is just silly. 3048 * change here, but doing so is just silly.
@@ -5299,7 +5307,7 @@ static void __md_stop_writes(struct mddev *mddev)
5299 5307
5300void md_stop_writes(struct mddev *mddev) 5308void md_stop_writes(struct mddev *mddev)
5301{ 5309{
5302 mddev_lock(mddev); 5310 mddev_lock_nointr(mddev);
5303 __md_stop_writes(mddev); 5311 __md_stop_writes(mddev);
5304 mddev_unlock(mddev); 5312 mddev_unlock(mddev);
5305} 5313}
@@ -6592,7 +6600,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
6592 wait_event(mddev->sb_wait, 6600 wait_event(mddev->sb_wait,
6593 !test_bit(MD_CHANGE_DEVS, &mddev->flags) && 6601 !test_bit(MD_CHANGE_DEVS, &mddev->flags) &&
6594 !test_bit(MD_CHANGE_PENDING, &mddev->flags)); 6602 !test_bit(MD_CHANGE_PENDING, &mddev->flags));
6595 mddev_lock(mddev); 6603 mddev_lock_nointr(mddev);
6596 } 6604 }
6597 } else { 6605 } else {
6598 err = -EROFS; 6606 err = -EROFS;