From 74d394800d354343635603d4145769894b429657 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 21 May 2012 09:42:25 +1000 Subject: Add data_offset arg to ->validate_geometry. This is needed to return correct available size. It isn't really used yet. Signed-off-by: NeilBrown --- Create.c | 13 +++++++------ Manage.c | 2 +- mdadm.h | 1 + super-ddf.c | 12 ++++++++++-- super-gpt.c | 1 + super-intel.c | 19 +++++++++++++------ super-mbr.c | 1 + super0.c | 1 + super1.c | 3 ++- 9 files changed, 37 insertions(+), 16 deletions(-) diff --git a/Create.c b/Create.c index 58d1068..0ad308f 100644 --- a/Create.c +++ b/Create.c @@ -263,7 +263,8 @@ int Create(struct supertype *st, char *mddev, size &= ~(unsigned long long)(chunk - 1); newsize = size * 2; if (st && ! st->ss->validate_geometry(st, level, layout, raiddisks, - &chunk, size*2, NULL, &newsize, verbose>=0)) + &chunk, size*2, -1LL, NULL, + &newsize, verbose>=0)) return 1; if (chunk && chunk != UnSet) { @@ -345,8 +346,8 @@ int Create(struct supertype *st, char *mddev, layout = default_layout(st, level, verbose); switch (st->ss->validate_geometry( st, level, layout, raiddisks, - &chunk, size*2, dname, &freesize, - verbose > 0)) { + &chunk, size*2, -1LL, dname, + &freesize, verbose > 0)) { case -1: /* Not valid, message printed, and not * worth checking any further */ exit(2); @@ -381,8 +382,8 @@ int Create(struct supertype *st, char *mddev, layout = default_layout(st, level, 0); if (!st->ss->validate_geometry(st, level, layout, raiddisks, - &chunk, size*2, dname, - &freesize, + &chunk, size*2, -1LL, + dname, &freesize, verbose >= 0)) { fprintf(stderr, @@ -483,7 +484,7 @@ int Create(struct supertype *st, char *mddev, /* size is meaningful */ if (!st->ss->validate_geometry(st, level, layout, raiddisks, - &chunk, minsize*2, + &chunk, minsize*2, -1LL, NULL, NULL, 0)) { fprintf(stderr, Name ": devices too large for RAID level %d\n", level); return 1; diff --git a/Manage.c b/Manage.c index 19afba9..d51a93c 100644 --- a/Manage.c +++ b/Manage.c @@ -660,7 +660,7 @@ int Manage_subdevs(char *devname, int fd, if (tst->ss->validate_geometry( tst, array.level, array.layout, array.raid_disks, NULL, - ldsize >> 9, NULL, NULL, 0) == 0) { + ldsize >> 9, -1LL, NULL, NULL, 0) == 0) { if (!force) { fprintf(stderr, Name ": %s is larger than %s can " diff --git a/mdadm.h b/mdadm.h index 410fc77..0019a65 100644 --- a/mdadm.h +++ b/mdadm.h @@ -733,6 +733,7 @@ extern struct superswitch { int (*validate_geometry)(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *subdev, unsigned long long *freesize, int verbose); diff --git a/super-ddf.c b/super-ddf.c index bfb0160..a4144b7 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -2601,18 +2601,21 @@ static int validate_geometry_ddf_container(struct supertype *st, int level, int layout, int raiddisks, int chunk, unsigned long long size, + long long data_offset, char *dev, unsigned long long *freesize, int verbose); static int validate_geometry_ddf_bvd(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *dev, unsigned long long *freesize, int verbose); static int validate_geometry_ddf(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *dev, unsigned long long *freesize, int verbose) { @@ -2635,7 +2638,8 @@ static int validate_geometry_ddf(struct supertype *st, /* Must be a fresh device to add to a container */ return validate_geometry_ddf_container(st, level, layout, raiddisks, chunk?*chunk:0, - size, dev, freesize, + size, data_offset, dev, + freesize, verbose); } @@ -2672,7 +2676,8 @@ static int validate_geometry_ddf(struct supertype *st, * Should make a distinction one day. */ return validate_geometry_ddf_bvd(st, level, layout, raiddisks, - chunk, size, dev, freesize, + chunk, size, data_offset, dev, + freesize, verbose); } /* This is the first device for the array. @@ -2731,6 +2736,7 @@ static int validate_geometry_ddf(struct supertype *st, close(cfd); return validate_geometry_ddf_bvd(st, level, layout, raiddisks, chunk, size, + data_offset, dev, freesize, verbose); } @@ -2745,6 +2751,7 @@ static int validate_geometry_ddf_container(struct supertype *st, int level, int layout, int raiddisks, int chunk, unsigned long long size, + long long data_offset, char *dev, unsigned long long *freesize, int verbose) { @@ -2779,6 +2786,7 @@ validate_geometry_ddf_container(struct supertype *st, static int validate_geometry_ddf_bvd(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *dev, unsigned long long *freesize, int verbose) { diff --git a/super-gpt.c b/super-gpt.c index 75269bf..a0c64cf 100644 --- a/super-gpt.c +++ b/super-gpt.c @@ -196,6 +196,7 @@ static struct supertype *match_metadata_desc(char *arg) static int validate_geometry(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *subdev, unsigned long long *freesize, int verbose) { diff --git a/super-intel.c b/super-intel.c index 282cc16..a6d36ba 100644 --- a/super-intel.c +++ b/super-intel.c @@ -5314,7 +5314,9 @@ static int imsm_bbm_log_size(struct imsm_super *mpb) #ifndef MDASSEMBLE static int validate_geometry_imsm_container(struct supertype *st, int level, int layout, int raiddisks, int chunk, - unsigned long long size, char *dev, + unsigned long long size, + long long data_offset, + char *dev, unsigned long long *freesize, int verbose) { @@ -5384,7 +5386,7 @@ static int validate_geometry_imsm_container(struct supertype *st, int level, } } - *freesize = avail_size_imsm(st, ldsize >> 9, -1); + *freesize = avail_size_imsm(st, ldsize >> 9, data_offset); free_imsm(super); return 1; @@ -5953,7 +5955,9 @@ validate_geometry_imsm_orom(struct intel_super *super, int level, int layout, */ static int validate_geometry_imsm_volume(struct supertype *st, int level, int layout, int raiddisks, int *chunk, - unsigned long long size, char *dev, + unsigned long long size, + long long data_offset, + char *dev, unsigned long long *freesize, int verbose) { @@ -6236,6 +6240,7 @@ static int reserve_space(struct supertype *st, int raiddisks, static int validate_geometry_imsm(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *dev, unsigned long long *freesize, int verbose) { @@ -6251,7 +6256,8 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, /* Must be a fresh device to add to a container */ return validate_geometry_imsm_container(st, level, layout, raiddisks, - chunk?*chunk:0, size, + chunk?*chunk:0, + size, data_offset, dev, freesize, verbose); } @@ -6294,6 +6300,7 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, /* creating in a given container */ return validate_geometry_imsm_volume(st, level, layout, raiddisks, chunk, size, + data_offset, dev, freesize, verbose); } @@ -6339,7 +6346,7 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, close(cfd); return validate_geometry_imsm_volume(st, level, layout, raiddisks, chunk, - size, dev, + size, data_offset, dev, freesize, 1) ? 1 : -1; } @@ -10085,7 +10092,7 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st, imsm_layout, geo->raid_disks + devNumChange, &chunk, - geo->size, + geo->size, -1LL, 0, 0, 1)) change = -1; diff --git a/super-mbr.c b/super-mbr.c index 6499963..da88706 100644 --- a/super-mbr.c +++ b/super-mbr.c @@ -189,6 +189,7 @@ static struct supertype *match_metadata_desc(char *arg) static int validate_geometry(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *subdev, unsigned long long *freesize, int verbose) { diff --git a/super0.c b/super0.c index 4da6fa9..e0c5a55 100644 --- a/super0.c +++ b/super0.c @@ -1130,6 +1130,7 @@ static void free_super0(struct supertype *st) static int validate_geometry0(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *subdev, unsigned long long *freesize, int verbose) { diff --git a/super1.c b/super1.c index b3cc22d..c4ae8d8 100644 --- a/super1.c +++ b/super1.c @@ -1767,6 +1767,7 @@ static void free_super1(struct supertype *st) static int validate_geometry1(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + long long data_offset, char *subdev, unsigned long long *freesize, int verbose) { @@ -1798,7 +1799,7 @@ static int validate_geometry1(struct supertype *st, int level, } close(fd); - *freesize = avail_size1(st, ldsize >> 9, -1); + *freesize = avail_size1(st, ldsize >> 9, data_offset); return 1; } #endif /* MDASSEMBLE */ -- cgit v1.2.1