Create: support --readonly flag.
Allow array to be created read-only Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
0ea8f5b167
commit
72d566f68d
19
Create.c
19
Create.c
|
@ -67,7 +67,8 @@ int Create(struct supertype *st, char *mddev,
|
||||||
int raiddisks, int sparedisks,
|
int raiddisks, int sparedisks,
|
||||||
char *name, char *homehost, int *uuid,
|
char *name, char *homehost, int *uuid,
|
||||||
int subdevs, struct mddev_dev *devlist,
|
int subdevs, struct mddev_dev *devlist,
|
||||||
int runstop, int verbose, int force, int assume_clean,
|
int runstop, int readonly, int verbose,
|
||||||
|
int force, int assume_clean,
|
||||||
char *bitmap_file, int bitmap_chunk, int write_behind,
|
char *bitmap_file, int bitmap_chunk, int write_behind,
|
||||||
int delay, int autof)
|
int delay, int autof)
|
||||||
{
|
{
|
||||||
|
@ -958,7 +959,9 @@ int Create(struct supertype *st, char *mddev,
|
||||||
case LEVEL_MULTIPATH:
|
case LEVEL_MULTIPATH:
|
||||||
case 0:
|
case 0:
|
||||||
err = sysfs_set_str(&info, NULL, "array_state",
|
err = sysfs_set_str(&info, NULL, "array_state",
|
||||||
"active");
|
readonly
|
||||||
|
? "readonly"
|
||||||
|
: "active");
|
||||||
need_mdmon = 0;
|
need_mdmon = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -973,12 +976,22 @@ int Create(struct supertype *st, char *mddev,
|
||||||
ioctl(mdfd, STOP_ARRAY, NULL);
|
ioctl(mdfd, STOP_ARRAY, NULL);
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
|
} else if (readonly &&
|
||||||
|
sysfs_attribute_available(
|
||||||
|
&info, NULL, "array_state")) {
|
||||||
|
if (sysfs_set_str(&info, NULL,
|
||||||
|
"array_state", "readonly") < 0) {
|
||||||
|
pr_err("Failed to start array: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
ioctl(mdfd, STOP_ARRAY, NULL);
|
||||||
|
goto abort;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* param is not actually used */
|
/* param is not actually used */
|
||||||
mdu_param_t param;
|
mdu_param_t param;
|
||||||
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 (info.array.chunk_size & (info.array.chunk_size-1)) {
|
if (info.array.chunk_size & (info.array.chunk_size-1)) {
|
||||||
cont_err("Problem may be that "
|
cont_err("Problem may be that "
|
||||||
"chunk size is not a power of 2\n");
|
"chunk size is not a power of 2\n");
|
||||||
|
|
3
mdadm.c
3
mdadm.c
|
@ -1373,7 +1373,8 @@ int main(int argc, char *argv[])
|
||||||
rv = Create(ss, devlist->devname, chunk, level, layout, size<0 ? 0 : size,
|
rv = Create(ss, devlist->devname, chunk, level, layout, size<0 ? 0 : size,
|
||||||
raiddisks, sparedisks, ident.name, homehost,
|
raiddisks, sparedisks, ident.name, homehost,
|
||||||
ident.uuid_set ? ident.uuid : NULL,
|
ident.uuid_set ? ident.uuid : NULL,
|
||||||
devs_found-1, devlist->next, runstop, verbose-quiet, force, assume_clean,
|
devs_found-1, devlist->next, runstop,
|
||||||
|
readonly, verbose-quiet, force, assume_clean,
|
||||||
bitmap_file, bitmap_chunk, write_behind, delay, autof);
|
bitmap_file, bitmap_chunk, write_behind, delay, autof);
|
||||||
break;
|
break;
|
||||||
case MISC:
|
case MISC:
|
||||||
|
|
6
mdadm.h
6
mdadm.h
|
@ -1085,10 +1085,12 @@ extern int Build(char *mddev, int chunk, int level, int layout,
|
||||||
|
|
||||||
|
|
||||||
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 raiddisks, int sparedisks,
|
int chunk, int level, int layout, unsigned long long size,
|
||||||
|
int raiddisks, int sparedisks,
|
||||||
char *name, char *homehost, int *uuid,
|
char *name, char *homehost, int *uuid,
|
||||||
int subdevs, struct mddev_dev *devlist,
|
int subdevs, struct mddev_dev *devlist,
|
||||||
int runstop, int verbose, int force, int assume_clean,
|
int runstop, int readonly, int verbose,
|
||||||
|
int force, int assume_clean,
|
||||||
char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof);
|
char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof);
|
||||||
|
|
||||||
extern int Detail(char *dev, int brief, int export, int test, char *homehost, char *prefer);
|
extern int Detail(char *dev, int brief, int export, int test, char *homehost, char *prefer);
|
||||||
|
|
Loading…
Reference in New Issue