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);
|
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) &&
|
if (c->force && !clean && !is_container(content->array.level) &&
|
||||||
!enough(content->array.level, content->array.raid_disks,
|
!enough(content->array.level, content->array.raid_disks,
|
||||||
|
@ -2021,8 +2015,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
|
||||||
if (dev)
|
if (dev)
|
||||||
continue;
|
continue;
|
||||||
/* Don't want this one any more */
|
/* Don't want this one any more */
|
||||||
if (sysfs_set_str(sra, dev2, "slot", "none") < 0 &&
|
if (sysfs_set_str(sra, dev2, "slot", STR_COMMON_NONE) < 0 && errno == EBUSY) {
|
||||||
errno == EBUSY) {
|
|
||||||
pr_err("Cannot remove old device %s: not updating %s\n", dev2->sys_name, sra->sys_name);
|
pr_err("Cannot remove old device %s: not updating %s\n", dev2->sys_name, sra->sys_name);
|
||||||
sysfs_free(sra);
|
sysfs_free(sra);
|
||||||
return 1;
|
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;
|
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);
|
map_unlock(&map);
|
||||||
|
|
||||||
array.level = s->level;
|
array.level = s->level;
|
||||||
|
@ -111,7 +111,7 @@ int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
|
||||||
goto abort;
|
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;
|
s->bitmap_file = NULL;
|
||||||
if (s->bitmap_file && s->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",
|
||||||
|
|
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");
|
pr_err("automatically enabling write-intent bitmap on large array\n");
|
||||||
s->bitmap_file = "internal";
|
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;
|
s->bitmap_file = NULL;
|
||||||
|
|
||||||
if (s->consistency_policy == CONSISTENCY_POLICY_PPL &&
|
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 ((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)
|
if (info->delta_disks != 0)
|
||||||
printf(" Delta Devices : %d, (%d->%d)\n",
|
printf(" Delta Devices : %d, (%d->%d)\n",
|
||||||
info->delta_disks,
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
if (bmf.pathname[0]) {
|
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) {
|
if (ioctl(fd, SET_BITMAP_FILE, -1) != 0) {
|
||||||
pr_err("failed to remove bitmap %s\n",
|
pr_err("failed to remove bitmap %s\n",
|
||||||
bmf.pathname);
|
bmf.pathname);
|
||||||
|
@ -325,7 +325,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (array.state & (1 << MD_SB_BITMAP_PRESENT)) {
|
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);
|
array.state &= ~(1 << MD_SB_BITMAP_PRESENT);
|
||||||
if (md_set_array_info(fd, &array) != 0) {
|
if (md_set_array_info(fd, &array) != 0) {
|
||||||
if (array.state & (1 << MD_SB_CLUSTERED))
|
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;
|
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);
|
pr_err("no bitmap found on %s\n", devname);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -545,7 +545,7 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha
|
||||||
char *subarray = NULL;
|
char *subarray = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
char container_dev[PATH_MAX];
|
char container_dev[PATH_MAX];
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (s->consistency_policy != CONSISTENCY_POLICY_RESYNC &&
|
if (s->consistency_policy != CONSISTENCY_POLICY_RESYNC &&
|
||||||
s->consistency_policy != CONSISTENCY_POLICY_PPL) {
|
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 (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;
|
ret = 1;
|
||||||
goto free_info;
|
goto free_info;
|
||||||
} else if (strcmp(buf, "reshape\n") == 0) {
|
} else if (strcmp(buf, "reshape\n") == 0) {
|
||||||
|
@ -817,12 +817,12 @@ static int freeze(struct supertype *st)
|
||||||
else {
|
else {
|
||||||
struct mdinfo *sra = sysfs_read(-1, st->devnm, GET_VERSION);
|
struct mdinfo *sra = sysfs_read(-1, st->devnm, GET_VERSION);
|
||||||
int err;
|
int err;
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (!sra)
|
if (!sra)
|
||||||
return -1;
|
return -1;
|
||||||
/* Need to clear any 'read-auto' status */
|
/* 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)
|
strncmp(buf, "read-auto", 9) == 0)
|
||||||
sysfs_set_str(sra, NULL, "array_state", "clean");
|
sysfs_set_str(sra, NULL, "array_state", "clean");
|
||||||
|
|
||||||
|
@ -838,10 +838,10 @@ static void unfreeze(struct supertype *st)
|
||||||
return unfreeze_container(st);
|
return unfreeze_container(st);
|
||||||
else {
|
else {
|
||||||
struct mdinfo *sra = sysfs_read(-1, st->devnm, GET_VERSION);
|
struct mdinfo *sra = sysfs_read(-1, st->devnm, GET_VERSION);
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (sra &&
|
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)
|
strcmp(buf, "frozen\n") == 0)
|
||||||
sysfs_set_str(sra, NULL, "sync_action", "idle");
|
sysfs_set_str(sra, NULL, "sync_action", "idle");
|
||||||
sysfs_free(sra);
|
sysfs_free(sra);
|
||||||
|
@ -851,12 +851,12 @@ static void unfreeze(struct supertype *st)
|
||||||
static void wait_reshape(struct mdinfo *sra)
|
static void wait_reshape(struct mdinfo *sra)
|
||||||
{
|
{
|
||||||
int fd = sysfs_get_fd(sra, NULL, "sync_action");
|
int fd = sysfs_get_fd(sra, NULL, "sync_action");
|
||||||
char action[20];
|
char action[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return;
|
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)
|
strncmp(action, "reshape", 7) == 0)
|
||||||
sysfs_wait(fd, NULL);
|
sysfs_wait(fd, NULL);
|
||||||
close(fd);
|
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
|
* to close a race with the array_state going clean before the
|
||||||
* next write to raid_disks / stripe_cache_size
|
* next write to raid_disks / stripe_cache_size
|
||||||
*/
|
*/
|
||||||
char safe[50];
|
char safe[SYSFS_MAX_BUF_SIZE];
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* only 'raid_disks' and 'stripe_cache_size' trigger md_allow_write */
|
/* 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;
|
remaining = sd->next;
|
||||||
|
|
||||||
sysfs_set_str(sra, sd, "state", "faulty");
|
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 */
|
/* for external metadata disks should be removed in mdmon */
|
||||||
if (!st->ss->external)
|
if (!st->ss->external)
|
||||||
sysfs_set_str(sra, sd, "state", "remove");
|
sysfs_set_str(sra, sd, "state", "remove");
|
||||||
|
@ -2145,8 +2145,7 @@ size_change_error:
|
||||||
* a backport has been arranged.
|
* a backport has been arranged.
|
||||||
*/
|
*/
|
||||||
if (sra == NULL ||
|
if (sra == NULL ||
|
||||||
sysfs_set_str(sra, NULL, "resync_start",
|
sysfs_set_str(sra, NULL, "resync_start", STR_COMMON_NONE) < 0)
|
||||||
"none") < 0)
|
|
||||||
pr_err("--assume-clean not supported with --grow on this kernel\n");
|
pr_err("--assume-clean not supported with --grow on this kernel\n");
|
||||||
}
|
}
|
||||||
md_get_array_info(fd, &array);
|
md_get_array_info(fd, &array);
|
||||||
|
@ -2396,11 +2395,11 @@ release:
|
||||||
static int verify_reshape_position(struct mdinfo *info, int level)
|
static int verify_reshape_position(struct mdinfo *info, int level)
|
||||||
{
|
{
|
||||||
int ret_val = 0;
|
int ret_val = 0;
|
||||||
char buf[40];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
/* read sync_max, failure can mean raid0 array */
|
/* 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) {
|
if (rv > 0) {
|
||||||
char *ep;
|
char *ep;
|
||||||
|
@ -3040,7 +3039,7 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||||
unsigned long long array_size;
|
unsigned long long array_size;
|
||||||
int done;
|
int done;
|
||||||
struct mdinfo *sra = NULL;
|
struct mdinfo *sra = NULL;
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
/* when reshaping a RAID0, the component_size might be zero.
|
/* when reshaping a RAID0, the component_size might be zero.
|
||||||
* So try to fix that up.
|
* 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
|
unsigned long long array_size = (info->component_size
|
||||||
* reshape->before.data_disks);
|
* reshape->before.data_disks);
|
||||||
int fd;
|
int fd;
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
/* First, we unsuspend any region that is now known to be safe.
|
/* First, we unsuspend any region that is now known to be safe.
|
||||||
* If suspend_point is on the 'wrong' side of reshape_progress, then
|
* 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
|
/* Check that sync_action is still 'reshape' to avoid
|
||||||
* waiting forever on a dead array
|
* waiting forever on a dead array
|
||||||
*/
|
*/
|
||||||
char action[20];
|
char action[SYSFS_MAX_BUF_SIZE];
|
||||||
if (sysfs_get_str(info, NULL, "sync_action", action, 20) <= 0 ||
|
if (sysfs_get_str(info, NULL, "sync_action", action, sizeof(action)) <= 0 ||
|
||||||
strncmp(action, "reshape", 7) != 0)
|
strncmp(action, "reshape", 7) != 0)
|
||||||
break;
|
break;
|
||||||
/* Some kernels reset 'sync_completed' to zero
|
/* Some kernels reset 'sync_completed' to zero
|
||||||
|
@ -4121,8 +4120,8 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
|
||||||
*/
|
*/
|
||||||
if (completed == 0) {
|
if (completed == 0) {
|
||||||
unsigned long long reshapep;
|
unsigned long long reshapep;
|
||||||
char action[20];
|
char action[SYSFS_MAX_BUF_SIZE];
|
||||||
if (sysfs_get_str(info, NULL, "sync_action", action, 20) > 0 &&
|
if (sysfs_get_str(info, NULL, "sync_action", action, sizeof(action)) > 0 &&
|
||||||
strncmp(action, "idle", 4) == 0 &&
|
strncmp(action, "idle", 4) == 0 &&
|
||||||
sysfs_get_ll(info, NULL,
|
sysfs_get_ll(info, NULL,
|
||||||
"reshape_position", &reshapep) == 0)
|
"reshape_position", &reshapep) == 0)
|
||||||
|
@ -4159,8 +4158,8 @@ check_progress:
|
||||||
* it was just a device failure that leaves us degraded but
|
* it was just a device failure that leaves us degraded but
|
||||||
* functioning.
|
* functioning.
|
||||||
*/
|
*/
|
||||||
if (sysfs_get_str(info, NULL, "reshape_position", buf,
|
if (sysfs_get_str(info, NULL, "reshape_position", buf, sizeof(buf)) < 0 ||
|
||||||
sizeof(buf)) < 0 || strncmp(buf, "none", 4) != 0) {
|
str_is_none(buf) == false) {
|
||||||
/* The abort might only be temporary. Wait up to 10
|
/* The abort might only be temporary. Wait up to 10
|
||||||
* seconds for fd to contain a valid number again.
|
* 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))
|
if (sd->disk.state & (1<<MD_DISK_FAULTY))
|
||||||
continue;
|
continue;
|
||||||
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
||||||
char sbuf[100];
|
char sbuf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (sysfs_get_str(sra, sd, "state",
|
if (sysfs_get_str(sra, sd, "state",
|
||||||
sbuf, sizeof(sbuf)) < 0 ||
|
sbuf, sizeof(sbuf)) < 0 ||
|
||||||
|
|
|
@ -670,7 +670,7 @@ static void find_reject(int mdfd, struct supertype *st, struct mdinfo *sra,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (d->disk.raid_disk > -1)
|
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 (sysfs_set_str(sra, d, "state", "remove") == 0)
|
||||||
if (verbose >= 0)
|
if (verbose >= 0)
|
||||||
pr_err("removing old device %s from %s\n",
|
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 mdstat_ent *ent;
|
||||||
struct mddev_dev devlist;
|
struct mddev_dev devlist;
|
||||||
struct mdinfo mdi;
|
struct mdinfo mdi;
|
||||||
char buf[32];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (!id_path)
|
if (!id_path)
|
||||||
dprintf("incremental removal without --path <id_path> lacks the possibility to re-add new device in this port\n");
|
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];
|
char container[32];
|
||||||
int err;
|
int err;
|
||||||
int count;
|
int count;
|
||||||
char buf[32];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
unsigned long long rd1, rd2;
|
unsigned long long rd1, rd2;
|
||||||
|
|
||||||
if (will_retry && verbose == 0)
|
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) &&
|
if (mdi && is_level456(mdi->array.level) &&
|
||||||
sysfs_attribute_available(mdi, NULL, "sync_action") &&
|
sysfs_attribute_available(mdi, NULL, "sync_action") &&
|
||||||
sysfs_attribute_available(mdi, NULL, "reshape_direction") &&
|
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 &&
|
strcmp(buf, "reshape\n") == 0 &&
|
||||||
sysfs_get_two(mdi, NULL, "raid_disks", &rd1, &rd2) == 2) {
|
sysfs_get_two(mdi, NULL, "raid_disks", &rd1, &rd2) == 2) {
|
||||||
unsigned long long position, curr;
|
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;
|
unsigned long long max_completed;
|
||||||
sysfs_get_ll(mdi, NULL, "reshape_position", &curr);
|
sysfs_get_ll(mdi, NULL, "reshape_position", &curr);
|
||||||
sysfs_fd_get_str(scfd, buf, sizeof(buf));
|
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
|
/* Either reshape has aborted, or hasn't
|
||||||
* quite started yet. Wait a bit and
|
* quite started yet. Wait a bit and
|
||||||
* check 'sync_action' to see.
|
* check 'sync_action' to see.
|
||||||
|
@ -1519,8 +1519,8 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
sprintf(dname, "dev-%s", dv->devname);
|
sprintf(dname, "dev-%s", dv->devname);
|
||||||
sysfd = sysfs_open(fd2devnm(fd), dname, "block/dev");
|
sysfd = sysfs_open(fd2devnm(fd), dname, "block/dev");
|
||||||
if (sysfd >= 0) {
|
if (sysfd >= 0) {
|
||||||
char dn[20];
|
char dn[SYSFS_MAX_BUF_SIZE];
|
||||||
if (sysfs_fd_get_str(sysfd, dn, 20) > 0 &&
|
if (sysfs_fd_get_str(sysfd, dn, sizeof(dn)) > 0 &&
|
||||||
sscanf(dn, "%d:%d", &mj,&mn) == 2) {
|
sscanf(dn, "%d:%d", &mj,&mn) == 2) {
|
||||||
rdev = makedev(mj,mn);
|
rdev = makedev(mj,mn);
|
||||||
found = 1;
|
found = 1;
|
||||||
|
@ -1749,6 +1749,7 @@ int Update_subarray(char *dev, char *subarray, enum update_opt update,
|
||||||
int fd, rv = 2;
|
int fd, rv = 2;
|
||||||
struct mdinfo *info = NULL;
|
struct mdinfo *info = NULL;
|
||||||
char *update_verb = map_num(update_options, update);
|
char *update_verb = map_num(update_options, update);
|
||||||
|
bool allow_active = update == UOPT_PPL || update == UOPT_NO_PPL;
|
||||||
|
|
||||||
memset(st, 0, sizeof(*st));
|
memset(st, 0, sizeof(*st));
|
||||||
|
|
||||||
|
@ -1763,7 +1764,7 @@ int Update_subarray(char *dev, char *subarray, enum update_opt update,
|
||||||
goto free_super;
|
goto free_super;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_subarray_active(subarray, st->devnm)) {
|
if (!allow_active && is_subarray_active(subarray, st->devnm)) {
|
||||||
if (verbose >= 0)
|
if (verbose >= 0)
|
||||||
pr_err("Subarray %s in %s is active, cannot update %s\n",
|
pr_err("Subarray %s in %s is active, cannot update %s\n",
|
||||||
subarray, dev, update_verb);
|
subarray, dev, update_verb);
|
||||||
|
|
|
@ -1309,12 +1309,12 @@ int Wait(char *dev)
|
||||||
* sync_action does.
|
* sync_action does.
|
||||||
*/
|
*/
|
||||||
struct mdinfo mdi;
|
struct mdinfo mdi;
|
||||||
char buf[21];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (sysfs_init(&mdi, -1, devnm))
|
if (sysfs_init(&mdi, -1, devnm))
|
||||||
return 2;
|
return 2;
|
||||||
if (sysfs_get_str(&mdi, NULL, "sync_action",
|
if (sysfs_get_str(&mdi, NULL, "sync_action",
|
||||||
buf, 20) > 0 &&
|
buf, sizeof(buf)) > 0 &&
|
||||||
strcmp(buf,"idle\n") != 0) {
|
strcmp(buf,"idle\n") != 0) {
|
||||||
e->percent = RESYNC_UNKNOWN;
|
e->percent = RESYNC_UNKNOWN;
|
||||||
if (strcmp(buf, "frozen\n") == 0) {
|
if (strcmp(buf, "frozen\n") == 0) {
|
||||||
|
@ -1393,7 +1393,7 @@ int WaitClean(char *dev, int verbose)
|
||||||
|
|
||||||
if (rv) {
|
if (rv) {
|
||||||
int state_fd = sysfs_open(fd2devnm(fd), NULL, "array_state");
|
int state_fd = sysfs_open(fd2devnm(fd), NULL, "array_state");
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int delay = 5000;
|
int delay = 5000;
|
||||||
|
|
||||||
/* minimize the safe_mode_delay and prepare to wait up to 5s
|
/* 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"));
|
dl_add(list, dl_strdup("partitions"));
|
||||||
devline(list);
|
devline(list);
|
||||||
free_line(list);
|
free_line(list);
|
||||||
} else if (strcmp(conffile, "none") != 0) {
|
} else if (str_is_none(conffile) == false) {
|
||||||
f = fopen(conffile, "r");
|
f = fopen(conffile, "r");
|
||||||
/* Debian chose to relocate mdadm.conf into /etc/mdadm/.
|
/* Debian chose to relocate mdadm.conf into /etc/mdadm/.
|
||||||
* To allow Debian users to compile from clean source and still
|
* 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.
|
* trying to find and assign a spare.
|
||||||
* We do that whenever the monitor tells us too.
|
* We do that whenever the monitor tells us too.
|
||||||
*/
|
*/
|
||||||
char buf[64];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int frozen;
|
int frozen;
|
||||||
struct supertype *container = a->container;
|
struct supertype *container = a->container;
|
||||||
struct mdinfo *mdi;
|
struct mdinfo *mdi;
|
||||||
|
@ -664,7 +664,7 @@ static void manage_new(struct mdstat_ent *mdstat,
|
||||||
struct mdinfo *mdi = NULL, *di;
|
struct mdinfo *mdi = NULL, *di;
|
||||||
int i, inst;
|
int i, inst;
|
||||||
int failed = 0;
|
int failed = 0;
|
||||||
char buf[40];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
/* check if array is ready to be monitored */
|
/* check if array is ready to be monitored */
|
||||||
if (!mdstat->active || !mdstat->level)
|
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)
|
* read this information for new arrays only (empty victim)
|
||||||
*/
|
*/
|
||||||
if ((victim == NULL) &&
|
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)) {
|
(strncmp(buf, "reshape", 7) == 0)) {
|
||||||
if (sysfs_get_ll(mdi, NULL, "reshape_position",
|
if (sysfs_get_ll(mdi, NULL, "reshape_position",
|
||||||
&new->last_checkpoint) != 0)
|
&new->last_checkpoint) != 0)
|
||||||
|
|
4
maps.c
4
maps.c
|
@ -137,14 +137,14 @@ mapping_t faultylayout[] = {
|
||||||
|
|
||||||
{ "clear", ClearErrors},
|
{ "clear", ClearErrors},
|
||||||
{ "flush", ClearFaults},
|
{ "flush", ClearFaults},
|
||||||
{ "none", ClearErrors},
|
{ STR_COMMON_NONE, ClearErrors},
|
||||||
{ "default", ClearErrors},
|
{ "default", ClearErrors},
|
||||||
{ NULL, UnSet }
|
{ NULL, UnSet }
|
||||||
};
|
};
|
||||||
|
|
||||||
mapping_t consistency_policies[] = {
|
mapping_t consistency_policies[] = {
|
||||||
{ "unknown", CONSISTENCY_POLICY_UNKNOWN},
|
{ "unknown", CONSISTENCY_POLICY_UNKNOWN},
|
||||||
{ "none", CONSISTENCY_POLICY_NONE},
|
{ STR_COMMON_NONE, CONSISTENCY_POLICY_NONE},
|
||||||
{ "resync", CONSISTENCY_POLICY_RESYNC},
|
{ "resync", CONSISTENCY_POLICY_RESYNC},
|
||||||
{ "bitmap", CONSISTENCY_POLICY_BITMAP},
|
{ "bitmap", CONSISTENCY_POLICY_BITMAP},
|
||||||
{ "journal", CONSISTENCY_POLICY_JOURNAL},
|
{ "journal", CONSISTENCY_POLICY_JOURNAL},
|
||||||
|
|
7
mdadm.c
7
mdadm.c
|
@ -1099,7 +1099,7 @@ int main(int argc, char *argv[])
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
if (strcmp(optarg, "internal") == 0 ||
|
if (strcmp(optarg, "internal") == 0 ||
|
||||||
strcmp(optarg, "none") == 0 ||
|
strcmp(optarg, STR_COMMON_NONE) == 0 ||
|
||||||
strchr(optarg, '/') != NULL) {
|
strchr(optarg, '/') != NULL) {
|
||||||
s.bitmap_file = optarg;
|
s.bitmap_file = optarg;
|
||||||
continue;
|
continue;
|
||||||
|
@ -1234,13 +1234,12 @@ int main(int argc, char *argv[])
|
||||||
pr_err("PPL consistency policy is only supported for RAID level 5.\n");
|
pr_err("PPL consistency policy is only supported for RAID level 5.\n");
|
||||||
exit(2);
|
exit(2);
|
||||||
} else if (s.consistency_policy == CONSISTENCY_POLICY_BITMAP &&
|
} else if (s.consistency_policy == CONSISTENCY_POLICY_BITMAP &&
|
||||||
(!s.bitmap_file ||
|
(!s.bitmap_file || str_is_none(s.bitmap_file) == true)) {
|
||||||
strcmp(s.bitmap_file, "none") == 0)) {
|
|
||||||
pr_err("--bitmap is required for consistency policy: %s\n",
|
pr_err("--bitmap is required for consistency policy: %s\n",
|
||||||
map_num_s(consistency_policies, s.consistency_policy));
|
map_num_s(consistency_policies, s.consistency_policy));
|
||||||
exit(2);
|
exit(2);
|
||||||
} else if (s.bitmap_file &&
|
} 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_BITMAP &&
|
||||||
s.consistency_policy != CONSISTENCY_POLICY_JOURNAL) {
|
s.consistency_policy != CONSISTENCY_POLICY_JOURNAL) {
|
||||||
pr_err("--bitmap is not compatible with consistency policy: %s\n",
|
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),
|
GET_DEVS_ALL = (1 << 27),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define SYSFS_MAX_BUF_SIZE 64
|
||||||
|
|
||||||
/* If fd >= 0, get the array it is open on,
|
/* If fd >= 0, get the array it is open on,
|
||||||
* else use devnm.
|
* else use devnm.
|
||||||
*/
|
*/
|
||||||
|
@ -2025,3 +2027,19 @@ static inline int is_container(const int level)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
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)
|
static void read_resync_start(int fd, unsigned long long *v)
|
||||||
{
|
{
|
||||||
char buf[30];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
n = read_attr(buf, 30, fd);
|
n = read_attr(buf, sizeof(buf), fd);
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
dprintf("Failed to read resync_start (%d)\n", fd);
|
dprintf("Failed to read resync_start (%d)\n", fd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strncmp(buf, "none", 4) == 0)
|
if (str_is_none(buf) == true)
|
||||||
*v = MaxSector;
|
*v = MaxSector;
|
||||||
else
|
else
|
||||||
*v = strtoull(buf, NULL, 10);
|
*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)
|
static unsigned long long read_sync_completed(int fd)
|
||||||
{
|
{
|
||||||
unsigned long long val;
|
unsigned long long val;
|
||||||
char buf[50];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int n;
|
int n;
|
||||||
char *ep;
|
char *ep;
|
||||||
|
|
||||||
n = read_attr(buf, 50, fd);
|
n = read_attr(buf, sizeof(buf), fd);
|
||||||
|
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -115,8 +115,8 @@ static unsigned long long read_sync_completed(int fd)
|
||||||
|
|
||||||
static enum array_state read_state(int fd)
|
static enum array_state read_state(int fd)
|
||||||
{
|
{
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int n = read_attr(buf, 20, fd);
|
int n = read_attr(buf, sizeof(buf), fd);
|
||||||
|
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return bad_word;
|
return bad_word;
|
||||||
|
@ -125,8 +125,8 @@ static enum array_state read_state(int fd)
|
||||||
|
|
||||||
static enum sync_action read_action( int fd)
|
static enum sync_action read_action( int fd)
|
||||||
{
|
{
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int n = read_attr(buf, 20, fd);
|
int n = read_attr(buf, sizeof(buf), fd);
|
||||||
|
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return bad_action;
|
return bad_action;
|
||||||
|
@ -135,7 +135,7 @@ static enum sync_action read_action( int fd)
|
||||||
|
|
||||||
int read_dev_state(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);
|
int n = read_attr(buf, sizeof(buf), fd);
|
||||||
char *cp;
|
char *cp;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
@ -595,12 +595,12 @@ static int read_and_act(struct active_array *a, fd_set *fds)
|
||||||
*/
|
*/
|
||||||
if ((a->curr_action != reshape) &&
|
if ((a->curr_action != reshape) &&
|
||||||
(a->prev_action == reshape)) {
|
(a->prev_action == reshape)) {
|
||||||
char buf[40];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
if ((sysfs_get_str(&a->info, NULL,
|
if ((sysfs_get_str(&a->info, NULL,
|
||||||
"reshape_position",
|
"reshape_position",
|
||||||
buf,
|
buf,
|
||||||
sizeof(buf)) >= 0) &&
|
sizeof(buf)) >= 0) &&
|
||||||
strncmp(buf, "none", 4) == 0)
|
str_is_none(buf) == true)
|
||||||
a->last_checkpoint = a->info.component_size;
|
a->last_checkpoint = a->info.component_size;
|
||||||
}
|
}
|
||||||
a->container->ss->set_array_state(a, a->curr_state <= clean);
|
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 mdstat_ent *ent, *e, *e2;
|
||||||
struct mdinfo *sra = NULL;
|
struct mdinfo *sra = NULL;
|
||||||
char buf[64];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
|
||||||
if (check_mdmon_version(container))
|
if (check_mdmon_version(container))
|
||||||
|
@ -366,7 +366,7 @@ int block_monitor(char *container, const int freeze)
|
||||||
!sysfs_attribute_available(sra, NULL, "sync_action")) ||
|
!sysfs_attribute_available(sra, NULL, "sync_action")) ||
|
||||||
(freeze &&
|
(freeze &&
|
||||||
sysfs_attribute_available(sra, NULL, "sync_action") &&
|
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))
|
strcmp(buf, "frozen\n") == 0))
|
||||||
/* pass */;
|
/* pass */;
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -1825,7 +1825,7 @@ static void print_imsm_dev(struct intel_super *super,
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf(" Failed disk : ");
|
printf(" Failed disk : ");
|
||||||
if (map->failed_disk_num == 0xff)
|
if (map->failed_disk_num == 0xff)
|
||||||
printf("none");
|
printf(STR_COMMON_NONE);
|
||||||
else
|
else
|
||||||
printf("%i", map->failed_disk_num);
|
printf("%i", map->failed_disk_num);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -2976,34 +2976,6 @@ static void uuid_from_super_imsm(struct supertype *st, int uuid[4])
|
||||||
memcpy(uuid, buf, 4*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)
|
static __u32 migr_strip_blocks_resync(struct imsm_dev *dev)
|
||||||
{
|
{
|
||||||
/* migr_strip_size when repairing or initializing parity */
|
/* 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 */
|
/* still reshaping, maybe update vol_curr_migr_unit */
|
||||||
goto mark_checkpoint;
|
goto mark_checkpoint;
|
||||||
} else {
|
} 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) {
|
if (a->last_checkpoint >= a->info.component_size) {
|
||||||
unsigned long long array_blocks;
|
unsigned long long array_blocks;
|
||||||
int used_disks;
|
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 int sector_size = super->sector_size;
|
||||||
unsigned long long curr_migr_unit = current_migr_unit(migr_rec);
|
unsigned long long curr_migr_unit = current_migr_unit(migr_rec);
|
||||||
unsigned long long num_migr_units = get_num_migr_units(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;
|
int skipped_disks = 0;
|
||||||
struct dl *dl_disk;
|
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)
|
if (err < 1)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -12107,14 +12062,14 @@ exit_imsm_reshape_super:
|
||||||
static int read_completed(int fd, unsigned long long *val)
|
static int read_completed(int fd, unsigned long long *val)
|
||||||
{
|
{
|
||||||
int ret;
|
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)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = COMPLETED_OK;
|
ret = COMPLETED_OK;
|
||||||
if (strncmp(buf, "none", 4) == 0) {
|
if (str_is_none(buf) == true) {
|
||||||
ret = COMPLETED_NONE;
|
ret = COMPLETED_NONE;
|
||||||
} else if (strncmp(buf, "delayed", 7) == 0) {
|
} else if (strncmp(buf, "delayed", 7) == 0) {
|
||||||
ret = COMPLETED_DELAYED;
|
ret = COMPLETED_DELAYED;
|
||||||
|
@ -12182,12 +12137,12 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int rc;
|
int rc;
|
||||||
char action[20];
|
char action[SYSFS_MAX_BUF_SIZE];
|
||||||
int timeout = 3000;
|
int timeout = 3000;
|
||||||
|
|
||||||
sysfs_wait(fd, &timeout);
|
sysfs_wait(fd, &timeout);
|
||||||
if (sysfs_get_str(sra, NULL, "sync_action",
|
if (sysfs_get_str(sra, NULL, "sync_action",
|
||||||
action, 20) > 0 &&
|
action, sizeof(action)) > 0 &&
|
||||||
strncmp(action, "reshape", 7) != 0) {
|
strncmp(action, "reshape", 7) != 0) {
|
||||||
if (strncmp(action, "idle", 4) == 0)
|
if (strncmp(action, "idle", 4) == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -12234,7 +12189,7 @@ int check_degradation_change(struct mdinfo *info,
|
||||||
if (sd->disk.state & (1<<MD_DISK_FAULTY))
|
if (sd->disk.state & (1<<MD_DISK_FAULTY))
|
||||||
continue;
|
continue;
|
||||||
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
||||||
char sbuf[100];
|
char sbuf[SYSFS_MAX_BUF_SIZE];
|
||||||
int raid_disk = sd->disk.raid_disk;
|
int raid_disk = sd->disk.raid_disk;
|
||||||
|
|
||||||
if (sysfs_get_str(info,
|
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;
|
break;
|
||||||
}
|
}
|
||||||
printf("\n");
|
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 : ");
|
printf(" Device Role : ");
|
||||||
role = role_from_sb(sb);
|
role = role_from_sb(sb);
|
||||||
if (role >= MD_DISK_ROLE_FAULTY)
|
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");
|
strcpy(base, "metadata_version");
|
||||||
if (load_sys(fname, buf, sizeof(buf)))
|
if (load_sys(fname, buf, sizeof(buf)))
|
||||||
goto abort;
|
goto abort;
|
||||||
if (strncmp(buf, "none", 4) == 0) {
|
if (str_is_none(buf) == true) {
|
||||||
sra->array.major_version =
|
sra->array.major_version =
|
||||||
sra->array.minor_version = -1;
|
sra->array.minor_version = -1;
|
||||||
strcpy(sra->text_version, "");
|
strcpy(sra->text_version, "");
|
||||||
|
@ -244,7 +244,7 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options)
|
||||||
goto abort;
|
goto abort;
|
||||||
if (strncmp(buf, "file", 4) == 0)
|
if (strncmp(buf, "file", 4) == 0)
|
||||||
sra->bitmap_offset = 1;
|
sra->bitmap_offset = 1;
|
||||||
else if (strncmp(buf, "none", 4) == 0)
|
else if (str_is_none(buf) == true)
|
||||||
sra->bitmap_offset = 0;
|
sra->bitmap_offset = 0;
|
||||||
else if (buf[0] == '+')
|
else if (buf[0] == '+')
|
||||||
sra->bitmap_offset = strtol(buf+1, NULL, 10);
|
sra->bitmap_offset = strtol(buf+1, NULL, 10);
|
||||||
|
@ -664,7 +664,7 @@ int sysfs_set_array(struct mdinfo *info, int vers)
|
||||||
ver[0] = 0;
|
ver[0] = 0;
|
||||||
if (info->array.major_version == -1 &&
|
if (info->array.major_version == -1 &&
|
||||||
info->array.minor_version == -2) {
|
info->array.minor_version == -2) {
|
||||||
char buf[1024];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
strcat(strcpy(ver, "external:"), info->text_version);
|
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
|
* version first, and preserve the flag
|
||||||
*/
|
*/
|
||||||
if (sysfs_get_str(info, NULL, "metadata_version",
|
if (sysfs_get_str(info, NULL, "metadata_version",
|
||||||
buf, 1024) > 0)
|
buf, sizeof(buf)) > 0)
|
||||||
if (strlen(buf) >= 9 && buf[9] == '-')
|
if (strlen(buf) >= 9 && buf[9] == '-')
|
||||||
ver[9] = '-';
|
ver[9] = '-';
|
||||||
|
|
||||||
|
@ -803,72 +803,6 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume)
|
||||||
return rv;
|
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)
|
int sysfs_disk_to_scsi_id(int fd, __u32 *id)
|
||||||
{
|
{
|
||||||
/* from an open block device, try to retrieve it scsi_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 0 if this kernel doesn't support 'frozen'
|
||||||
* return 1 if it worked.
|
* return 1 if it worked.
|
||||||
*/
|
*/
|
||||||
char buf[20];
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
|
||||||
if (!sysfs_attribute_available(sra, NULL, "sync_action"))
|
if (!sysfs_attribute_available(sra, NULL, "sync_action"))
|
||||||
return 1; /* no sync_action == frozen */
|
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;
|
return 0;
|
||||||
if (strcmp(buf, "frozen\n") == 0)
|
if (strcmp(buf, "frozen\n") == 0)
|
||||||
/* Already frozen */
|
/* Already frozen */
|
||||||
|
|
4
test
4
test
|
@ -140,6 +140,7 @@ do_help() {
|
||||||
--raidtype= raid0|linear|raid1|raid456|raid10|ddf|imsm
|
--raidtype= raid0|linear|raid1|raid456|raid10|ddf|imsm
|
||||||
--disable-multipath Disable any tests involving multipath
|
--disable-multipath Disable any tests involving multipath
|
||||||
--disable-integrity Disable slow tests of RAID[56] consistency
|
--disable-integrity Disable slow tests of RAID[56] consistency
|
||||||
|
--disable-linear Disable any tests involving linear
|
||||||
--logdir=directory Directory to save all logfiles in
|
--logdir=directory Directory to save all logfiles in
|
||||||
--save-logs Usually use with --logdir together
|
--save-logs Usually use with --logdir together
|
||||||
--keep-going | --no-error Don't stop on error, ie. run all tests
|
--keep-going | --no-error Don't stop on error, ie. run all tests
|
||||||
|
@ -255,6 +256,9 @@ parse_args() {
|
||||||
--disable-integrity )
|
--disable-integrity )
|
||||||
unset INTEGRITY
|
unset INTEGRITY
|
||||||
;;
|
;;
|
||||||
|
--disable-linear )
|
||||||
|
unset LINEAR
|
||||||
|
;;
|
||||||
--dev=* )
|
--dev=* )
|
||||||
case ${i##*=} in
|
case ${i##*=} in
|
||||||
loop )
|
loop )
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
|
|
||||||
# create a simple linear
|
# create a simple linear
|
||||||
|
|
||||||
|
if [ "$LINEAR" != "yes" ]; then
|
||||||
|
echo -ne 'skipping... '
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
mdadm -CR $md0 -l linear -n3 $dev0 $dev1 $dev2
|
mdadm -CR $md0 -l linear -n3 $dev0 $dev1 $dev2
|
||||||
check linear
|
check linear
|
||||||
testdev $md0 3 $mdsize2_l 1
|
testdev $md0 3 $mdsize2_l 1
|
||||||
|
|
|
@ -4,7 +4,13 @@ set -x -e
|
||||||
conf=$targetdir/mdadm.conf
|
conf=$targetdir/mdadm.conf
|
||||||
echo "CREATE names=yes" > $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
|
do
|
||||||
mdadm -CR --config $conf /dev/md/$i -l $i -n 4 $dev4 $dev3 $dev2 $dev1
|
mdadm -CR --config $conf /dev/md/$i -l $i -n 4 $dev4 $dev3 $dev2 $dev1
|
||||||
check $i
|
check $i
|
||||||
|
|
|
@ -16,6 +16,10 @@ check raid0
|
||||||
testdev $md0 5 $size 512
|
testdev $md0 5 $size 512
|
||||||
mdadm -S $md0
|
mdadm -S $md0
|
||||||
|
|
||||||
|
if [ "$LINEAR" != "yes" ]; then
|
||||||
|
echo -ne 'skipping... '
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
# now same again with different chunk size
|
# now same again with different chunk size
|
||||||
for chunk in 4 32 256
|
for chunk in 4 32 256
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
#!/bin/bash
|
#!/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
|
for metadata in 0.9 1.0 1.1 1.2
|
||||||
do
|
do
|
||||||
for level in linear raid0 raid1 raid4 raid5 raid6 raid10
|
for level in ${levels[@]}
|
||||||
do
|
do
|
||||||
if [[ $metadata == "0.9" && $level == "raid0" ]];
|
if [[ $metadata == "0.9" && $level == "raid0" ]];
|
||||||
then
|
then
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
|
|
||||||
# create a liner array, and add more drives to to.
|
# 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
|
for e in 0.90 1 1.1 1.2
|
||||||
do
|
do
|
||||||
case $e in
|
case $e in
|
||||||
|
|
|
@ -6,7 +6,13 @@ set -x -e
|
||||||
# Here just test that a partly "-I" assembled array can
|
# Here just test that a partly "-I" assembled array can
|
||||||
# be completed with "-A"
|
# 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
|
do
|
||||||
mdadm -CR $md0 -l $l -n5 $dev0 $dev1 $dev2 $dev3 $dev4 --assume-clean
|
mdadm -CR $md0 -l $l -n5 $dev0 $dev1 $dev2 $dev3 $dev4 --assume-clean
|
||||||
mdadm -S md0
|
mdadm -S md0
|
||||||
|
|
|
@ -64,6 +64,10 @@ mdadm --assemble --scan --config=$conf $md2
|
||||||
$tst
|
$tst
|
||||||
mdadm -S $md2
|
mdadm -S $md2
|
||||||
|
|
||||||
|
if [ "$LINEAR" != "yes" ]; then
|
||||||
|
echo -ne 'skipping... '
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
### Now for version 0...
|
### Now for version 0...
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
|
|
||||||
# create a raid0, re-assemble with a different super-minor
|
# 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
|
mdadm -CR -e 0.90 $md0 -llinear -n3 $dev0 $dev1 $dev2
|
||||||
testdev $md0 3 $mdsize0 1
|
testdev $md0 3 $mdsize0 1
|
||||||
minor1=`mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'`
|
minor1=`mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'`
|
||||||
|
|
|
@ -123,6 +123,17 @@ check_env() {
|
||||||
modprobe multipath 2> /dev/null
|
modprobe multipath 2> /dev/null
|
||||||
grep -sq 'Personalities : .*multipath' /proc/mdstat &&
|
grep -sq 'Personalities : .*multipath' /proc/mdstat &&
|
||||||
MULTIPATH="yes"
|
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() {
|
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 */
|
/* Remove the disk given by 'info' from the array */
|
||||||
if (st->ss->external)
|
if (st->ss->external)
|
||||||
rv = sysfs_set_str(sra, info, "slot", "none");
|
rv = sysfs_set_str(sra, info, "slot", STR_COMMON_NONE);
|
||||||
else
|
else
|
||||||
rv = ioctl(mdfd, HOT_REMOVE_DISK, makedev(info->disk.major,
|
rv = ioctl(mdfd, HOT_REMOVE_DISK, makedev(info->disk.major,
|
||||||
info->disk.minor));
|
info->disk.minor));
|
||||||
|
|
Loading…
Add table
Reference in a new issue