diff options
author | NeilBrown <neilb@suse.de> | 2011-12-23 00:17:53 +0100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-12-23 00:17:53 +0100 |
commit | 9a3e1101b827a59ac9036a672f5fa8d5279d0fe2 (patch) | |
tree | 9e629fbc1bab31b588c475181246bbe30778f67a /drivers/md/raid5.h | |
parent | md/raid5: writes should get directed to replacement as well as original. (diff) | |
download | linux-9a3e1101b827a59ac9036a672f5fa8d5279d0fe2.tar.xz linux-9a3e1101b827a59ac9036a672f5fa8d5279d0fe2.zip |
md/raid5: detect and handle replacements during recovery.
During recovery we want to write to the replacement but not
the original. So we have two new flags
- R5_NeedReplace if this stripe has a replacement that needs to
be written at some stage
- R5_WantReplace if NeedReplace, and the data is available, and
a 'sync' has been requested on this stripe.
We also distinguish between 'sync and replace' which need to read
all other devices, and 'replace' which only needs to read the
devices being replaced.
Note that during resync we always write to any replacement device.
It might not need to be written to, but as we don't read to compare,
we have to write to be sure.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/raid5.h')
-rw-r--r-- | drivers/md/raid5.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index f6faaa16a565..8d8e13934a48 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h @@ -242,7 +242,13 @@ struct stripe_head { * for handle_stripe. */ struct stripe_head_state { - int syncing, expanding, expanded; + /* 'syncing' means that we need to read all devices, either + * to check/correct parity, or to reconstruct a missing device. + * 'replacing' means we are replacing one or more drives and + * the source is valid at this point so we don't need to + * read all devices, just the replacement targets. + */ + int syncing, expanding, expanded, replacing; int locked, uptodate, to_read, to_write, failed, written; int to_fill, compute, req_compute, non_overwrite; int failed_num[2]; @@ -284,6 +290,11 @@ enum r5dev_flags { R5_ReadRepl, /* Will/did read from replacement rather than orig */ R5_MadeGoodRepl,/* A bad block on the replacement device has been * fixed by writing to it */ + R5_NeedReplace, /* This device has a replacement which is not + * up-to-date at this stripe. */ + R5_WantReplace, /* We need to update the replacement, we have read + * data in, and now is a good time to write it out. + */ }; /* |