Use new 'struct shape' to pass args to Build
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
45c8bd9961
commit
a4e8316a75
84
Build.c
84
Build.c
|
@ -28,10 +28,8 @@
|
||||||
#define START_MD _IO (MD_MAJOR, 2)
|
#define START_MD _IO (MD_MAJOR, 2)
|
||||||
#define STOP_MD _IO (MD_MAJOR, 3)
|
#define STOP_MD _IO (MD_MAJOR, 3)
|
||||||
|
|
||||||
int Build(char *mddev, int chunk, int level, int layout,
|
int Build(char *mddev, struct mddev_dev *devlist,
|
||||||
int raiddisks, struct mddev_dev *devlist, int assume_clean,
|
struct shape *s, struct context *c)
|
||||||
char *bitmap_file, int bitmap_chunk, int write_behind,
|
|
||||||
struct context *c, unsigned long long size)
|
|
||||||
{
|
{
|
||||||
/* Build a linear or raid0 arrays without superblocks
|
/* Build a linear or raid0 arrays without superblocks
|
||||||
* We cannot really do any checks, we just do it.
|
* We cannot really do any checks, we just do it.
|
||||||
|
@ -77,33 +75,33 @@ int Build(char *mddev, int chunk, int level, int layout,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (raiddisks != subdevs) {
|
if (s->raiddisks != subdevs) {
|
||||||
pr_err("requested %d devices in array but listed %d\n",
|
pr_err("requested %d devices in array but listed %d\n",
|
||||||
raiddisks, subdevs);
|
s->raiddisks, subdevs);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layout == UnSet)
|
if (s->layout == UnSet)
|
||||||
switch(level) {
|
switch(s->level) {
|
||||||
default: /* no layout */
|
default: /* no layout */
|
||||||
layout = 0;
|
s->layout = 0;
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
layout = 0x102; /* near=2, far=1 */
|
s->layout = 0x102; /* near=2, far=1 */
|
||||||
if (c->verbose > 0)
|
if (c->verbose > 0)
|
||||||
pr_err("layout defaults to n1\n");
|
pr_err("layout defaults to n1\n");
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
case 6:
|
case 6:
|
||||||
layout = map_name(r5layout, "default");
|
s->layout = map_name(r5layout, "default");
|
||||||
if (c->verbose > 0)
|
if (c->verbose > 0)
|
||||||
pr_err("layout defaults to %s\n", map_num(r5layout, layout));
|
pr_err("layout defaults to %s\n", map_num(r5layout, s->layout));
|
||||||
break;
|
break;
|
||||||
case LEVEL_FAULTY:
|
case LEVEL_FAULTY:
|
||||||
layout = map_name(faultylayout, "default");
|
s->layout = map_name(faultylayout, "default");
|
||||||
|
|
||||||
if (c->verbose > 0)
|
if (c->verbose > 0)
|
||||||
pr_err("layout defaults to %s\n", map_num(faultylayout, layout));
|
pr_err("layout defaults to %s\n", map_num(faultylayout, s->layout));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,38 +123,38 @@ int Build(char *mddev, int chunk, int level, int layout,
|
||||||
/* looks Ok, go for it */
|
/* looks Ok, go for it */
|
||||||
if (vers >= 9000) {
|
if (vers >= 9000) {
|
||||||
mdu_array_info_t array;
|
mdu_array_info_t array;
|
||||||
array.level = level;
|
array.level = s->level;
|
||||||
array.size = size == MAX_SIZE ? 0 : size;
|
array.size = s->size == MAX_SIZE ? 0 : s->size;
|
||||||
array.nr_disks = raiddisks;
|
array.nr_disks = s->raiddisks;
|
||||||
array.raid_disks = raiddisks;
|
array.raid_disks = s->raiddisks;
|
||||||
array.md_minor = 0;
|
array.md_minor = 0;
|
||||||
if (fstat(mdfd, &stb)==0)
|
if (fstat(mdfd, &stb)==0)
|
||||||
array.md_minor = minor(stb.st_rdev);
|
array.md_minor = minor(stb.st_rdev);
|
||||||
array.not_persistent = 1;
|
array.not_persistent = 1;
|
||||||
array.state = 0; /* not clean, but no errors */
|
array.state = 0; /* not clean, but no errors */
|
||||||
if (assume_clean)
|
if (s->assume_clean)
|
||||||
array.state |= 1;
|
array.state |= 1;
|
||||||
array.active_disks = raiddisks - missing_disks;
|
array.active_disks = s->raiddisks - missing_disks;
|
||||||
array.working_disks = raiddisks - missing_disks;
|
array.working_disks = s->raiddisks - missing_disks;
|
||||||
array.spare_disks = 0;
|
array.spare_disks = 0;
|
||||||
array.failed_disks = missing_disks;
|
array.failed_disks = missing_disks;
|
||||||
if (chunk == 0 && (level==0 || level==LEVEL_LINEAR))
|
if (s->chunk == 0 && (s->level==0 || s->level==LEVEL_LINEAR))
|
||||||
chunk = 64;
|
s->chunk = 64;
|
||||||
array.chunk_size = chunk*1024;
|
array.chunk_size = s->chunk*1024;
|
||||||
array.layout = layout;
|
array.layout = s->layout;
|
||||||
if (ioctl(mdfd, SET_ARRAY_INFO, &array)) {
|
if (ioctl(mdfd, SET_ARRAY_INFO, &array)) {
|
||||||
pr_err("SET_ARRAY_INFO failed for %s: %s\n",
|
pr_err("SET_ARRAY_INFO failed for %s: %s\n",
|
||||||
mddev, strerror(errno));
|
mddev, strerror(errno));
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
} else if (bitmap_file) {
|
} else if (s->bitmap_file) {
|
||||||
pr_err("bitmaps not supported with this kernel\n");
|
pr_err("bitmaps not supported with this kernel\n");
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bitmap_file && level <= 0) {
|
if (s->bitmap_file && s->level <= 0) {
|
||||||
pr_err("bitmaps not meaningful with level %s\n",
|
pr_err("bitmaps not meaningful with level %s\n",
|
||||||
map_num(pers, level)?:"given");
|
map_num(pers, s->level)?:"given");
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
/* now add the devices */
|
/* now add the devices */
|
||||||
|
@ -182,8 +180,8 @@ 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 || size == MAX_SIZE || dsize < size))
|
(s->size == 0 || s->size == MAX_SIZE || dsize < s->size))
|
||||||
size = dsize;
|
s->size = dsize;
|
||||||
close(fd);
|
close(fd);
|
||||||
if (vers >= 9000) {
|
if (vers >= 9000) {
|
||||||
mdu_disk_info_t disk;
|
mdu_disk_info_t disk;
|
||||||
|
@ -210,14 +208,14 @@ int Build(char *mddev, int chunk, int level, int layout,
|
||||||
/* now to start it */
|
/* now to start it */
|
||||||
if (vers >= 9000) {
|
if (vers >= 9000) {
|
||||||
mdu_param_t param; /* not used by syscall */
|
mdu_param_t param; /* not used by syscall */
|
||||||
if (bitmap_file) {
|
if (s->bitmap_file) {
|
||||||
bitmap_fd = open(bitmap_file, O_RDWR);
|
bitmap_fd = open(s->bitmap_file, O_RDWR);
|
||||||
if (bitmap_fd < 0) {
|
if (bitmap_fd < 0) {
|
||||||
int major = BITMAP_MAJOR_HI;
|
int major = BITMAP_MAJOR_HI;
|
||||||
#if 0
|
#if 0
|
||||||
if (bitmap_chunk == UnSet) {
|
if (s->bitmap_chunk == UnSet) {
|
||||||
pr_err("%s cannot be openned.",
|
pr_err("%s cannot be openned.",
|
||||||
bitmap_file);
|
s->bitmap_file);
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -228,15 +226,15 @@ int Build(char *mddev, int chunk, int level, int layout,
|
||||||
" between different architectures. Consider upgrading the Linux kernel.\n");
|
" between different architectures. Consider upgrading the Linux kernel.\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
bitmapsize = size>>9; /* FIXME wrong for RAID10 */
|
bitmapsize = s->size>>9; /* FIXME wrong for RAID10 */
|
||||||
if (CreateBitmap(bitmap_file, 1, NULL, bitmap_chunk,
|
if (CreateBitmap(s->bitmap_file, 1, NULL, s->bitmap_chunk,
|
||||||
c->delay, write_behind, bitmapsize, major)) {
|
c->delay, s->write_behind, bitmapsize, major)) {
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
bitmap_fd = open(bitmap_file, O_RDWR);
|
bitmap_fd = open(s->bitmap_file, O_RDWR);
|
||||||
if (bitmap_fd < 0) {
|
if (bitmap_fd < 0) {
|
||||||
pr_err("%s cannot be openned.",
|
pr_err("%s cannot be openned.",
|
||||||
bitmap_file);
|
s->bitmap_file);
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,7 +249,7 @@ int Build(char *mddev, int chunk, int level, int layout,
|
||||||
if (ioctl(mdfd, RUN_ARRAY, ¶m)) {
|
if (ioctl(mdfd, RUN_ARRAY, ¶m)) {
|
||||||
pr_err("RUN_ARRAY failed: %s\n",
|
pr_err("RUN_ARRAY failed: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
if (chunk & (chunk-1)) {
|
if (s->chunk & (s->chunk-1)) {
|
||||||
cont_err("Problem may be that chunk size"
|
cont_err("Problem may be that chunk size"
|
||||||
" is not a power of 2\n");
|
" is not a power of 2\n");
|
||||||
}
|
}
|
||||||
|
@ -260,11 +258,11 @@ int Build(char *mddev, int chunk, int level, int layout,
|
||||||
} else {
|
} else {
|
||||||
unsigned long arg;
|
unsigned long arg;
|
||||||
arg=0;
|
arg=0;
|
||||||
while (chunk > 4096) {
|
while (s->chunk > 4096) {
|
||||||
arg++;
|
arg++;
|
||||||
chunk >>= 1;
|
s->chunk >>= 1;
|
||||||
}
|
}
|
||||||
if (level == 0)
|
if (s->level == 0)
|
||||||
arg |= 0x20000;
|
arg |= 0x20000;
|
||||||
else
|
else
|
||||||
arg |= 0x10000;
|
arg |= 0x10000;
|
||||||
|
|
5
mdadm.c
5
mdadm.c
|
@ -1309,10 +1309,7 @@ int main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rv = Build(devlist->devname, s.chunk, s.level, s.layout,
|
rv = Build(devlist->devname, devlist->next, &s, &c);
|
||||||
s.raiddisks, devlist->next, s.assume_clean,
|
|
||||||
s.bitmap_file, s.bitmap_chunk, s.write_behind,
|
|
||||||
&c, s.size);
|
|
||||||
break;
|
break;
|
||||||
case CREATE:
|
case CREATE:
|
||||||
if (c.delay == 0)
|
if (c.delay == 0)
|
||||||
|
|
7
mdadm.h
7
mdadm.h
|
@ -1113,11 +1113,8 @@ extern int Assemble(struct supertype *st, char *mddev,
|
||||||
struct mddev_dev *devlist,
|
struct mddev_dev *devlist,
|
||||||
struct context *c);
|
struct context *c);
|
||||||
|
|
||||||
extern int Build(char *mddev, int chunk, int level, int layout,
|
extern int Build(char *mddev, struct mddev_dev *devlist,
|
||||||
int raiddisks, struct mddev_dev *devlist, int assume_clean,
|
struct shape *s, struct context *c);
|
||||||
char *bitmap_file, int bitmap_chunk, int write_behind,
|
|
||||||
struct context *c, unsigned long long size);
|
|
||||||
|
|
||||||
|
|
||||||
extern int Create(struct supertype *st, char *mddev,
|
extern int Create(struct supertype *st, char *mddev,
|
||||||
int chunk, int level, int layout, unsigned long long size,
|
int chunk, int level, int layout, unsigned long long size,
|
||||||
|
|
Loading…
Reference in New Issue