From 5e4ca8bb82e98400c9258cb3d7e4d030576f21df Mon Sep 17 00:00:00 2001 From: Jes Sorensen Date: Wed, 19 Apr 2017 23:27:58 -0400 Subject: [PATCH] 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 --- Manage.c | 2 +- maps.c | 17 +++++++++++++++++ mdadm.h | 17 ++++++++++++++--- sysfs.c | 9 +++++---- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/Manage.c b/Manage.c index bb84d284..8966e336 100644 --- a/Manage.c +++ b/Manage.c @@ -929,7 +929,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv, return -1; } - if (strncmp(mdp->sysfs_array_state, "readonly", 8) != 0) { + if (mdp->array_state != ARRAY_READONLY) { sysfs_free(mdp); pr_err("%s is not readonly, cannot add journal.\n", devname); return -1; diff --git a/maps.c b/maps.c index d9ee7de4..a8a4639a 100644 --- a/maps.c +++ b/maps.c @@ -139,6 +139,23 @@ mapping_t consistency_policies[] = { { 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) { while (map->name) { diff --git a/mdadm.h b/mdadm.h index f1f643c7..a3799733 100644 --- a/mdadm.h +++ b/mdadm.h @@ -335,8 +335,18 @@ struct mdinfo { int prev_state, curr_state, next_state; /* 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; }; @@ -716,7 +726,8 @@ extern int restore_stripes(int *dest, unsigned long long *offsets, extern char *map_num(mapping_t *map, int num); 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, char *prefer); diff --git a/sysfs.c b/sysfs.c index 51deb237..c6df9b06 100644 --- a/sysfs.c +++ b/sysfs.c @@ -247,11 +247,12 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options) if (options & GET_ARRAY_STATE) { strcpy(base, "array_state"); - if (load_sys(fname, sra->sysfs_array_state, - sizeof(sra->sysfs_array_state))) + if (load_sys(fname, buf, sizeof(buf))) goto abort; - } else - sra->sysfs_array_state[0] = 0; + sra->array_state = map_name(sysfs_array_states, buf); + if (sra->array_state == UnSet) + sra->array_state = ARRAY_UNKNOWN_STATE; + } if (options & GET_CONSISTENCY_POLICY) { strcpy(base, "consistency_policy"); -- 2.39.2