diff options
author | Adam Kwolek <adam.kwolek@intel.com> | 2012-04-13 16:51:59 +0200 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-04-17 12:33:37 +1000 |
commit | 016e00f54635138ce34b9e4ba18d37e182288bd1 (patch) | |
tree | fcf5ea4e39c642ae7d94eab4168d12f9c5d762b9 /Grow.c | |
parent | 54397ed97af065b1e3a12d6beab09bc05a07a9d0 (diff) |
FIX: Support metadata changes rollback
Function reshape_super() guards metadata changes.
It is used to apply changes rollback in error case also.
As change (apply and rollback) can be not bi-directional reshape_super()
has to know if current action is metadata change that should be guarded
using metadata restrictions, or this is metadata rollback change
executed due to error occurrence.
In second case change has to be unconditional.
Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Grow.c')
-rw-r--r-- | Grow.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -650,7 +650,7 @@ static void wait_reshape(struct mdinfo *sra) static int reshape_super(struct supertype *st, long long size, int level, int layout, int chunksize, int raid_disks, int delta_disks, char *backup_file, char *dev, - int verbose) + int direction, int verbose) { /* nothing extra to check in the native case */ if (!st->ss->external) @@ -664,7 +664,7 @@ static int reshape_super(struct supertype *st, long long size, int level, return st->ss->reshape_super(st, size, level, layout, chunksize, raid_disks, delta_disks, backup_file, dev, - verbose); + direction, verbose); } static void sync_metadata(struct supertype *st) @@ -1631,7 +1631,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, orig_size = array.size; if (reshape_super(st, size, UnSet, UnSet, 0, 0, UnSet, NULL, - devname, !quiet)) { + devname, APPLY_METADATA_CHANGES, !quiet)) { rv = 1; goto release; } @@ -1697,7 +1697,9 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, /* restore metadata */ if (reshape_super(st, orig_size, UnSet, UnSet, 0, 0, - UnSet, NULL, devname, !quiet) == 0) + UnSet, NULL, devname, + ROLLBACK_METADATA_CHANGES, + !quiet) == 0) sync_metadata(st); fprintf(stderr, Name ": Cannot set device size for %s: %s\n", devname, strerror(err)); @@ -1909,7 +1911,8 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, if (reshape_super(st, info.component_size, info.new_level, info.new_layout, info.new_chunk, info.array.raid_disks, info.delta_disks, - backup_file, devname, quiet)) { + backup_file, devname, APPLY_METADATA_CHANGES, + quiet)) { rv = 1; goto release; } @@ -2608,7 +2611,8 @@ int reshape_container(char *container, char *devname, reshape_super(st, -1, info->new_level, info->new_layout, info->new_chunk, info->array.raid_disks, info->delta_disks, - backup_file, devname, quiet)) { + backup_file, devname, APPLY_METADATA_CHANGES, + quiet)) { unfreeze(st); return 1; } |