sysfs: Parse array_state in sysfs_read()
Rather than copying in the array_state string, parse it and use an enum to indicate the state. Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
parent
f22d6cde7c
commit
5e4ca8bb82
2
Manage.c
2
Manage.c
|
@ -929,7 +929,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strncmp(mdp->sysfs_array_state, "readonly", 8) != 0) {
|
if (mdp->array_state != ARRAY_READONLY) {
|
||||||
sysfs_free(mdp);
|
sysfs_free(mdp);
|
||||||
pr_err("%s is not readonly, cannot add journal.\n", devname);
|
pr_err("%s is not readonly, cannot add journal.\n", devname);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
17
maps.c
17
maps.c
|
@ -139,6 +139,23 @@ mapping_t consistency_policies[] = {
|
||||||
{ NULL, 0}
|
{ NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mapping_t sysfs_array_states[] = {
|
||||||
|
/*
|
||||||
|
* Beware map_name() uses strcmp() so active-idle must come before
|
||||||
|
* active, to be detected correctly.
|
||||||
|
*/
|
||||||
|
{ "active-idle", ARRAY_ACTIVE_IDLE },
|
||||||
|
{ "active", ARRAY_ACTIVE },
|
||||||
|
{ "clear", ARRAY_CLEAR },
|
||||||
|
{ "inactive", ARRAY_INACTIVE },
|
||||||
|
{ "suspended", ARRAY_SUSPENDED },
|
||||||
|
{ "readonly", ARRAY_READONLY },
|
||||||
|
{ "read-auto", ARRAY_READ_AUTO },
|
||||||
|
{ "clean", ARRAY_CLEAN },
|
||||||
|
{ "write-pending", ARRAY_WRITE_PENDING },
|
||||||
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
char *map_num(mapping_t *map, int num)
|
char *map_num(mapping_t *map, int num)
|
||||||
{
|
{
|
||||||
while (map->name) {
|
while (map->name) {
|
||||||
|
|
17
mdadm.h
17
mdadm.h
|
@ -335,8 +335,18 @@ struct mdinfo {
|
||||||
int prev_state, curr_state, next_state;
|
int prev_state, curr_state, next_state;
|
||||||
|
|
||||||
/* info read from sysfs */
|
/* info read from sysfs */
|
||||||
char sysfs_array_state[20];
|
enum {
|
||||||
|
ARRAY_CLEAR,
|
||||||
|
ARRAY_INACTIVE,
|
||||||
|
ARRAY_SUSPENDED,
|
||||||
|
ARRAY_READONLY,
|
||||||
|
ARRAY_READ_AUTO,
|
||||||
|
ARRAY_CLEAN,
|
||||||
|
ARRAY_ACTIVE,
|
||||||
|
ARRAY_WRITE_PENDING,
|
||||||
|
ARRAY_ACTIVE_IDLE,
|
||||||
|
ARRAY_UNKNOWN_STATE,
|
||||||
|
} array_state;
|
||||||
struct md_bb bb;
|
struct md_bb bb;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -716,7 +726,8 @@ extern int restore_stripes(int *dest, unsigned long long *offsets,
|
||||||
|
|
||||||
extern char *map_num(mapping_t *map, int num);
|
extern char *map_num(mapping_t *map, int num);
|
||||||
extern int map_name(mapping_t *map, char *name);
|
extern int map_name(mapping_t *map, char *name);
|
||||||
extern mapping_t r5layout[], r6layout[], pers[], modes[], faultylayout[], consistency_policies[];
|
extern mapping_t r5layout[], r6layout[], pers[], modes[], faultylayout[];
|
||||||
|
extern mapping_t consistency_policies[], sysfs_array_states[];
|
||||||
|
|
||||||
extern char *map_dev_preferred(int major, int minor, int create,
|
extern char *map_dev_preferred(int major, int minor, int create,
|
||||||
char *prefer);
|
char *prefer);
|
||||||
|
|
9
sysfs.c
9
sysfs.c
|
@ -247,11 +247,12 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options)
|
||||||
|
|
||||||
if (options & GET_ARRAY_STATE) {
|
if (options & GET_ARRAY_STATE) {
|
||||||
strcpy(base, "array_state");
|
strcpy(base, "array_state");
|
||||||
if (load_sys(fname, sra->sysfs_array_state,
|
if (load_sys(fname, buf, sizeof(buf)))
|
||||||
sizeof(sra->sysfs_array_state)))
|
|
||||||
goto abort;
|
goto abort;
|
||||||
} else
|
sra->array_state = map_name(sysfs_array_states, buf);
|
||||||
sra->sysfs_array_state[0] = 0;
|
if (sra->array_state == UnSet)
|
||||||
|
sra->array_state = ARRAY_UNKNOWN_STATE;
|
||||||
|
}
|
||||||
|
|
||||||
if (options & GET_CONSISTENCY_POLICY) {
|
if (options & GET_CONSISTENCY_POLICY) {
|
||||||
strcpy(base, "consistency_policy");
|
strcpy(base, "consistency_policy");
|
||||||
|
|
Loading…
Reference in New Issue