From 04bde68164f84b28a7c75177ecefb3486d958729 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 1 Jul 2009 13:15:35 +1000 Subject: [PATCH] --- yaml --- r: 154713 b: refs/heads/master c: e62e58a5ffdc98ac28d8dbd070c857620d541f99 h: refs/heads/master i: 154711: 992c0b456054f0b46a227fe2974d5eeb7d076abf v: v3 --- [refs] | 2 +- trunk/drivers/md/md.c | 14 ++++++++++---- trunk/drivers/md/raid5.c | 15 +++++++++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 296aac206e9c..a2a75abd2bb1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a5c308d4d1659b1f4833b863394e3e24cdbdfc6e +refs/heads/master: e62e58a5ffdc98ac28d8dbd070c857620d541f99 diff --git a/trunk/drivers/md/md.c b/trunk/drivers/md/md.c index 65fe35b5e34a..0f4a70c43ffc 100644 --- a/trunk/drivers/md/md.c +++ b/trunk/drivers/md/md.c @@ -6336,10 +6336,16 @@ void md_do_sync(mddev_t *mddev) sysfs_notify(&mddev->kobj, NULL, "sync_completed"); } - if (j >= mddev->resync_max) - wait_event(mddev->recovery_wait, - mddev->resync_max > j - || kthread_should_stop()); + while (j >= mddev->resync_max && !kthread_should_stop()) { + /* As this condition is controlled by user-space, + * we can block indefinitely, so use '_interruptible' + * to avoid triggering warnings. + */ + flush_signals(current); /* just in case */ + wait_event_interruptible(mddev->recovery_wait, + mddev->resync_max > j + || kthread_should_stop()); + } if (kthread_should_stop()) goto interrupted; diff --git a/trunk/drivers/md/raid5.c b/trunk/drivers/md/raid5.c index 1f444ae07f89..37835538b58e 100644 --- a/trunk/drivers/md/raid5.c +++ b/trunk/drivers/md/raid5.c @@ -3699,14 +3699,21 @@ static int make_request(struct request_queue *q, struct bio * bi) goto retry; } } - /* FIXME what if we get a false positive because these - * are being updated. - */ + if (bio_data_dir(bi) == WRITE && logical_sector >= mddev->suspend_lo && logical_sector < mddev->suspend_hi) { release_stripe(sh); - schedule(); + /* As the suspend_* range is controlled by + * userspace, we want an interruptible + * wait. + */ + flush_signals(current); + prepare_to_wait(&conf->wait_for_overlap, + &w, TASK_INTERRUPTIBLE); + if (logical_sector >= mddev->suspend_lo && + logical_sector < mddev->suspend_hi) + schedule(); goto retry; }