diff options
Diffstat (limited to 'xlators/debug')
-rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index 3a7f53da4ab..62e85bbb99b 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -2837,32 +2837,29 @@ conditional_dump (dict_t *dict, char *key, data_t *value, void *data) memset (filename, 0, value->len + 1); memcpy (filename, data_to_str (value), value->len); - if (fnmatch ("*io*stat*dump", key, 0) == 0) { - pid = getpid (); + pid = getpid (); - - if (!strncmp (filename, "", 1)) { - gf_log (this->name, GF_LOG_ERROR, "No filename given"); - return -1; - } - logfp = fopen (filename, "w+"); - if (!logfp) { - gf_log (this->name, GF_LOG_ERROR, "failed to open %s " + if (!strncmp (filename, "", 1)) { + gf_log (this->name, GF_LOG_ERROR, "No filename given"); + return -1; + } + logfp = fopen (filename, "w+"); + if (!logfp) { + gf_log (this->name, GF_LOG_ERROR, "failed to open %s " "for writing", filename); - return -1; - } - sprintf (dump_key, "*io*stat*%d_json_dump", pid); - if (fnmatch (dump_key, key, 0) == 0) { - (void) ios_dump_args_init ( - &args, IOS_DUMP_TYPE_JSON_FILE, - logfp); - } else { - (void) ios_dump_args_init (&args, IOS_DUMP_TYPE_FILE, - logfp); - } - io_stats_dump (this, &args, GF_CLI_INFO_ALL, _gf_false); - fclose (logfp); + return -1; + } + sprintf (dump_key, "*io*stat*%d_json_dump", pid); + if (fnmatch (dump_key, key, 0) == 0) { + (void) ios_dump_args_init ( + &args, IOS_DUMP_TYPE_JSON_FILE, + logfp); + } else { + (void) ios_dump_args_init (&args, IOS_DUMP_TYPE_FILE, + logfp); } + io_stats_dump (this, &args, GF_CLI_INFO_ALL, _gf_false); + fclose (logfp); return 0; } @@ -2992,11 +2989,23 @@ out: return NULL; } +static gf_boolean_t +match_special_xattr (dict_t *d, char *k, data_t *val, void *mdata) +{ + gf_boolean_t ret = _gf_false; + if (fnmatch ("*io*stat*dump", k, 0) == 0) { + ret = _gf_true; + } + + return ret; +} + int io_stats_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, int32_t flags, dict_t *xdata) { + int ret = 0; struct { xlator_t *this; inode_t *inode; @@ -3007,7 +3016,13 @@ io_stats_setxattr (call_frame_t *frame, xlator_t *this, stub.inode = loc->inode; stub.path = loc->path; - dict_foreach (dict, conditional_dump, &stub); + ret = dict_foreach_match (dict, match_special_xattr, NULL, + conditional_dump, &stub); + if (ret > 0) { + /* Setxattr was on key 'io-stat-dump', hence dump and unwind + * from here */ + goto out; + } START_FOP_LATENCY (frame); @@ -3016,6 +3031,10 @@ io_stats_setxattr (call_frame_t *frame, xlator_t *this, FIRST_CHILD(this)->fops->setxattr, loc, dict, flags, xdata); return 0; + +out: + STACK_UNWIND_STRICT (setxattr, frame, 0, 0, NULL); + return 0; } |