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) {
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) {

View File

@ -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;

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 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
*/

14
mdadm.c
View File

@ -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,

View File

@ -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;

View File

@ -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)