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 <neilb@suse.de>
This commit is contained in:
NeilBrown 2012-07-09 17:20:32 +10:00
parent 56dcaa6ba0
commit d04f65f48c
6 changed files with 39 additions and 30 deletions

View File

@ -126,7 +126,7 @@ int Build(char *mddev, int chunk, int level, int layout,
if (vers >= 9000) { if (vers >= 9000) {
mdu_array_info_t array; mdu_array_info_t array;
array.level = level; array.level = level;
array.size = size; array.size = size == MAX_SIZE ? 0 : size;
array.nr_disks = raiddisks; array.nr_disks = raiddisks;
array.raid_disks = raiddisks; array.raid_disks = raiddisks;
array.md_minor = 0; array.md_minor = 0;
@ -182,7 +182,7 @@ int Build(char *mddev, int chunk, int level, int layout,
goto abort; goto abort;
} }
if (get_dev_size(fd, NULL, &dsize) && if (get_dev_size(fd, NULL, &dsize) &&
(size == 0 || dsize < size)) (size == 0 || size == MAX_SIZE || dsize < size))
size = dsize; size = dsize;
close(fd); close(fd);
if (vers >= 9000) { if (vers >= 9000) {

View File

@ -249,7 +249,9 @@ int Create(struct supertype *st, char *mddev,
pr_err("unknown level %d\n", level); pr_err("unknown level %d\n", level);
return 1; return 1;
} }
if (size == MAX_SIZE)
/* use '0' to mean 'max' now... */
size = 0;
if (size && chunk && chunk != UnSet) if (size && chunk && chunk != UnSet)
size &= ~(unsigned long long)(chunk - 1); size &= ~(unsigned long long)(chunk - 1);
newsize = size * 2; newsize = size * 2;

23
Grow.c
View File

@ -1429,7 +1429,7 @@ static int reshape_container(char *container, char *devname,
int verbose, int restart, int freeze_reshape); int verbose, int restart, int freeze_reshape);
int Grow_reshape(char *devname, int fd, int verbose, char *backup_file, 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, int level, char *layout_str, int chunksize, int raid_disks,
struct mddev_dev *devlist, struct mddev_dev *devlist,
int assume_clean, int force) int assume_clean, int force)
@ -1474,7 +1474,7 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file,
return 1; return 1;
} }
if (size >= 0 && if (size > 0 &&
(chunksize || level!= UnSet || layout_str || raid_disks)) { (chunksize || level!= UnSet || layout_str || raid_disks)) {
pr_err("cannot change component size at the same time " pr_err("cannot change component size at the same time "
"as other changes.\n" "as other changes.\n"
@ -1611,14 +1611,14 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file,
} }
/* ========= set size =============== */ /* ========= set size =============== */
if (size >= 0 && (size == 0 || size != array.size)) { if (size > 0 && (size == MAX_DISKS || size != (unsigned)array.size)) {
long long orig_size = get_component_size(fd)/2; unsigned long long orig_size = get_component_size(fd)/2;
long long min_csize; unsigned long long min_csize;
struct mdinfo *mdi; struct mdinfo *mdi;
int raid0_takeover = 0; int raid0_takeover = 0;
if (orig_size == 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, if (reshape_super(st, size, UnSet, UnSet, 0, 0, UnSet, NULL,
devname, APPLY_METADATA_CHANGES, verbose > 0)) { 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; min_csize = 0;
rv = 0; rv = 0;
for (mdi = sra->devs; mdi; mdi = mdi->next) { 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 /* Probably kernel refusing to let us
* reduce the size - not an error. * 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) if (csize >= 2ULL*1024*1024*1024)
csize = 2ULL*1024*1024*1024; csize = 2ULL*1024*1024*1024;
if ((min_csize == 0 || (min_csize if ((min_csize == 0 || (min_csize
> (long long)csize))) > csize)))
min_csize = csize; min_csize = csize;
} }
} }
@ -1687,7 +1688,7 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file,
rv = 1; rv = 1;
goto size_change_error; 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 /* Don't let the kernel choose a size - it will get
* it wrong * it wrong
*/ */
@ -1717,8 +1718,8 @@ int Grow_reshape(char *devname, int fd, int verbose, char *backup_file,
st->update_tail = &st->updates; st->update_tail = &st->updates;
} }
array.size = size; array.size = size == MAX_SIZE ? 0 : size;
if (array.size != size) { if ((unsigned)array.size != size) {
/* got truncated to 32bit, write to /* got truncated to 32bit, write to
* component_size instead * component_size instead
*/ */

14
mdadm.c
View File

@ -49,7 +49,7 @@ int main(int argc, char *argv[])
int i; int i;
int chunk = 0; int chunk = 0;
long long size = -1; unsigned long long size = 0;
long long array_size = -1; long long array_size = -1;
int level = UnSet; int level = UnSet;
int layout = UnSet; int layout = UnSet;
@ -416,13 +416,13 @@ int main(int argc, char *argv[])
case O(GROW,'z'): case O(GROW,'z'):
case O(CREATE,'z'): case O(CREATE,'z'):
case O(BUILD,'z'): /* size */ case O(BUILD,'z'): /* size */
if (size >= 0) { if (size > 0) {
pr_err("size may only be specified once. " pr_err("size may only be specified once. "
"Second value is %s.\n", optarg); "Second value is %s.\n", optarg);
exit(2); exit(2);
} }
if (strcmp(optarg, "max")==0) if (strcmp(optarg, "max")==0)
size = 0; size = MAX_SIZE;
else { else {
size = parse_size(optarg); size = parse_size(optarg);
if (size < 8) { if (size < 8) {
@ -1334,7 +1334,7 @@ int main(int argc, char *argv[])
break; 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, raiddisks, sparedisks, ident.name,
ident.uuid_set ? ident.uuid : NULL, ident.uuid_set ? ident.uuid : NULL,
devs_found-1, devlist->next, devs_found-1, devlist->next,
@ -1430,7 +1430,7 @@ int main(int argc, char *argv[])
} }
if (devs_found > 1 && raiddisks == 0) { if (devs_found > 1 && raiddisks == 0) {
/* must be '-a'. */ /* 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 " pr_err("--add cannot be used with "
"other geometry changes in --grow mode\n"); "other geometry changes in --grow mode\n");
rv = 1; rv = 1;
@ -1443,7 +1443,7 @@ int main(int argc, char *argv[])
break; break;
} }
} else if (bitmap_file) { } else if (bitmap_file) {
if (size >= 0 || raiddisks || chunk || if (size > 0 || raiddisks || chunk ||
layout_str != NULL || devs_found > 1) { layout_str != NULL || devs_found > 1) {
pr_err("--bitmap changes cannot be " pr_err("--bitmap changes cannot be "
"used with other geometry changes " "used with other geometry changes "
@ -1459,7 +1459,7 @@ int main(int argc, char *argv[])
rv = Grow_continue_command(devlist->devname, rv = Grow_continue_command(devlist->devname,
mdfd, c.backup_file, mdfd, c.backup_file,
c.verbose); c.verbose);
else if (size >= 0 || raiddisks != 0 || layout_str != NULL else if (size > 0 || raiddisks != 0 || layout_str != NULL
|| chunk != 0 || level != UnSet) { || chunk != 0 || level != UnSet) {
rv = Grow_reshape(devlist->devname, mdfd, c.verbose, c.backup_file, rv = Grow_reshape(devlist->devname, mdfd, c.verbose, c.backup_file,
size, level, layout_str, chunk, raiddisks, size, level, layout_str, chunk, raiddisks,

View File

@ -776,7 +776,8 @@ extern struct superswitch {
#define APPLY_METADATA_CHANGES 1 #define APPLY_METADATA_CHANGES 1
#define ROLLBACK_METADATA_CHANGES 0 #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 layout, int chunksize, int raid_disks,
int delta_disks, char *backup, char *dev, int delta_disks, char *backup, char *dev,
int direction, int direction,
@ -1074,7 +1075,7 @@ extern int autodetect(void);
extern int Grow_Add_device(char *devname, int fd, char *newdev); 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_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, 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, int level, char *layout_str, int chunksize, int raid_disks,
struct mddev_dev *devlist, struct mddev_dev *devlist,
int assume_clean, int force); int assume_clean, int force);
@ -1440,4 +1441,8 @@ char *xstrdup(const char *str);
*/ */
#define MAX_DISKS 4096 #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; extern int __offroot;

View File

@ -433,7 +433,7 @@ struct imsm_update_activate_spare {
struct geo_params { struct geo_params {
int dev_id; int dev_id;
char *dev_name; char *dev_name;
long long size; unsigned long long size;
int level; int level;
int layout; int layout;
int chunksize; int chunksize;
@ -9307,7 +9307,7 @@ static int imsm_reshape_is_allowed_on_container(struct supertype *st,
"st->devnum = (%i)\n", "st->devnum = (%i)\n",
st->devnum); st->devnum);
if (geo->size != -1 || if (geo->size > 0 ||
geo->level != UnSet || geo->level != UnSet ||
geo->layout != UnSet || geo->layout != UnSet ||
geo->chunksize != 0 || geo->chunksize != 0 ||
@ -9647,9 +9647,9 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
int data_disks; int data_disks;
struct imsm_dev *dev; struct imsm_dev *dev;
struct intel_super *super; struct intel_super *super;
long long current_size; unsigned long long current_size;
unsigned long long free_size; unsigned long long free_size;
long long max_size; unsigned long long max_size;
int rv; int rv;
getinfo_super_imsm_volume(st, &info, NULL); getinfo_super_imsm_volume(st, &info, NULL);
@ -9746,7 +9746,7 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
geo->size * 2); geo->size * 2);
} }
if ((current_size != geo->size) && (geo->size >= 0)) { if ((current_size != geo->size) && (geo->size > 0)) {
if (change != -1) { if (change != -1) {
pr_err("Error. Size change should be the only " pr_err("Error. Size change should be the only "
"one at a time.\n"); "one at a time.\n");
@ -9776,7 +9776,7 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
chunk * 1024, chunk * 1024,
max_size); max_size);
} }
if (geo->size == 0) { if (geo->size == MAX_SIZE) {
/* requested size change to the maximum available size /* requested size change to the maximum available size
*/ */
if (max_size == 0) { if (max_size == 0) {
@ -9881,7 +9881,8 @@ int imsm_takeover(struct supertype *st, struct geo_params *geo)
return 0; 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 layout, int chunksize, int raid_disks,
int delta_disks, char *backup, char *dev, int delta_disks, char *backup, char *dev,
int direction, int verbose) int direction, int verbose)