md: make sure new_level, new_chunksize, new_layout always have sensible values.
authorNeilBrown <neilb@suse.de>
Tue, 31 Mar 2009 03:39:38 +0000 (14:39 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 31 Mar 2009 03:39:38 +0000 (14:39 +1100)
When an md array is undergoing a change, we have new_* fields that
show the new values.
When no change is happening, it is least confusing if these have
the same value as the normal fields.
This is true in most cases, but not when the values are set via sysfs.

So fix this up.

A subsequent patch will BUG_ON if these things aren't consistent.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index 07ab6790e29d86ef330c0e039b59b45969716716..117ea5fde56824f86839339cd968c380509ff6cf 100644 (file)
@@ -2633,9 +2633,9 @@ layout_store(mddev_t *mddev, const char *buf, size_t len)
 
        if (mddev->pers)
                return -EBUSY;
-       if (mddev->reshape_position != MaxSector)
-               mddev->new_layout = n;
-       else
+
+       mddev->new_layout = n;
+       if (mddev->reshape_position == MaxSector)
                mddev->layout = n;
        return len;
 }
@@ -2702,9 +2702,9 @@ chunk_size_store(mddev_t *mddev, const char *buf, size_t len)
 
        if (mddev->pers)
                return -EBUSY;
-       else if (mddev->reshape_position != MaxSector)
-               mddev->new_chunk = n;
-       else
+
+       mddev->new_chunk = n;
+       if (mddev->reshape_position == MaxSector)
                mddev->chunk_size = n;
        return len;
 }
@@ -3831,7 +3831,10 @@ static int do_md_run(mddev_t * mddev)
        }
        mddev->pers = pers;
        spin_unlock(&pers_lock);
-       mddev->level = pers->level;
+       if (mddev->level != pers->level) {
+               mddev->level = pers->level;
+               mddev->new_level = pers->level;
+       }
        strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
 
        if (pers->level >= 4 && pers->level <= 6)