md: minor cleanup in safe_delay_store.
authorNeilBrown <neilb@suse.de>
Mon, 15 Dec 2014 01:57:00 +0000 (12:57 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 5 Feb 2015 22:32:56 +0000 (09:32 +1100)
There isn't really much room for races with ->safemode_delay.
But as I am trying to clean up any racy code and will soon
be removing reconfig_mutex protection from most _store()
functions:
 - only set mddev->safemode_delay once, to ensure no code
   can see an intermediate value
 - use safemode_timer to call md_safemode_timeout() rather than
   calling it directly, to ensure it never races with itself.

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

index 5a949166dac0a5facf38225543ecdcc02312ca58..0f9bc9a02a1b402899b579b02bdd257e22136a5c 100644 (file)
@@ -3242,11 +3242,13 @@ safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len)
                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 || old_delay == 0)
-                       md_safemode_timeout((unsigned long)mddev);
+               unsigned long new_delay = (msec*HZ)/1000;
+
+               if (new_delay == 0)
+                       new_delay = 1;
+               mddev->safemode_delay = new_delay;
+               if (new_delay < old_delay || old_delay == 0)
+                       mod_timer(&mddev->safemode_timer, jiffies+1);
        }
        return len;
 }