diff options
author | Raghu Krishnamurthy <rk@daterainc.com> | 2015-01-28 21:53:55 -0800 |
---|---|---|
committer | Raghu Krishnamurthy <rk@daterainc.com> | 2015-01-28 21:53:55 -0800 |
commit | b0ed54d843e4034988dea2a596bac8d2601f116e (patch) | |
tree | 14e2667072c96f3d87d87f2fd3713c7a0637f5d9 | |
parent | 38aa84d04bcd47bb832c3b7ec1e40be9d3c38c69 (diff) |
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
-rw-r--r-- | bcacheadm.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/bcacheadm.c b/bcacheadm.c index 6ffceaa..ee1a7d8 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; } } |