]> git.ipfire.org Git - thirdparty/mdadm.git/commit - monitor.c
monitor: read_and_act: handle race conditions for resync_start
authormwilck@arcor.de <mwilck@arcor.de>
Fri, 25 Oct 2013 10:07:37 +0000 (12:07 +0200)
committerNeilBrown <neilb@suse.de>
Tue, 23 Apr 2013 04:55:32 +0000 (14:55 +1000)
commit40ae6f5f8ee99328224acc4eaf541aef248b9b7d
tree8000618b40098cdfa8f18afc02865481b818cd94
parent2b60d2890faa8b3dc361a163ea745380c1305c96
monitor: read_and_act: handle race conditions for resync_start

When arrays are stopped, sysfs attributes may be deleted by
the kernel, and attempts to read these attributes will fail.

Setting resync_start to 0 is wrong in this case, because it
may make is_resync_complete() erroneously return
FALSE for a clean array. It is better to leave resync_start
untouched (the previously read value for this array).

Otherwise set_array_state() will pass thewrong state information
to the metadata handler, which will write it to disk, and at
the next restart an unnecessary recovery is started for the
array.

It is also possible that resync_start is actually *not* deleted
yet when read_and_act is running, and an apparently valid
value of "0" is read from it, with the same effect as described
above. This happens if the kernel has already called md_clean()
on the array (setting recovery_cp = 0), but the delayed removal
of "resync_start" hasn't happened yet. Therefore, in "clear"
state, "resync_start" shouldn't be read at all.

Signed-off-by: Martin Wilck <mwilck@arcor.de>
Signed-off-by: NeilBrown <neilb@suse.de>
monitor.c