summaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r--drivers/md/raid5.c19
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 }
4960ret:
4950 return reshape_sectors; 4961 return reshape_sectors;
4951} 4962}
4952 4963