diff options
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r-- | drivers/md/raid5.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 2c8907706109..02f6bc2ac2db 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -4842,14 +4842,19 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk | |||
4842 | time_after(jiffies, conf->reshape_checkpoint + 10*HZ)) { | 4842 | time_after(jiffies, conf->reshape_checkpoint + 10*HZ)) { |
4843 | /* Cannot proceed until we've updated the superblock... */ | 4843 | /* Cannot proceed until we've updated the superblock... */ |
4844 | wait_event(conf->wait_for_overlap, | 4844 | wait_event(conf->wait_for_overlap, |
4845 | atomic_read(&conf->reshape_stripes)==0); | 4845 | atomic_read(&conf->reshape_stripes)==0 |
4846 | || test_bit(MD_RECOVERY_INTR, &mddev->recovery)); | ||
4847 | if (atomic_read(&conf->reshape_stripes) != 0) | ||
4848 | return 0; | ||
4846 | mddev->reshape_position = conf->reshape_progress; | 4849 | mddev->reshape_position = conf->reshape_progress; |
4847 | mddev->curr_resync_completed = sector_nr; | 4850 | mddev->curr_resync_completed = sector_nr; |
4848 | conf->reshape_checkpoint = jiffies; | 4851 | conf->reshape_checkpoint = jiffies; |
4849 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 4852 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
4850 | md_wakeup_thread(mddev->thread); | 4853 | md_wakeup_thread(mddev->thread); |
4851 | wait_event(mddev->sb_wait, mddev->flags == 0 || | 4854 | wait_event(mddev->sb_wait, mddev->flags == 0 || |
4852 | kthread_should_stop()); | 4855 | test_bit(MD_RECOVERY_INTR, &mddev->recovery)); |
4856 | if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) | ||
4857 | return 0; | ||
4853 | spin_lock_irq(&conf->device_lock); | 4858 | spin_lock_irq(&conf->device_lock); |
4854 | conf->reshape_safe = mddev->reshape_position; | 4859 | conf->reshape_safe = mddev->reshape_position; |
4855 | spin_unlock_irq(&conf->device_lock); | 4860 | spin_unlock_irq(&conf->device_lock); |
@@ -4932,7 +4937,10 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk | |||
4932 | >= mddev->resync_max - mddev->curr_resync_completed) { | 4937 | >= mddev->resync_max - mddev->curr_resync_completed) { |
4933 | /* Cannot proceed until we've updated the superblock... */ | 4938 | /* Cannot proceed until we've updated the superblock... */ |
4934 | wait_event(conf->wait_for_overlap, | 4939 | wait_event(conf->wait_for_overlap, |
4935 | atomic_read(&conf->reshape_stripes) == 0); | 4940 | atomic_read(&conf->reshape_stripes) == 0 |
4941 | || test_bit(MD_RECOVERY_INTR, &mddev->recovery)); | ||
4942 | if (atomic_read(&conf->reshape_stripes) != 0) | ||
4943 | goto ret; | ||
4936 | mddev->reshape_position = conf->reshape_progress; | 4944 | mddev->reshape_position = conf->reshape_progress; |
4937 | mddev->curr_resync_completed = sector_nr; | 4945 | mddev->curr_resync_completed = sector_nr; |
4938 | conf->reshape_checkpoint = jiffies; | 4946 | conf->reshape_checkpoint = jiffies; |
@@ -4940,13 +4948,16 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk | |||
4940 | md_wakeup_thread(mddev->thread); | 4948 | md_wakeup_thread(mddev->thread); |
4941 | wait_event(mddev->sb_wait, | 4949 | wait_event(mddev->sb_wait, |
4942 | !test_bit(MD_CHANGE_DEVS, &mddev->flags) | 4950 | !test_bit(MD_CHANGE_DEVS, &mddev->flags) |
4943 | || kthread_should_stop()); | 4951 | || test_bit(MD_RECOVERY_INTR, &mddev->recovery)); |
4952 | if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) | ||
4953 | goto ret; | ||
4944 | spin_lock_irq(&conf->device_lock); | 4954 | spin_lock_irq(&conf->device_lock); |
4945 | conf->reshape_safe = mddev->reshape_position; | 4955 | conf->reshape_safe = mddev->reshape_position; |
4946 | spin_unlock_irq(&conf->device_lock); | 4956 | spin_unlock_irq(&conf->device_lock); |
4947 | wake_up(&conf->wait_for_overlap); | 4957 | wake_up(&conf->wait_for_overlap); |
4948 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); | 4958 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); |
4949 | } | 4959 | } |
4960 | ret: | ||
4950 | return reshape_sectors; | 4961 | return reshape_sectors; |
4951 | } | 4962 | } |
4952 | 4963 | ||