summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-05-21 09:42:25 +1000
committerNeilBrown <neilb@suse.de>2012-05-21 09:42:25 +1000
commit74d394800d354343635603d4145769894b429657 (patch)
tree9269b5ee83971f79f7357d908de8cb34fac0d737
parentc905b44a5b6c6affb47d845abd6a0b1860ef3148 (diff)
downloadmdadm-74d394800d354343635603d4145769894b429657.tar.gz
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 <neilb@suse.de>
-rw-r--r--Create.c13
-rw-r--r--Manage.c2
-rw-r--r--mdadm.h1
-rw-r--r--super-ddf.c12
-rw-r--r--super-gpt.c1
-rw-r--r--super-intel.c19
-rw-r--r--super-mbr.c1
-rw-r--r--super0.c1
-rw-r--r--super1.c3
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 */