diff options
| author | Raghavendra G <raghavendra@gluster.com> | 2013-06-20 14:04:10 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-07-10 19:44:25 -0700 | 
| commit | 02c0b6f0fcd6e9c678b170a8150d2b79942724ef (patch) | |
| tree | 4ca2903e62db3f15aa36df55c229b77c464385b2 | |
| parent | 72aef87eeddc59428af67f2e6a666839b0ddd09c (diff) | |
performance/io-cache: check for non-null gfid before calling inode_path
A new non-linked inode is added to lru list. Hence it might be possible
that gfid might be NULL when inode_dump is called. To pass asserts in
inode_path, we've to check for non-null gfid before invoking that
procedure.
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Change-Id: Iff14efc6d6e2faa33b9f7a81e0a66f6a947b77ed
BUG: 976189
Reviewed-on: http://review.gluster.org/5241
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | xlators/performance/io-cache/src/io-cache.c | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/xlators/performance/io-cache/src/io-cache.c b/xlators/performance/io-cache/src/io-cache.c index d0667e46944..f56a574564a 100644 --- a/xlators/performance/io-cache/src/io-cache.c +++ b/xlators/performance/io-cache/src/io-cache.c @@ -1912,11 +1912,11 @@ int  ioc_inode_dump (xlator_t *this, inode_t *inode)  { -        char          *path                           = NULL; +        char         *path                            = NULL;          int           ret                             = -1;          char          key_prefix[GF_DUMP_MAX_BUF_LEN] = {0, };          uint64_t      tmp_ioc_inode                   = 0; -        ioc_inode_t   *ioc_inode                      = NULL; +        ioc_inode_t  *ioc_inode                       = NULL;          gf_boolean_t  section_added                   = _gf_false;          char          uuid_str[64]                    = {0,}; @@ -1930,9 +1930,6 @@ ioc_inode_dump (xlator_t *this, inode_t *inode)          if (ioc_inode == NULL)                  goto out; -        gf_proc_dump_add_section (key_prefix); -        section_added = _gf_true; -          /* Similar to ioc_page_dump function its better to use           * pthread_mutex_trylock and not to use gf_log in statedump           * to avoid deadlocks. @@ -1940,24 +1937,30 @@ ioc_inode_dump (xlator_t *this, inode_t *inode)          ret = pthread_mutex_trylock (&ioc_inode->inode_lock);          if (ret)                  goto out; -        else +          { -                gf_proc_dump_write ("inode.weight", "%d", ioc_inode->weight); +                if (uuid_is_null (ioc_inode->inode->gfid)) +                        goto unlock; + +                gf_proc_dump_add_section (key_prefix); +                section_added = _gf_true; -                //inode_path takes blocking lock on the itable.                  __inode_path (ioc_inode->inode, NULL, &path); +                gf_proc_dump_write ("inode.weight", "%d", ioc_inode->weight); +                  if (path) {                          gf_proc_dump_write ("path", "%s", path);                          GF_FREE (path);                  } +                  gf_proc_dump_write ("uuid", "%s", uuid_utoa_r                                      (ioc_inode->inode->gfid, uuid_str));                  __ioc_cache_dump (ioc_inode, key_prefix);                  __ioc_inode_waitq_dump (ioc_inode, key_prefix); - -                pthread_mutex_unlock (&ioc_inode->inode_lock);          } +unlock: +        pthread_mutex_unlock (&ioc_inode->inode_lock);  out:          if (ret && ioc_inode) {  | 
