From c4d831e164da10be75f915f9e06c529e90f55da9 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Fri, 28 Apr 2006 14:10:38 +1000 Subject: [PATCH] Make sure update_super returns correct value. For 'force' and 'assemble', update_super must return true if anything was changed. Also fix a bug with wonly handling in super0. Signed-off-by: Neil Brown ### Diffstat output ./super0.c | 18 ++++++++++++++---- ./super1.c | 7 +++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff ./super0.c~current~ ./super0.c --- super0.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'super0.c') diff --git a/super0.c b/super0.c index a36b0a7..49474d0 100644 --- a/super0.c +++ b/super0.c @@ -317,6 +317,9 @@ static void getinfo_super0(struct mdinfo *info, void *sbv) static int update_super0(struct mdinfo *info, void *sbv, char *update, char *devname, int verbose) { + /* NOTE: for 'assemble' and 'force' we need to return non-zero if any change was made. + * For others, the return value is ignored. + */ int rv = 0; mdp_super_t *sb = sbv; if (strcmp(update, "sparc2.2")==0 ) { @@ -367,18 +370,25 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, char *dev sb->disks[i].state = 0; } if (strcmp(update, "force")==0) { + __u32 ehi = sb->events_hi, elo = sb->events_lo; sb->events_hi = (info->events>>32) & 0xFFFFFFFF; sb->events_lo = (info->events) & 0xFFFFFFFF; - if (sb->level == 5 || sb->level == 4 || sb->level == 6) + if (sb->events_hi != ehi || + sb->events_lo != elo) + rv = 1; + if ((sb->level == 5 || sb->level == 4 || sb->level == 6) && + (sb->state & (1 << MD_SB_CLEAN)) == 0) { /* need to force clean */ sb->state |= (1 << MD_SB_CLEAN); + rv = 1; + } } if (strcmp(update, "assemble")==0) { int d = info->disk.number; int wonly = sb->disks[d].state & (1<disks[d].state &= ~(1<disks[d].state != info->disk.state) { - sb->disks[d].state = info->disk.state & wonly; + if ((sb->disks[d].state & ~(1<disk.state) { + sb->disks[d].state = info->disk.state | wonly; rv = 1; } } -- cgit