From b0ed54d843e4034988dea2a596bac8d2601f116e Mon Sep 17 00:00:00 2001 From: Raghu Krishnamurthy Date: Wed, 28 Jan 2015 21:53:55 -0800 Subject: [PATCH] Do not stop scanning on a cache-device link is missing since it might not exists when a cache disk device is removed and further cache device might be active. Also handle the case where cache set might not be registered and the status should just believe what the super block says and not mark the disk as missing. This part of code needs optimization but that is a separate change. Issue DAT-1859 Issue DAT-1860 Change-Id: I7eb8e8ff517eae240fde30c70b3ac90aa9a50ed6 --- bcacheadm.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/bcacheadm.c b/bcacheadm.c index 6ffceaaa..ee1a7d80 100644 --- a/bcacheadm.c +++ b/bcacheadm.c @@ -613,7 +613,7 @@ int bcache_query_devs(NihCommand *command, char *const *args) int bcache_status(NihCommand *command, char *const *args) { - int i, dev_count = 0, seq; + int i, dev_count = 0, seq, cache_count = 0; struct cache_sb *seq_sb = NULL; char cache_path[MAX_PATH]; char *dev_names[MAX_DEVS]; @@ -653,7 +653,7 @@ int bcache_status(NihCommand *command, char *const *args) * Get a list of all the devices from sysfs first, then * compare it to the list we get back from the most up * to date superblock. If there are any devices in the superblock - * that are not in sysfs, print out 'NOT PRESENT' + * that are not in sysfs, print out 'missing' */ while (true) { char buf[MAX_PATH]; @@ -661,9 +661,12 @@ int bcache_status(NihCommand *command, char *const *args) DIR *cache_dir; if(((cache_dir = opendir(cache_path)) == NULL) && - dev_count < MAX_DEVS) + cache_count > MAX_DEVS) break; + if (cache_dir) + closedir(cache_dir); + if((len = readlink(cache_path, buf, sizeof(buf) - 1)) != -1) { struct cache_sb *sb; char dev_uuid[40]; @@ -682,15 +685,13 @@ int bcache_status(NihCommand *command, char *const *args) free(sb); dev_uuids[dev_count] = strdup(dev_uuid); - } else { - dev_uuids[dev_count] = strdup("Nothing"); - dev_names[dev_count] = strdup("Nothing"); + dev_count++; } cache_path[strlen(cache_path) - strlen(intbuf)] = 0; - dev_count++; + cache_count++; - snprintf(intbuf, 4, "%d", dev_count); + snprintf(intbuf, 4, "%d", cache_count); strcat(cache_path, intbuf); } @@ -701,18 +702,15 @@ int bcache_status(NihCommand *command, char *const *args) int j; uuid_unparse(m->uuid.b, uuid_str); + snprintf(dev_state, MAX_PATH, "%s", + cache_state[CACHE_STATE(m)]); for (j = 0; j < dev_count; j++) { if (!strcmp(uuid_str, dev_uuids[j])) { - snprintf(dev_state, MAX_PATH, "%s", - cache_state[CACHE_STATE(m)]); break; } else if (j == dev_count - 1) { if (!strcmp(cache_state[CACHE_STATE(m)], "active")) snprintf(dev_state, MAX_PATH, "%s", "missing"); - else - snprintf(dev_state, MAX_PATH, "%s", - cache_state[CACHE_STATE(m)]); break; } }