Adding upstream version 4.2+20240118.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
b51ed532eb
commit
46f4ecf318
29 changed files with 158 additions and 229 deletions
|
@ -1806,12 +1806,6 @@ try_again:
|
|||
i, mddev, devices[j].devname);
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
if (!(super.disks[i].i.disk.state & (1 << MD_DISK_FAULTY))) {
|
||||
pr_err("devices %d of %s is not marked FAULTY in superblock, but cannot be found\n",
|
||||
i, mddev);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (c->force && !clean && !is_container(content->array.level) &&
|
||||
!enough(content->array.level, content->array.raid_disks,
|
||||
|
@ -2021,8 +2015,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
|
|||
if (dev)
|
||||
continue;
|
||||
/* Don't want this one any more */
|
||||
if (sysfs_set_str(sra, dev2, "slot", "none") < 0 &&
|
||||
errno == EBUSY) {
|
||||
if (sysfs_set_str(sra, dev2, "slot", STR_COMMON_NONE) < 0 && errno == EBUSY) {
|
||||
pr_err("Cannot remove old device %s: not updating %s\n", dev2->sys_name, sra->sys_name);
|
||||
sysfs_free(sra);
|
||||
return 1;
|
||||
|
|
4
Build.c
4
Build.c
|
@ -82,7 +82,7 @@ int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
|
|||
return 1;
|
||||
}
|
||||
|
||||
map_update(&map, fd2devnm(mdfd), "none", uuid, chosen_name);
|
||||
map_update(&map, fd2devnm(mdfd), STR_COMMON_NONE, uuid, chosen_name);
|
||||
map_unlock(&map);
|
||||
|
||||
array.level = s->level;
|
||||
|
@ -111,7 +111,7 @@ int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
|
|||
goto abort;
|
||||
}
|
||||
|
||||
if (s->bitmap_file && strcmp(s->bitmap_file, "none") == 0)
|
||||
if (s->bitmap_file && str_is_none(s->bitmap_file) == true)
|
||||
s->bitmap_file = NULL;
|
||||
if (s->bitmap_file && s->level <= 0) {
|
||||
pr_err("bitmaps not meaningful with level %s\n",
|
||||
|
|
2
Create.c
2
Create.c
|
@ -938,7 +938,7 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
|
|||
pr_err("automatically enabling write-intent bitmap on large array\n");
|
||||
s->bitmap_file = "internal";
|
||||
}
|
||||
if (s->bitmap_file && strcmp(s->bitmap_file, "none") == 0)
|
||||
if (s->bitmap_file && str_is_none(s->bitmap_file) == true)
|
||||
s->bitmap_file = NULL;
|
||||
|
||||
if (s->consistency_policy == CONSISTENCY_POLICY_PPL &&
|
||||
|
|
7
Detail.c
7
Detail.c
|
@ -603,13 +603,6 @@ int Detail(char *dev, struct context *c)
|
|||
}
|
||||
|
||||
if ((st && st->sb) && (info && info->reshape_active)) {
|
||||
#if 0
|
||||
This is pretty boring
|
||||
printf(" Reshape pos'n : %llu%s\n",
|
||||
(unsigned long long) info->reshape_progress << 9,
|
||||
human_size((unsigned long long)
|
||||
info->reshape_progress << 9));
|
||||
#endif
|
||||
if (info->delta_disks != 0)
|
||||
printf(" Delta Devices : %d, (%d->%d)\n",
|
||||
info->delta_disks,
|
||||
|
|
51
Grow.c
51
Grow.c
|
@ -309,7 +309,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
|
|||
return 1;
|
||||
}
|
||||
if (bmf.pathname[0]) {
|
||||
if (strcmp(s->bitmap_file,"none") == 0) {
|
||||
if (str_is_none(s->bitmap_file) == true) {
|
||||
if (ioctl(fd, SET_BITMAP_FILE, -1) != 0) {
|
||||
pr_err("failed to remove bitmap %s\n",
|
||||
bmf.pathname);
|
||||
|
@ -325,7 +325,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
|
|||
return 1;
|
||||
}
|
||||
if (array.state & (1 << MD_SB_BITMAP_PRESENT)) {
|
||||
if (strcmp(s->bitmap_file, "none")==0) {
|
||||
if (str_is_none(s->bitmap_file) == true) {
|
||||
array.state &= ~(1 << MD_SB_BITMAP_PRESENT);
|
||||
if (md_set_array_info(fd, &array) != 0) {
|
||||
if (array.state & (1 << MD_SB_CLUSTERED))
|
||||
|
@ -340,7 +340,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (strcmp(s->bitmap_file, "none") == 0) {
|
||||
if (str_is_none(s->bitmap_file) == true) {
|
||||
pr_err("no bitmap found on %s\n", devname);
|
||||
return 1;
|
||||
}
|
||||
|
@ -545,7 +545,7 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha
|
|||
char *subarray = NULL;
|
||||
int ret = 0;
|
||||
char container_dev[PATH_MAX];
|
||||
char buf[20];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (s->consistency_policy != CONSISTENCY_POLICY_RESYNC &&
|
||||
s->consistency_policy != CONSISTENCY_POLICY_PPL) {
|
||||
|
@ -594,7 +594,7 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha
|
|||
}
|
||||
|
||||
if (s->consistency_policy == CONSISTENCY_POLICY_PPL) {
|
||||
if (sysfs_get_str(sra, NULL, "sync_action", buf, 20) <= 0) {
|
||||
if (sysfs_get_str(sra, NULL, "sync_action", buf, sizeof(buf)) <= 0) {
|
||||
ret = 1;
|
||||
goto free_info;
|
||||
} else if (strcmp(buf, "reshape\n") == 0) {
|
||||
|
@ -817,12 +817,12 @@ static int freeze(struct supertype *st)
|
|||
else {
|
||||
struct mdinfo *sra = sysfs_read(-1, st->devnm, GET_VERSION);
|
||||
int err;
|
||||
char buf[20];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (!sra)
|
||||
return -1;
|
||||
/* Need to clear any 'read-auto' status */
|
||||
if (sysfs_get_str(sra, NULL, "array_state", buf, 20) > 0 &&
|
||||
if (sysfs_get_str(sra, NULL, "array_state", buf, sizeof(buf)) > 0 &&
|
||||
strncmp(buf, "read-auto", 9) == 0)
|
||||
sysfs_set_str(sra, NULL, "array_state", "clean");
|
||||
|
||||
|
@ -838,10 +838,10 @@ static void unfreeze(struct supertype *st)
|
|||
return unfreeze_container(st);
|
||||
else {
|
||||
struct mdinfo *sra = sysfs_read(-1, st->devnm, GET_VERSION);
|
||||
char buf[20];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (sra &&
|
||||
sysfs_get_str(sra, NULL, "sync_action", buf, 20) > 0 &&
|
||||
sysfs_get_str(sra, NULL, "sync_action", buf, sizeof(buf)) > 0 &&
|
||||
strcmp(buf, "frozen\n") == 0)
|
||||
sysfs_set_str(sra, NULL, "sync_action", "idle");
|
||||
sysfs_free(sra);
|
||||
|
@ -851,12 +851,12 @@ static void unfreeze(struct supertype *st)
|
|||
static void wait_reshape(struct mdinfo *sra)
|
||||
{
|
||||
int fd = sysfs_get_fd(sra, NULL, "sync_action");
|
||||
char action[20];
|
||||
char action[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (fd < 0)
|
||||
return;
|
||||
|
||||
while (sysfs_fd_get_str(fd, action, 20) > 0 &&
|
||||
while (sysfs_fd_get_str(fd, action, sizeof(action)) > 0 &&
|
||||
strncmp(action, "reshape", 7) == 0)
|
||||
sysfs_wait(fd, NULL);
|
||||
close(fd);
|
||||
|
@ -902,7 +902,7 @@ static int subarray_set_num(char *container, struct mdinfo *sra, char *name, int
|
|||
* to close a race with the array_state going clean before the
|
||||
* next write to raid_disks / stripe_cache_size
|
||||
*/
|
||||
char safe[50];
|
||||
char safe[SYSFS_MAX_BUF_SIZE];
|
||||
int rc;
|
||||
|
||||
/* only 'raid_disks' and 'stripe_cache_size' trigger md_allow_write */
|
||||
|
@ -1067,7 +1067,7 @@ int remove_disks_for_takeover(struct supertype *st,
|
|||
remaining = sd->next;
|
||||
|
||||
sysfs_set_str(sra, sd, "state", "faulty");
|
||||
sysfs_set_str(sra, sd, "slot", "none");
|
||||
sysfs_set_str(sra, sd, "slot", STR_COMMON_NONE);
|
||||
/* for external metadata disks should be removed in mdmon */
|
||||
if (!st->ss->external)
|
||||
sysfs_set_str(sra, sd, "state", "remove");
|
||||
|
@ -2145,8 +2145,7 @@ size_change_error:
|
|||
* a backport has been arranged.
|
||||
*/
|
||||
if (sra == NULL ||
|
||||
sysfs_set_str(sra, NULL, "resync_start",
|
||||
"none") < 0)
|
||||
sysfs_set_str(sra, NULL, "resync_start", STR_COMMON_NONE) < 0)
|
||||
pr_err("--assume-clean not supported with --grow on this kernel\n");
|
||||
}
|
||||
md_get_array_info(fd, &array);
|
||||
|
@ -2396,11 +2395,11 @@ release:
|
|||
static int verify_reshape_position(struct mdinfo *info, int level)
|
||||
{
|
||||
int ret_val = 0;
|
||||
char buf[40];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int rv;
|
||||
|
||||
/* read sync_max, failure can mean raid0 array */
|
||||
rv = sysfs_get_str(info, NULL, "sync_max", buf, 40);
|
||||
rv = sysfs_get_str(info, NULL, "sync_max", buf, sizeof(buf));
|
||||
|
||||
if (rv > 0) {
|
||||
char *ep;
|
||||
|
@ -3040,7 +3039,7 @@ static int reshape_array(char *container, int fd, char *devname,
|
|||
unsigned long long array_size;
|
||||
int done;
|
||||
struct mdinfo *sra = NULL;
|
||||
char buf[20];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
/* when reshaping a RAID0, the component_size might be zero.
|
||||
* So try to fix that up.
|
||||
|
@ -3916,7 +3915,7 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
|
|||
unsigned long long array_size = (info->component_size
|
||||
* reshape->before.data_disks);
|
||||
int fd;
|
||||
char buf[20];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
/* First, we unsuspend any region that is now known to be safe.
|
||||
* If suspend_point is on the 'wrong' side of reshape_progress, then
|
||||
|
@ -4094,8 +4093,8 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
|
|||
/* Check that sync_action is still 'reshape' to avoid
|
||||
* waiting forever on a dead array
|
||||
*/
|
||||
char action[20];
|
||||
if (sysfs_get_str(info, NULL, "sync_action", action, 20) <= 0 ||
|
||||
char action[SYSFS_MAX_BUF_SIZE];
|
||||
if (sysfs_get_str(info, NULL, "sync_action", action, sizeof(action)) <= 0 ||
|
||||
strncmp(action, "reshape", 7) != 0)
|
||||
break;
|
||||
/* Some kernels reset 'sync_completed' to zero
|
||||
|
@ -4121,8 +4120,8 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
|
|||
*/
|
||||
if (completed == 0) {
|
||||
unsigned long long reshapep;
|
||||
char action[20];
|
||||
if (sysfs_get_str(info, NULL, "sync_action", action, 20) > 0 &&
|
||||
char action[SYSFS_MAX_BUF_SIZE];
|
||||
if (sysfs_get_str(info, NULL, "sync_action", action, sizeof(action)) > 0 &&
|
||||
strncmp(action, "idle", 4) == 0 &&
|
||||
sysfs_get_ll(info, NULL,
|
||||
"reshape_position", &reshapep) == 0)
|
||||
|
@ -4159,8 +4158,8 @@ check_progress:
|
|||
* it was just a device failure that leaves us degraded but
|
||||
* functioning.
|
||||
*/
|
||||
if (sysfs_get_str(info, NULL, "reshape_position", buf,
|
||||
sizeof(buf)) < 0 || strncmp(buf, "none", 4) != 0) {
|
||||
if (sysfs_get_str(info, NULL, "reshape_position", buf, sizeof(buf)) < 0 ||
|
||||
str_is_none(buf) == false) {
|
||||
/* The abort might only be temporary. Wait up to 10
|
||||
* seconds for fd to contain a valid number again.
|
||||
*/
|
||||
|
@ -4240,7 +4239,7 @@ static int grow_backup(struct mdinfo *sra,
|
|||
if (sd->disk.state & (1<<MD_DISK_FAULTY))
|
||||
continue;
|
||||
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
||||
char sbuf[100];
|
||||
char sbuf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (sysfs_get_str(sra, sd, "state",
|
||||
sbuf, sizeof(sbuf)) < 0 ||
|
||||
|
|
|
@ -670,7 +670,7 @@ static void find_reject(int mdfd, struct supertype *st, struct mdinfo *sra,
|
|||
continue;
|
||||
|
||||
if (d->disk.raid_disk > -1)
|
||||
sysfs_set_str(sra, d, "slot", "none");
|
||||
sysfs_set_str(sra, d, "slot", STR_COMMON_NONE);
|
||||
if (sysfs_set_str(sra, d, "state", "remove") == 0)
|
||||
if (verbose >= 0)
|
||||
pr_err("removing old device %s from %s\n",
|
||||
|
@ -1650,7 +1650,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
|
|||
struct mdstat_ent *ent;
|
||||
struct mddev_dev devlist;
|
||||
struct mdinfo mdi;
|
||||
char buf[32];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (!id_path)
|
||||
dprintf("incremental removal without --path <id_path> lacks the possibility to re-add new device in this port\n");
|
||||
|
|
13
Manage.c
13
Manage.c
|
@ -181,7 +181,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
|||
char container[32];
|
||||
int err;
|
||||
int count;
|
||||
char buf[32];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
unsigned long long rd1, rd2;
|
||||
|
||||
if (will_retry && verbose == 0)
|
||||
|
@ -312,7 +312,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
|||
if (mdi && is_level456(mdi->array.level) &&
|
||||
sysfs_attribute_available(mdi, NULL, "sync_action") &&
|
||||
sysfs_attribute_available(mdi, NULL, "reshape_direction") &&
|
||||
sysfs_get_str(mdi, NULL, "sync_action", buf, 20) > 0 &&
|
||||
sysfs_get_str(mdi, NULL, "sync_action", buf, sizeof(buf)) > 0 &&
|
||||
strcmp(buf, "reshape\n") == 0 &&
|
||||
sysfs_get_two(mdi, NULL, "raid_disks", &rd1, &rd2) == 2) {
|
||||
unsigned long long position, curr;
|
||||
|
@ -402,7 +402,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
|||
unsigned long long max_completed;
|
||||
sysfs_get_ll(mdi, NULL, "reshape_position", &curr);
|
||||
sysfs_fd_get_str(scfd, buf, sizeof(buf));
|
||||
if (strncmp(buf, "none", 4) == 0) {
|
||||
if (str_is_none(buf) == true) {
|
||||
/* Either reshape has aborted, or hasn't
|
||||
* quite started yet. Wait a bit and
|
||||
* check 'sync_action' to see.
|
||||
|
@ -1519,8 +1519,8 @@ int Manage_subdevs(char *devname, int fd,
|
|||
sprintf(dname, "dev-%s", dv->devname);
|
||||
sysfd = sysfs_open(fd2devnm(fd), dname, "block/dev");
|
||||
if (sysfd >= 0) {
|
||||
char dn[20];
|
||||
if (sysfs_fd_get_str(sysfd, dn, 20) > 0 &&
|
||||
char dn[SYSFS_MAX_BUF_SIZE];
|
||||
if (sysfs_fd_get_str(sysfd, dn, sizeof(dn)) > 0 &&
|
||||
sscanf(dn, "%d:%d", &mj,&mn) == 2) {
|
||||
rdev = makedev(mj,mn);
|
||||
found = 1;
|
||||
|
@ -1749,6 +1749,7 @@ int Update_subarray(char *dev, char *subarray, enum update_opt update,
|
|||
int fd, rv = 2;
|
||||
struct mdinfo *info = NULL;
|
||||
char *update_verb = map_num(update_options, update);
|
||||
bool allow_active = update == UOPT_PPL || update == UOPT_NO_PPL;
|
||||
|
||||
memset(st, 0, sizeof(*st));
|
||||
|
||||
|
@ -1763,7 +1764,7 @@ int Update_subarray(char *dev, char *subarray, enum update_opt update,
|
|||
goto free_super;
|
||||
}
|
||||
|
||||
if (is_subarray_active(subarray, st->devnm)) {
|
||||
if (!allow_active && is_subarray_active(subarray, st->devnm)) {
|
||||
if (verbose >= 0)
|
||||
pr_err("Subarray %s in %s is active, cannot update %s\n",
|
||||
subarray, dev, update_verb);
|
||||
|
|
|
@ -1309,12 +1309,12 @@ int Wait(char *dev)
|
|||
* sync_action does.
|
||||
*/
|
||||
struct mdinfo mdi;
|
||||
char buf[21];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (sysfs_init(&mdi, -1, devnm))
|
||||
return 2;
|
||||
if (sysfs_get_str(&mdi, NULL, "sync_action",
|
||||
buf, 20) > 0 &&
|
||||
buf, sizeof(buf)) > 0 &&
|
||||
strcmp(buf,"idle\n") != 0) {
|
||||
e->percent = RESYNC_UNKNOWN;
|
||||
if (strcmp(buf, "frozen\n") == 0) {
|
||||
|
@ -1393,7 +1393,7 @@ int WaitClean(char *dev, int verbose)
|
|||
|
||||
if (rv) {
|
||||
int state_fd = sysfs_open(fd2devnm(fd), NULL, "array_state");
|
||||
char buf[20];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int delay = 5000;
|
||||
|
||||
/* minimize the safe_mode_delay and prepare to wait up to 5s
|
||||
|
|
2
config.c
2
config.c
|
@ -998,7 +998,7 @@ void load_conffile(void)
|
|||
dl_add(list, dl_strdup("partitions"));
|
||||
devline(list);
|
||||
free_line(list);
|
||||
} else if (strcmp(conffile, "none") != 0) {
|
||||
} else if (str_is_none(conffile) == false) {
|
||||
f = fopen(conffile, "r");
|
||||
/* Debian chose to relocate mdadm.conf into /etc/mdadm/.
|
||||
* To allow Debian users to compile from clean source and still
|
||||
|
|
|
@ -454,7 +454,7 @@ static void manage_member(struct mdstat_ent *mdstat,
|
|||
* trying to find and assign a spare.
|
||||
* We do that whenever the monitor tells us too.
|
||||
*/
|
||||
char buf[64];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int frozen;
|
||||
struct supertype *container = a->container;
|
||||
struct mdinfo *mdi;
|
||||
|
@ -664,7 +664,7 @@ static void manage_new(struct mdstat_ent *mdstat,
|
|||
struct mdinfo *mdi = NULL, *di;
|
||||
int i, inst;
|
||||
int failed = 0;
|
||||
char buf[40];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
/* check if array is ready to be monitored */
|
||||
if (!mdstat->active || !mdstat->level)
|
||||
|
@ -738,7 +738,7 @@ static void manage_new(struct mdstat_ent *mdstat,
|
|||
* read this information for new arrays only (empty victim)
|
||||
*/
|
||||
if ((victim == NULL) &&
|
||||
(sysfs_get_str(mdi, NULL, "sync_action", buf, 40) > 0) &&
|
||||
(sysfs_get_str(mdi, NULL, "sync_action", buf, sizeof(buf)) > 0) &&
|
||||
(strncmp(buf, "reshape", 7) == 0)) {
|
||||
if (sysfs_get_ll(mdi, NULL, "reshape_position",
|
||||
&new->last_checkpoint) != 0)
|
||||
|
|
4
maps.c
4
maps.c
|
@ -137,14 +137,14 @@ mapping_t faultylayout[] = {
|
|||
|
||||
{ "clear", ClearErrors},
|
||||
{ "flush", ClearFaults},
|
||||
{ "none", ClearErrors},
|
||||
{ STR_COMMON_NONE, ClearErrors},
|
||||
{ "default", ClearErrors},
|
||||
{ NULL, UnSet }
|
||||
};
|
||||
|
||||
mapping_t consistency_policies[] = {
|
||||
{ "unknown", CONSISTENCY_POLICY_UNKNOWN},
|
||||
{ "none", CONSISTENCY_POLICY_NONE},
|
||||
{ STR_COMMON_NONE, CONSISTENCY_POLICY_NONE},
|
||||
{ "resync", CONSISTENCY_POLICY_RESYNC},
|
||||
{ "bitmap", CONSISTENCY_POLICY_BITMAP},
|
||||
{ "journal", CONSISTENCY_POLICY_JOURNAL},
|
||||
|
|
7
mdadm.c
7
mdadm.c
|
@ -1099,7 +1099,7 @@ int main(int argc, char *argv[])
|
|||
exit(2);
|
||||
}
|
||||
if (strcmp(optarg, "internal") == 0 ||
|
||||
strcmp(optarg, "none") == 0 ||
|
||||
strcmp(optarg, STR_COMMON_NONE) == 0 ||
|
||||
strchr(optarg, '/') != NULL) {
|
||||
s.bitmap_file = optarg;
|
||||
continue;
|
||||
|
@ -1234,13 +1234,12 @@ int main(int argc, char *argv[])
|
|||
pr_err("PPL consistency policy is only supported for RAID level 5.\n");
|
||||
exit(2);
|
||||
} else if (s.consistency_policy == CONSISTENCY_POLICY_BITMAP &&
|
||||
(!s.bitmap_file ||
|
||||
strcmp(s.bitmap_file, "none") == 0)) {
|
||||
(!s.bitmap_file || str_is_none(s.bitmap_file) == true)) {
|
||||
pr_err("--bitmap is required for consistency policy: %s\n",
|
||||
map_num_s(consistency_policies, s.consistency_policy));
|
||||
exit(2);
|
||||
} else if (s.bitmap_file &&
|
||||
strcmp(s.bitmap_file, "none") != 0 &&
|
||||
str_is_none(s.bitmap_file) == false &&
|
||||
s.consistency_policy != CONSISTENCY_POLICY_BITMAP &&
|
||||
s.consistency_policy != CONSISTENCY_POLICY_JOURNAL) {
|
||||
pr_err("--bitmap is not compatible with consistency policy: %s\n",
|
||||
|
|
18
mdadm.h
18
mdadm.h
|
@ -767,6 +767,8 @@ enum sysfs_read_flags {
|
|||
GET_DEVS_ALL = (1 << 27),
|
||||
};
|
||||
|
||||
#define SYSFS_MAX_BUF_SIZE 64
|
||||
|
||||
/* If fd >= 0, get the array it is open on,
|
||||
* else use devnm.
|
||||
*/
|
||||
|
@ -2025,3 +2027,19 @@ static inline int is_container(const int level)
|
|||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define STR_COMMON_NONE "none"
|
||||
|
||||
/**
|
||||
* str_is_none() - check if @str starts with "none".
|
||||
* @str: string
|
||||
*
|
||||
* return:
|
||||
* true if string starts with "none", false otherwise.
|
||||
*/
|
||||
static inline bool str_is_none(char *str)
|
||||
{
|
||||
if (strncmp(str, STR_COMMON_NONE, sizeof(STR_COMMON_NONE) - 1) == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
24
monitor.c
24
monitor.c
|
@ -81,15 +81,15 @@ static int read_attr(char *buf, int len, int fd)
|
|||
|
||||
static void read_resync_start(int fd, unsigned long long *v)
|
||||
{
|
||||
char buf[30];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int n;
|
||||
|
||||
n = read_attr(buf, 30, fd);
|
||||
n = read_attr(buf, sizeof(buf), fd);
|
||||
if (n <= 0) {
|
||||
dprintf("Failed to read resync_start (%d)\n", fd);
|
||||
return;
|
||||
}
|
||||
if (strncmp(buf, "none", 4) == 0)
|
||||
if (str_is_none(buf) == true)
|
||||
*v = MaxSector;
|
||||
else
|
||||
*v = strtoull(buf, NULL, 10);
|
||||
|
@ -98,11 +98,11 @@ static void read_resync_start(int fd, unsigned long long *v)
|
|||
static unsigned long long read_sync_completed(int fd)
|
||||
{
|
||||
unsigned long long val;
|
||||
char buf[50];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int n;
|
||||
char *ep;
|
||||
|
||||
n = read_attr(buf, 50, fd);
|
||||
n = read_attr(buf, sizeof(buf), fd);
|
||||
|
||||
if (n <= 0)
|
||||
return 0;
|
||||
|
@ -115,8 +115,8 @@ static unsigned long long read_sync_completed(int fd)
|
|||
|
||||
static enum array_state read_state(int fd)
|
||||
{
|
||||
char buf[20];
|
||||
int n = read_attr(buf, 20, fd);
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int n = read_attr(buf, sizeof(buf), fd);
|
||||
|
||||
if (n <= 0)
|
||||
return bad_word;
|
||||
|
@ -125,8 +125,8 @@ static enum array_state read_state(int fd)
|
|||
|
||||
static enum sync_action read_action( int fd)
|
||||
{
|
||||
char buf[20];
|
||||
int n = read_attr(buf, 20, fd);
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int n = read_attr(buf, sizeof(buf), fd);
|
||||
|
||||
if (n <= 0)
|
||||
return bad_action;
|
||||
|
@ -135,7 +135,7 @@ static enum sync_action read_action( int fd)
|
|||
|
||||
int read_dev_state(int fd)
|
||||
{
|
||||
char buf[100];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int n = read_attr(buf, sizeof(buf), fd);
|
||||
char *cp;
|
||||
int rv = 0;
|
||||
|
@ -595,12 +595,12 @@ static int read_and_act(struct active_array *a, fd_set *fds)
|
|||
*/
|
||||
if ((a->curr_action != reshape) &&
|
||||
(a->prev_action == reshape)) {
|
||||
char buf[40];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
if ((sysfs_get_str(&a->info, NULL,
|
||||
"reshape_position",
|
||||
buf,
|
||||
sizeof(buf)) >= 0) &&
|
||||
strncmp(buf, "none", 4) == 0)
|
||||
str_is_none(buf) == true)
|
||||
a->last_checkpoint = a->info.component_size;
|
||||
}
|
||||
a->container->ss->set_array_state(a, a->curr_state <= clean);
|
||||
|
|
4
msg.c
4
msg.c
|
@ -324,7 +324,7 @@ int block_monitor(char *container, const int freeze)
|
|||
{
|
||||
struct mdstat_ent *ent, *e, *e2;
|
||||
struct mdinfo *sra = NULL;
|
||||
char buf[64];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
int rv = 0;
|
||||
|
||||
if (check_mdmon_version(container))
|
||||
|
@ -366,7 +366,7 @@ int block_monitor(char *container, const int freeze)
|
|||
!sysfs_attribute_available(sra, NULL, "sync_action")) ||
|
||||
(freeze &&
|
||||
sysfs_attribute_available(sra, NULL, "sync_action") &&
|
||||
sysfs_get_str(sra, NULL, "sync_action", buf, 20) > 0 &&
|
||||
sysfs_get_str(sra, NULL, "sync_action", buf, sizeof(buf)) > 0 &&
|
||||
strcmp(buf, "frozen\n") == 0))
|
||||
/* pass */;
|
||||
else {
|
||||
|
|
|
@ -1825,7 +1825,7 @@ static void print_imsm_dev(struct intel_super *super,
|
|||
printf("\n");
|
||||
printf(" Failed disk : ");
|
||||
if (map->failed_disk_num == 0xff)
|
||||
printf("none");
|
||||
printf(STR_COMMON_NONE);
|
||||
else
|
||||
printf("%i", map->failed_disk_num);
|
||||
printf("\n");
|
||||
|
@ -2976,34 +2976,6 @@ static void uuid_from_super_imsm(struct supertype *st, int uuid[4])
|
|||
memcpy(uuid, buf, 4*4);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
get_imsm_numerical_version(struct imsm_super *mpb, int *m, int *p)
|
||||
{
|
||||
__u8 *v = get_imsm_version(mpb);
|
||||
__u8 *end = mpb->sig + MAX_SIGNATURE_LENGTH;
|
||||
char major[] = { 0, 0, 0 };
|
||||
char minor[] = { 0 ,0, 0 };
|
||||
char patch[] = { 0, 0, 0 };
|
||||
char *ver_parse[] = { major, minor, patch };
|
||||
int i, j;
|
||||
|
||||
i = j = 0;
|
||||
while (*v != '\0' && v < end) {
|
||||
if (*v != '.' && j < 2)
|
||||
ver_parse[i][j++] = *v;
|
||||
else {
|
||||
i++;
|
||||
j = 0;
|
||||
}
|
||||
v++;
|
||||
}
|
||||
|
||||
*m = strtol(minor, NULL, 0);
|
||||
*p = strtol(patch, NULL, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
static __u32 migr_strip_blocks_resync(struct imsm_dev *dev)
|
||||
{
|
||||
/* migr_strip_size when repairing or initializing parity */
|
||||
|
@ -8706,23 +8678,6 @@ static int imsm_set_array_state(struct active_array *a, int consistent)
|
|||
/* still reshaping, maybe update vol_curr_migr_unit */
|
||||
goto mark_checkpoint;
|
||||
} else {
|
||||
if (a->last_checkpoint == 0 && a->prev_action == reshape) {
|
||||
/* for some reason we aborted the reshape.
|
||||
*
|
||||
* disable automatic metadata rollback
|
||||
* user action is required to recover process
|
||||
*/
|
||||
if (0) {
|
||||
struct imsm_map *map2 =
|
||||
get_imsm_map(dev, MAP_1);
|
||||
dev->vol.migr_state = 0;
|
||||
set_migr_type(dev, 0);
|
||||
set_vol_curr_migr_unit(dev, 0);
|
||||
memcpy(map, map2,
|
||||
sizeof_imsm_map(map2));
|
||||
super->updates_pending++;
|
||||
}
|
||||
}
|
||||
if (a->last_checkpoint >= a->info.component_size) {
|
||||
unsigned long long array_blocks;
|
||||
int used_disks;
|
||||
|
@ -11184,11 +11139,11 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
|
|||
unsigned int sector_size = super->sector_size;
|
||||
unsigned long long curr_migr_unit = current_migr_unit(migr_rec);
|
||||
unsigned long long num_migr_units = get_num_migr_units(migr_rec);
|
||||
char buffer[20];
|
||||
char buffer[SYSFS_MAX_BUF_SIZE];
|
||||
int skipped_disks = 0;
|
||||
struct dl *dl_disk;
|
||||
|
||||
err = sysfs_get_str(info, NULL, "array_state", (char *)buffer, 20);
|
||||
err = sysfs_get_str(info, NULL, "array_state", (char *)buffer, sizeof(buffer));
|
||||
if (err < 1)
|
||||
return 1;
|
||||
|
||||
|
@ -12107,14 +12062,14 @@ exit_imsm_reshape_super:
|
|||
static int read_completed(int fd, unsigned long long *val)
|
||||
{
|
||||
int ret;
|
||||
char buf[50];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
ret = sysfs_fd_get_str(fd, buf, 50);
|
||||
ret = sysfs_fd_get_str(fd, buf, sizeof(buf));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = COMPLETED_OK;
|
||||
if (strncmp(buf, "none", 4) == 0) {
|
||||
if (str_is_none(buf) == true) {
|
||||
ret = COMPLETED_NONE;
|
||||
} else if (strncmp(buf, "delayed", 7) == 0) {
|
||||
ret = COMPLETED_DELAYED;
|
||||
|
@ -12182,12 +12137,12 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
|||
|
||||
do {
|
||||
int rc;
|
||||
char action[20];
|
||||
char action[SYSFS_MAX_BUF_SIZE];
|
||||
int timeout = 3000;
|
||||
|
||||
sysfs_wait(fd, &timeout);
|
||||
if (sysfs_get_str(sra, NULL, "sync_action",
|
||||
action, 20) > 0 &&
|
||||
action, sizeof(action)) > 0 &&
|
||||
strncmp(action, "reshape", 7) != 0) {
|
||||
if (strncmp(action, "idle", 4) == 0)
|
||||
break;
|
||||
|
@ -12234,7 +12189,7 @@ int check_degradation_change(struct mdinfo *info,
|
|||
if (sd->disk.state & (1<<MD_DISK_FAULTY))
|
||||
continue;
|
||||
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
||||
char sbuf[100];
|
||||
char sbuf[SYSFS_MAX_BUF_SIZE];
|
||||
int raid_disk = sd->disk.raid_disk;
|
||||
|
||||
if (sysfs_get_str(info,
|
||||
|
|
20
super1.c
20
super1.c
|
@ -544,26 +544,6 @@ static void examine_super1(struct supertype *st, char *homehost)
|
|||
break;
|
||||
}
|
||||
printf("\n");
|
||||
#if 0
|
||||
/* This turns out to just be confusing */
|
||||
printf(" Array Slot : %d (", __le32_to_cpu(sb->dev_number));
|
||||
for (i = __le32_to_cpu(sb->max_dev); i > 0 ; i--)
|
||||
if (__le16_to_cpu(sb->dev_roles[i-1]) != MD_DISK_ROLE_SPARE)
|
||||
break;
|
||||
for (d = 0; d < i; d++) {
|
||||
int role = __le16_to_cpu(sb->dev_roles[d]);
|
||||
if (d)
|
||||
printf(", ");
|
||||
if (role == MD_DISK_ROLE_SPARE)
|
||||
printf("empty");
|
||||
else
|
||||
if(role == MD_DISK_ROLE_FAULTY)
|
||||
printf("failed");
|
||||
else
|
||||
printf("%d", role);
|
||||
}
|
||||
printf(")\n");
|
||||
#endif
|
||||
printf(" Device Role : ");
|
||||
role = role_from_sb(sb);
|
||||
if (role >= MD_DISK_ROLE_FAULTY)
|
||||
|
|
78
sysfs.c
78
sysfs.c
|
@ -148,7 +148,7 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options)
|
|||
strcpy(base, "metadata_version");
|
||||
if (load_sys(fname, buf, sizeof(buf)))
|
||||
goto abort;
|
||||
if (strncmp(buf, "none", 4) == 0) {
|
||||
if (str_is_none(buf) == true) {
|
||||
sra->array.major_version =
|
||||
sra->array.minor_version = -1;
|
||||
strcpy(sra->text_version, "");
|
||||
|
@ -244,7 +244,7 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options)
|
|||
goto abort;
|
||||
if (strncmp(buf, "file", 4) == 0)
|
||||
sra->bitmap_offset = 1;
|
||||
else if (strncmp(buf, "none", 4) == 0)
|
||||
else if (str_is_none(buf) == true)
|
||||
sra->bitmap_offset = 0;
|
||||
else if (buf[0] == '+')
|
||||
sra->bitmap_offset = strtol(buf+1, NULL, 10);
|
||||
|
@ -664,7 +664,7 @@ int sysfs_set_array(struct mdinfo *info, int vers)
|
|||
ver[0] = 0;
|
||||
if (info->array.major_version == -1 &&
|
||||
info->array.minor_version == -2) {
|
||||
char buf[1024];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
strcat(strcpy(ver, "external:"), info->text_version);
|
||||
|
||||
|
@ -675,7 +675,7 @@ int sysfs_set_array(struct mdinfo *info, int vers)
|
|||
* version first, and preserve the flag
|
||||
*/
|
||||
if (sysfs_get_str(info, NULL, "metadata_version",
|
||||
buf, 1024) > 0)
|
||||
buf, sizeof(buf)) > 0)
|
||||
if (strlen(buf) >= 9 && buf[9] == '-')
|
||||
ver[9] = '-';
|
||||
|
||||
|
@ -803,72 +803,6 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume)
|
|||
return rv;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int sysfs_disk_to_sg(int fd)
|
||||
{
|
||||
/* from an open block device, try find and open its corresponding
|
||||
* scsi_generic interface
|
||||
*/
|
||||
struct stat st;
|
||||
char path[256];
|
||||
char sg_path[256];
|
||||
char sg_major_minor[10];
|
||||
char *c;
|
||||
DIR *dir;
|
||||
struct dirent *de;
|
||||
int major, minor, rv;
|
||||
|
||||
if (fstat(fd, &st))
|
||||
return -1;
|
||||
|
||||
snprintf(path, sizeof(path), "/sys/dev/block/%d:%d/device",
|
||||
major(st.st_rdev), minor(st.st_rdev));
|
||||
|
||||
dir = opendir(path);
|
||||
if (!dir)
|
||||
return -1;
|
||||
|
||||
de = readdir(dir);
|
||||
while (de) {
|
||||
if (strncmp("scsi_generic:", de->d_name,
|
||||
strlen("scsi_generic:")) == 0)
|
||||
break;
|
||||
de = readdir(dir);
|
||||
}
|
||||
closedir(dir);
|
||||
|
||||
if (!de)
|
||||
return -1;
|
||||
|
||||
snprintf(sg_path, sizeof(sg_path), "%s/%s/dev", path, de->d_name);
|
||||
fd = open(sg_path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
rv = read(fd, sg_major_minor, sizeof(sg_major_minor));
|
||||
close(fd);
|
||||
if (rv < 0 || rv == sizeof(sg_major_minor))
|
||||
return -1;
|
||||
else
|
||||
sg_major_minor[rv - 1] = '\0';
|
||||
|
||||
c = strchr(sg_major_minor, ':');
|
||||
*c = '\0';
|
||||
c++;
|
||||
major = strtol(sg_major_minor, NULL, 10);
|
||||
minor = strtol(c, NULL, 10);
|
||||
snprintf(path, sizeof(path), "/dev/.tmp.md.%d:%d:%d",
|
||||
(int) getpid(), major, minor);
|
||||
if (mknod(path, S_IFCHR|0600, makedev(major, minor))==0) {
|
||||
fd = open(path, O_RDONLY);
|
||||
unlink(path);
|
||||
return fd;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
int sysfs_disk_to_scsi_id(int fd, __u32 *id)
|
||||
{
|
||||
/* from an open block device, try to retrieve it scsi_id */
|
||||
|
@ -966,11 +900,11 @@ int sysfs_freeze_array(struct mdinfo *sra)
|
|||
* return 0 if this kernel doesn't support 'frozen'
|
||||
* return 1 if it worked.
|
||||
*/
|
||||
char buf[20];
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (!sysfs_attribute_available(sra, NULL, "sync_action"))
|
||||
return 1; /* no sync_action == frozen */
|
||||
if (sysfs_get_str(sra, NULL, "sync_action", buf, 20) <= 0)
|
||||
if (sysfs_get_str(sra, NULL, "sync_action", buf, sizeof(buf)) <= 0)
|
||||
return 0;
|
||||
if (strcmp(buf, "frozen\n") == 0)
|
||||
/* Already frozen */
|
||||
|
|
4
test
4
test
|
@ -140,6 +140,7 @@ do_help() {
|
|||
--raidtype= raid0|linear|raid1|raid456|raid10|ddf|imsm
|
||||
--disable-multipath Disable any tests involving multipath
|
||||
--disable-integrity Disable slow tests of RAID[56] consistency
|
||||
--disable-linear Disable any tests involving linear
|
||||
--logdir=directory Directory to save all logfiles in
|
||||
--save-logs Usually use with --logdir together
|
||||
--keep-going | --no-error Don't stop on error, ie. run all tests
|
||||
|
@ -255,6 +256,9 @@ parse_args() {
|
|||
--disable-integrity )
|
||||
unset INTEGRITY
|
||||
;;
|
||||
--disable-linear )
|
||||
unset LINEAR
|
||||
;;
|
||||
--dev=* )
|
||||
case ${i##*=} in
|
||||
loop )
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
|
||||
# create a simple linear
|
||||
|
||||
if [ "$LINEAR" != "yes" ]; then
|
||||
echo -ne 'skipping... '
|
||||
exit 0
|
||||
fi
|
||||
|
||||
mdadm -CR $md0 -l linear -n3 $dev0 $dev1 $dev2
|
||||
check linear
|
||||
testdev $md0 3 $mdsize2_l 1
|
||||
|
|
|
@ -4,7 +4,13 @@ set -x -e
|
|||
conf=$targetdir/mdadm.conf
|
||||
echo "CREATE names=yes" > $conf
|
||||
|
||||
for i in linear raid0 raid1 raid4 raid5 raid6
|
||||
levels=(raid0 raid1 raid4 raid5 raid6)
|
||||
|
||||
if [ "$LINEAR" == "yes" ]; then
|
||||
levels+=( linear )
|
||||
fi
|
||||
|
||||
for i in ${levels[@]}
|
||||
do
|
||||
mdadm -CR --config $conf /dev/md/$i -l $i -n 4 $dev4 $dev3 $dev2 $dev1
|
||||
check $i
|
||||
|
|
|
@ -16,6 +16,10 @@ check raid0
|
|||
testdev $md0 5 $size 512
|
||||
mdadm -S $md0
|
||||
|
||||
if [ "$LINEAR" != "yes" ]; then
|
||||
echo -ne 'skipping... '
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# now same again with different chunk size
|
||||
for chunk in 4 32 256
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
levels=(raid0 raid1 raid4 raid5 raid6 raid10)
|
||||
|
||||
if [ "$LINEAR" == "yes" ]; then
|
||||
levels+=( linear )
|
||||
fi
|
||||
|
||||
for metadata in 0.9 1.0 1.1 1.2
|
||||
do
|
||||
for level in linear raid0 raid1 raid4 raid5 raid6 raid10
|
||||
for level in ${levels[@]}
|
||||
do
|
||||
if [[ $metadata == "0.9" && $level == "raid0" ]];
|
||||
then
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
|
||||
# create a liner array, and add more drives to to.
|
||||
|
||||
if [ "$LINEAR" != "yes" ]; then
|
||||
echo -ne 'skipping... '
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for e in 0.90 1 1.1 1.2
|
||||
do
|
||||
case $e in
|
||||
|
|
|
@ -6,7 +6,13 @@ set -x -e
|
|||
# Here just test that a partly "-I" assembled array can
|
||||
# be completed with "-A"
|
||||
|
||||
for l in 0 1 5 linear
|
||||
levels=(raid0 raid1 raid5)
|
||||
|
||||
if [ "$LINEAR" == "yes" ]; then
|
||||
levels+=( linear )
|
||||
fi
|
||||
|
||||
for l in ${levels[@]}
|
||||
do
|
||||
mdadm -CR $md0 -l $l -n5 $dev0 $dev1 $dev2 $dev3 $dev4 --assume-clean
|
||||
mdadm -S md0
|
||||
|
|
|
@ -64,6 +64,10 @@ mdadm --assemble --scan --config=$conf $md2
|
|||
$tst
|
||||
mdadm -S $md2
|
||||
|
||||
if [ "$LINEAR" != "yes" ]; then
|
||||
echo -ne 'skipping... '
|
||||
exit 0
|
||||
fi
|
||||
|
||||
### Now for version 0...
|
||||
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
|
||||
# create a raid0, re-assemble with a different super-minor
|
||||
|
||||
if [ "$LINEAR" != "yes" ]; then
|
||||
echo -ne 'skipping... '
|
||||
exit 0
|
||||
fi
|
||||
|
||||
mdadm -CR -e 0.90 $md0 -llinear -n3 $dev0 $dev1 $dev2
|
||||
testdev $md0 3 $mdsize0 1
|
||||
minor1=`mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'`
|
||||
|
|
|
@ -123,6 +123,17 @@ check_env() {
|
|||
modprobe multipath 2> /dev/null
|
||||
grep -sq 'Personalities : .*multipath' /proc/mdstat &&
|
||||
MULTIPATH="yes"
|
||||
if [ "$MULTIPATH" != "yes" ]; then
|
||||
echo "test: skipping tests for multipath, which is removed in upstream 6.8+ kernels"
|
||||
fi
|
||||
|
||||
# Check whether to run linear tests
|
||||
modprobe linear 2> /dev/null
|
||||
grep -sq 'Personalities : .*linear' /proc/mdstat &&
|
||||
LINEAR="yes"
|
||||
if [ "$LINEAR" != "yes" ]; then
|
||||
echo "test: skipping tests for linear, which is removed in upstream 6.8+ kernels"
|
||||
fi
|
||||
}
|
||||
|
||||
do_setup() {
|
||||
|
|
2
util.c
2
util.c
|
@ -1852,7 +1852,7 @@ int remove_disk(int mdfd, struct supertype *st,
|
|||
|
||||
/* Remove the disk given by 'info' from the array */
|
||||
if (st->ss->external)
|
||||
rv = sysfs_set_str(sra, info, "slot", "none");
|
||||
rv = sysfs_set_str(sra, info, "slot", STR_COMMON_NONE);
|
||||
else
|
||||
rv = ioctl(mdfd, HOT_REMOVE_DISK, makedev(info->disk.major,
|
||||
info->disk.minor));
|
||||
|
|
Loading…
Add table
Reference in a new issue