From a57edde3617af1afc8ce745aa00bb091c2c3834a Mon Sep 17 00:00:00 2001 From: Jonathan Brassow Date: Fri, 8 Feb 2008 02:11:32 +0000 Subject: [PATCH] --- yaml --- r: 84595 b: refs/heads/master c: 8f0205b798f926e2745de5fdebf0a8605c621de6 h: refs/heads/master i: 84593: b094a82a3be5a7a0a4fb360c16f521951c56c982 84591: d12cd1c909e470b1172e3b8bd2b482dae9aba01e v: v3 --- [refs] | 2 +- trunk/drivers/md/dm-raid1.c | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 7e3bf18a0746..2b1e0371e907 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 72f4b314100bae85c75d8e4c6fec621ab44e777d +refs/heads/master: 8f0205b798f926e2745de5fdebf0a8605c621de6 diff --git a/trunk/drivers/md/dm-raid1.c b/trunk/drivers/md/dm-raid1.c index 4e1e04dbc4ab..9978b9f07fe9 100644 --- a/trunk/drivers/md/dm-raid1.c +++ b/trunk/drivers/md/dm-raid1.c @@ -737,15 +737,32 @@ static void fail_mirror(struct mirror *m, enum dm_raid1_error error_type) static void recovery_complete(int read_err, unsigned int write_err, void *context) { - struct region *reg = (struct region *) context; + struct region *reg = (struct region *)context; + struct mirror_set *ms = reg->rh->ms; + int m, bit = 0; - if (read_err) + if (read_err) { /* Read error means the failure of default mirror. */ DMERR_LIMIT("Unable to read primary mirror during recovery"); + fail_mirror(get_default_mirror(ms), DM_RAID1_SYNC_ERROR); + } - if (write_err) + if (write_err) { DMERR_LIMIT("Write error during recovery (error = 0x%x)", write_err); + /* + * Bits correspond to devices (excluding default mirror). + * The default mirror cannot change during recovery. + */ + for (m = 0; m < ms->nr_mirrors; m++) { + if (&ms->mirror[m] == get_default_mirror(ms)) + continue; + if (test_bit(bit, &write_err)) + fail_mirror(ms->mirror + m, + DM_RAID1_SYNC_ERROR); + bit++; + } + } rh_recovery_end(reg, !(read_err || write_err)); }