From d04f65f48c93e7e57cc3c1d70dd07d094dece717 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 9 Jul 2012 17:20:32 +1000 Subject: [PATCH] Change the values for "max size" from -1 to 1. Both are impossible, and '1' allows size to be unsigned, which is neater. Also #define MAX_SIZE to be '1' to make it all more explicit. Signed-off-by: NeilBrown --- Build.c | 4 ++-- Create.c | 4 +++- Grow.c | 23 ++++++++++++----------- mdadm.c | 14 +++++++------- mdadm.h | 9 +++++++-- super-intel.c | 15 ++++++++------- 6 files changed, 39 insertions(+), 30 deletions(-) diff --git a/Build.c b/Build.c index 6b5b951..54d7683 100644 --- a/Build.c +++ b/Build.c @@ -126,7 +126,7 @@ int Build(char *mddev, int chunk, int level, int layout, if (vers >= 9000) { mdu_array_info_t array; array.level = level; - array.size = size; + array.size = size == MAX_SIZE ? 0 : size; array.nr_disks = raiddisks; array.raid_disks = raiddisks; array.md_minor = 0; @@ -182,7 +182,7 @@ int Build(char *mddev, int chunk, int level, int layout, goto abort; } if (get_dev_size(fd, NULL, &dsize) && - (size == 0 || dsize < size)) + (size == 0 || size == MAX_SIZE || dsize < size)) size = dsize; close(fd); if (vers >= 9000) { diff --git a/Create.c b/Create.c index be57236..8bb289a 100644 --- a/Create.c +++ b/Create.c @@ -249,7 +249,9 @@ int Create(struct supertype *st, char *mddev, pr_err("unknown level %d\n", level); return 1; } - + if (size == MAX_SIZE) + /* use '0' to mean 'max' now... */ + size = 0; if (size && chunk && chunk != UnSet) size &= ~(unsigned long long)(chunk - 1); newsize = size * 2; diff --git a/Grow.c b/Grow.c index 24995ad..893e464 100644 --- a/Grow.c +++ b/Grow.c @@ -1429,7 +1429,7 @@ static int reshape_container(char *container, char *devname, int verbose, int restart, int freeze_reshape); int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, - long long size, + unsigned long long size, int level, char *layout_str, int chunksize, int raid_disks, struct mddev_dev *devlist, int assume_clean, int force) @@ -1474,7 +1474,7 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, return 1; } - if (size >= 0 && + if (size > 0 && (chunksize || level!= UnSet || layout_str || raid_disks)) { pr_err("cannot change component size at the same time " "as other changes.\n" @@ -1611,14 +1611,14 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, } /* ========= set size =============== */ - if (size >= 0 && (size == 0 || size != array.size)) { - long long orig_size = get_component_size(fd)/2; - long long min_csize; + if (size > 0 && (size == MAX_DISKS || size != (unsigned)array.size)) { + unsigned long long orig_size = get_component_size(fd)/2; + unsigned long long min_csize; struct mdinfo *mdi; int raid0_takeover = 0; if (orig_size == 0) - orig_size = array.size; + orig_size = (unsigned) array.size; if (reshape_super(st, size, UnSet, UnSet, 0, 0, UnSet, NULL, devname, APPLY_METADATA_CHANGES, verbose > 0)) { @@ -1656,7 +1656,8 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, min_csize = 0; rv = 0; for (mdi = sra->devs; mdi; mdi = mdi->next) { - if (sysfs_set_num(sra, mdi, "size", size) < 0) { + if (sysfs_set_num(sra, mdi, "size", + size == MAX_SIZE ? 0 : size) < 0) { /* Probably kernel refusing to let us * reduce the size - not an error. */ @@ -1671,7 +1672,7 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, if (csize >= 2ULL*1024*1024*1024) csize = 2ULL*1024*1024*1024; if ((min_csize == 0 || (min_csize - > (long long)csize))) + > csize))) min_csize = csize; } } @@ -1687,7 +1688,7 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, rv = 1; goto size_change_error; } - if (min_csize && size == 0) { + if (min_csize && size == MAX_SIZE) { /* Don't let the kernel choose a size - it will get * it wrong */ @@ -1717,8 +1718,8 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, st->update_tail = &st->updates; } - array.size = size; - if (array.size != size) { + array.size = size == MAX_SIZE ? 0 : size; + if ((unsigned)array.size != size) { /* got truncated to 32bit, write to * component_size instead */ diff --git a/mdadm.c b/mdadm.c index c979b94..8832eff 100644 --- a/mdadm.c +++ b/mdadm.c @@ -49,7 +49,7 @@ int main(int argc, char *argv[]) int i; int chunk = 0; - long long size = -1; + unsigned long long size = 0; long long array_size = -1; int level = UnSet; int layout = UnSet; @@ -416,13 +416,13 @@ int main(int argc, char *argv[]) case O(GROW,'z'): case O(CREATE,'z'): case O(BUILD,'z'): /* size */ - if (size >= 0) { + if (size > 0) { pr_err("size may only be specified once. " "Second value is %s.\n", optarg); exit(2); } if (strcmp(optarg, "max")==0) - size = 0; + size = MAX_SIZE; else { size = parse_size(optarg); if (size < 8) { @@ -1334,7 +1334,7 @@ int main(int argc, char *argv[]) break; } - rv = Create(ss, devlist->devname, chunk, level, layout, size<0 ? 0 : size, + rv = Create(ss, devlist->devname, chunk, level, layout, size, raiddisks, sparedisks, ident.name, ident.uuid_set ? ident.uuid : NULL, devs_found-1, devlist->next, @@ -1430,7 +1430,7 @@ int main(int argc, char *argv[]) } if (devs_found > 1 && raiddisks == 0) { /* must be '-a'. */ - if (size >= 0 || chunk || layout_str != NULL || bitmap_file) { + if (size > 0 || chunk || layout_str != NULL || bitmap_file) { pr_err("--add cannot be used with " "other geometry changes in --grow mode\n"); rv = 1; @@ -1443,7 +1443,7 @@ int main(int argc, char *argv[]) break; } } else if (bitmap_file) { - if (size >= 0 || raiddisks || chunk || + if (size > 0 || raiddisks || chunk || layout_str != NULL || devs_found > 1) { pr_err("--bitmap changes cannot be " "used with other geometry changes " @@ -1459,7 +1459,7 @@ int main(int argc, char *argv[]) rv = Grow_continue_command(devlist->devname, mdfd, c.backup_file, c.verbose); - else if (size >= 0 || raiddisks != 0 || layout_str != NULL + else if (size > 0 || raiddisks != 0 || layout_str != NULL || chunk != 0 || level != UnSet) { rv = Grow_reshape(devlist->devname, mdfd, c.verbose, c.backup_file, size, level, layout_str, chunk, raiddisks, diff --git a/mdadm.h b/mdadm.h index 2bf4e8c..5de1d3e 100644 --- a/mdadm.h +++ b/mdadm.h @@ -776,7 +776,8 @@ extern struct superswitch { #define APPLY_METADATA_CHANGES 1 #define ROLLBACK_METADATA_CHANGES 0 - int (*reshape_super)(struct supertype *st, long long size, int level, + int (*reshape_super)(struct supertype *st, + unsigned long long size, int level, int layout, int chunksize, int raid_disks, int delta_disks, char *backup, char *dev, int direction, @@ -1074,7 +1075,7 @@ extern int autodetect(void); extern int Grow_Add_device(char *devname, int fd, char *newdev); extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force); extern int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, - long long size, + unsigned long long size, int level, char *layout_str, int chunksize, int raid_disks, struct mddev_dev *devlist, int assume_clean, int force); @@ -1440,4 +1441,8 @@ char *xstrdup(const char *str); */ #define MAX_DISKS 4096 +/* Sometimes the 'size' value passed needs to mean "Maximum". + * In those cases with use MAX_SIZE + */ +#define MAX_SIZE 1 extern int __offroot; diff --git a/super-intel.c b/super-intel.c index 10fbcd6..d11eabd 100644 --- a/super-intel.c +++ b/super-intel.c @@ -433,7 +433,7 @@ struct imsm_update_activate_spare { struct geo_params { int dev_id; char *dev_name; - long long size; + unsigned long long size; int level; int layout; int chunksize; @@ -9307,7 +9307,7 @@ static int imsm_reshape_is_allowed_on_container(struct supertype *st, "st->devnum = (%i)\n", st->devnum); - if (geo->size != -1 || + if (geo->size > 0 || geo->level != UnSet || geo->layout != UnSet || geo->chunksize != 0 || @@ -9647,9 +9647,9 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st, int data_disks; struct imsm_dev *dev; struct intel_super *super; - long long current_size; + unsigned long long current_size; unsigned long long free_size; - long long max_size; + unsigned long long max_size; int rv; getinfo_super_imsm_volume(st, &info, NULL); @@ -9746,7 +9746,7 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st, geo->size * 2); } - if ((current_size != geo->size) && (geo->size >= 0)) { + if ((current_size != geo->size) && (geo->size > 0)) { if (change != -1) { pr_err("Error. Size change should be the only " "one at a time.\n"); @@ -9776,7 +9776,7 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st, chunk * 1024, max_size); } - if (geo->size == 0) { + if (geo->size == MAX_SIZE) { /* requested size change to the maximum available size */ if (max_size == 0) { @@ -9881,7 +9881,8 @@ int imsm_takeover(struct supertype *st, struct geo_params *geo) return 0; } -static int imsm_reshape_super(struct supertype *st, long long size, int level, +static int imsm_reshape_super(struct supertype *st, unsigned long long size, + int level, int layout, int chunksize, int raid_disks, int delta_disks, char *backup, char *dev, int direction, int verbose)