Make writes to md/safe_mode_delay immediately effective.
authorNeilBrown <neilb@suse.de>
Tue, 5 Aug 2008 05:54:13 +0000 (15:54 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 5 Aug 2008 05:56:31 +0000 (15:56 +1000)
If we reduce the 'safe_mode_delay', it could still wait for the old
delay to completely expire before doing anything about safe_mode.
Thus the effect if the change is delayed.

To make the effect more immediate, run the timeout function
immediately if the delay was reduced.  This may cause it to run
slightly earlier that required, but that is the safer option.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index c7aae66c6f9bc55386aea5a57db74b78ca27dd30..48afe4f7ad4c2d3538b85ec8234abfdd7c194845 100644 (file)
@@ -2393,6 +2393,8 @@ static void analyze_sbs(mddev_t * mddev)
 
 }
 
+static void md_safemode_timeout(unsigned long data);
+
 static ssize_t
 safe_delay_show(mddev_t *mddev, char *page)
 {
@@ -2432,9 +2434,12 @@ safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len)
        if (msec == 0)
                mddev->safemode_delay = 0;
        else {
+               unsigned long old_delay = mddev->safemode_delay;
                mddev->safemode_delay = (msec*HZ)/1000;
                if (mddev->safemode_delay == 0)
                        mddev->safemode_delay = 1;
+               if (mddev->safemode_delay < old_delay)
+                       md_safemode_timeout((unsigned long)mddev);
        }
        return len;
 }