summaryrefslogtreecommitdiffstats
path: root/Grow.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-10-22 10:42:06 +1100
committerNeilBrown <neilb@suse.de>2009-10-22 10:42:06 +1100
commit9739642288555dae607ee4aa0eec0e9245cecf74 (patch)
tree10eb2d11c883a2896452119e19ce1aad8d27f2f7 /Grow.c
parenteb3929a47f547f3890b2d5d3891941e96d7f73eb (diff)
downloadmdadm-9739642288555dae607ee4aa0eec0e9245cecf74.tar.gz
mdadm-9739642288555dae607ee4aa0eec0e9245cecf74.tar.xz
mdadm-9739642288555dae607ee4aa0eec0e9245cecf74.zip
Grow: update backup-metadata mtime every time we write it.
Originally the backup-metadata was only written once at the start of a raid5 reshape that made the array bigger. So we only set the mtime once. Now that we can be writing metadata continually during an in-place reshape, we need to update the mtime more often. Also, allow the metadata mtime to be slightly in advance of the array mtime. Normally the difference will be less than a second, so 10 minutes should be plenty. This guards against an old backup file being used to restart an array. but starting two reshapes in the 10 minutes is sufficiently unlikely, and the possibility of an accident is already sufficiently small, that 10 minutes is probably fine. Thanks to Guy Martin <gmsoft@tuxicoman.be> for discovering and reporting that .mtime wasn't being updated properly. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Grow.c')
-rw-r--r--Grow.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/Grow.c b/Grow.c
index 1111526..f367041 100644
--- a/Grow.c
+++ b/Grow.c
@@ -1246,6 +1246,7 @@ int grow_backup(struct mdinfo *sra,
if (rv)
return rv;
+ bsb.mtime = __cpu_to_le64(time(0));
for (i = 0; i < dests; i++) {
bsb.devstart = __cpu_to_le64(destoffsets[i]/512);
@@ -1315,6 +1316,7 @@ int wait_backup(struct mdinfo *sra,
bsb.arraystart = __cpu_to_le64(0);
bsb.length = __cpu_to_le64(0);
}
+ bsb.mtime = __cpu_to_le64(time(0));
for (i = 0; i < dests; i++) {
bsb.devstart = __cpu_to_le64(destoffsets[i]/512);
bsb.sb_csum = bsb_csum((char*)&bsb, ((char*)&bsb.sb_csum)-((char*)&bsb));
@@ -1639,8 +1641,8 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist, int cnt
continue; /* Wrong uuid */
}
- if (info->array.utime > __le64_to_cpu(bsb.mtime) + 3600 ||
- info->array.utime < __le64_to_cpu(bsb.mtime)) {
+ if (info->array.utime > __le64_to_cpu(bsb.mtime) + 10*60 ||
+ info->array.utime < __le64_to_cpu(bsb.mtime) - 10*60) {
if (verbose)
fprintf(stderr, Name ": too-old timestamp on backup-metadata on %s\n", devname);
continue; /* time stamp is too bad */