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:
Jes Sorensen 2017-04-19 23:27:58 -04:00
parent f22d6cde7c
commit 5e4ca8bb82
4 changed files with 37 additions and 8 deletions

View File

@ -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
View File

@ -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
View File

@ -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);

View File

@ -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");