diff options
author | NeilBrown <neilb@suse.de> | 2013-11-14 01:54:51 -0500 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2013-11-18 23:19:17 -0500 |
commit | 29f097c4d968021ee4fad1b033be5825ff78330e (patch) | |
tree | e530eecfcf85846c26d824176cd65a60ee093b8d /drivers/md/md.c | |
parent | edfa1f651e93261eecb034d02284ece103dd691a (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.c | 18 |
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 | ||
605 | static inline int mddev_lock(struct mddev * mddev) | 605 | static 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 | */ | ||
613 | static inline void mddev_lock_nointr(struct mddev * mddev) | ||
614 | { | ||
615 | mutex_lock(&mddev->reconfig_mutex); | ||
616 | } | ||
617 | |||
610 | static inline int mddev_is_locked(struct mddev *mddev) | 618 | static 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 | ||
5300 | void md_stop_writes(struct mddev *mddev) | 5308 | void 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; |