]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: be more explicit about path_traverse completion
authorSage Weil <sage@inktank.com>
Fri, 10 May 2013 21:14:52 +0000 (14:14 -0700)
committerSage Weil <sage@inktank.com>
Fri, 10 May 2013 21:30:23 +0000 (14:30 -0700)
Coverity turned up

CID 717085 (#1 of 1): Resource leak (RESOURCE_LEAK)
10. leaked_storage: Variable "c" going out of scope leaks the storage it points to.

from _find_ino_dir(), but for all r > 0 cases fin is consumed.  Make this
a bit more explicit by using the helper in the mdr-only case, and by
asserting it is zero in the return 2 path.  Hopefully coverity will notice.

Signed-off-by: Sage Weil <sage@inktank.com>
src/mds/MDCache.cc

index 191d04d6e6efb6c57ffc70759ac3d2fd2b8def5c..e69d37ee256f656ddfbfd70fd627e3d3584d0ba1 100644 (file)
@@ -7172,8 +7172,9 @@ int MDCache::path_traverse(MDRequest *mdr, Message *req, Context *fin,     // wh
 
     // make sure snaprealm parents are open...
     if (cur->snaprealm && !cur->snaprealm->open && mdr &&
-       !cur->snaprealm->open_parents(new C_MDS_RetryRequest(this, mdr)))
+       !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) {
       return 1;
+    }
 
 
     // dentry
@@ -7371,6 +7372,7 @@ int MDCache::path_traverse(MDRequest *mdr, Message *req, Context *fin,     // wh
          mds->forward_message_mds(req, dauth.first);
        
        if (mds->logger) mds->logger->inc(l_mds_tfw);
+       assert(fin == NULL);
        return 2;
       }    
     }
@@ -7903,8 +7905,8 @@ void MDCache::_find_ino_dir(inodeno_t ino, Context *fin, bufferlist& bl, int r)
   c->bl = bl;
   r = path_traverse(NULL, NULL, c, path, &trace, NULL, MDS_TRAVERSE_DISCOVER);
   if (r > 0)
-    return; 
-  delete c;  // path_traverse doesn't clean it up for us.
+    return;
+  delete c;  // path_traverse doesn't clean it up for us for r <= 0
   
   fin->finish(r);
   delete fin;