summaryrefslogtreecommitdiff
path: root/Create.c
diff options
context:
space:
mode:
authorCzarnowska, Anna <anna.czarnowska@intel.com>2011-02-22 11:25:07 +1100
committerNeilBrown <neilb@suse.de>2011-02-22 11:25:07 +1100
commitc21e737ba12903ecf3a4f42a119807d328f3f8c9 (patch)
tree029b740e595b49559b34c4923af0d1f8508a6bd5 /Create.c
parent55425f279ca20b43c151eaf0bc08e6882eef746e (diff)
set default chunk in validate_geometry
When chunk size is not set from command line we need to guess it depending on metadata given on command line or found on listed devices. Validate_geometry sets the default for it's metadata if chunk is not set. For external metadata chunk is set only when creating in a container. For imsm validate_geometry_imsm_orom is responsible for finding default chunk depending on container metadata loaded. Container will already know which controller it is attached to, and have this controllers orom available. do_default_chunk indicates that we need to find default chunk and if validate_geometry fails for some metadata it tells us to reset chunk that may have been set. Current solution would set default chunk correctly for imsm only if container device was given on command line. With the list of devices chunk was always set to 512. Signed-off-by: Anna Czarnowska <anna.czarnowska@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Create.c')
-rw-r--r--Create.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/Create.c b/Create.c
index ccda07b8..1cadbcc3 100644
--- a/Create.c
+++ b/Create.c
@@ -114,6 +114,7 @@ int Create(struct supertype *st, char *mddev,
struct mdinfo info, *infos;
int did_default = 0;
int do_default_layout = 0;
+ int do_default_chunk = 0;
unsigned long safe_mode_delay = 0;
char chosen_name[1024];
struct map_ent *map = NULL;
@@ -229,13 +230,9 @@ int Create(struct supertype *st, char *mddev,
case 10:
case 6:
case 0:
- if (chunk == 0) {
- if (st && st->ss->default_geometry)
- st->ss->default_geometry(st, NULL, NULL, &chunk);
- chunk = chunk ? : 512;
- if (verbose > 0)
- fprintf(stderr, Name ": chunk size defaults to %dK\n", chunk);
- }
+ if (chunk == 0 || chunk == UnSet)
+ do_default_chunk = 1;
+ /* chunk will be set later */
break;
case LEVEL_LINEAR:
/* a chunksize of zero 0s perfectly valid (and preferred) since 2.6.16 */
@@ -264,7 +261,7 @@ 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, NULL, &newsize, verbose>=0))
return 1;
if (size == 0) {
size = newsize / 2;
@@ -308,10 +305,11 @@ int Create(struct supertype *st, char *mddev,
layout = default_layout(st, level, verbose);
if (st && !st->ss->validate_geometry
(st, level, layout, raiddisks,
- chunk, size*2, dname, &freesize,
+ &chunk, size*2, dname, &freesize,
verbose > 0)) {
free(st);
st = NULL;
+ chunk = do_default_chunk ? 0 : chunk;
}
}
@@ -329,7 +327,7 @@ int Create(struct supertype *st, char *mddev,
layout = default_layout(st, level, verbose);
if (!st->ss->validate_geometry(st, level, layout,
raiddisks,
- chunk, size*2, dname,
+ &chunk, size*2, dname,
&freesize,
verbose >= 0)) {
@@ -341,6 +339,11 @@ int Create(struct supertype *st, char *mddev,
continue;
}
}
+ if (verbose > 0 && do_default_chunk) {
+ do_default_chunk = 0;
+ fprintf(stderr, Name ": chunk size "
+ "defaults to %dK\n", chunk);
+ }
freesize /= 2; /* convert to K */
if (chunk) {
@@ -422,7 +425,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,
NULL, NULL, 0)) {
fprintf(stderr, Name ": devices too large for RAID level %d\n", level);
return 1;