]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix relink, memory leak in dcache
authorSage Weil <sage@newdream.net>
Mon, 26 May 2008 21:06:03 +0000 (14:06 -0700)
committerSage Weil <sage@newdream.net>
Mon, 26 May 2008 21:06:03 +0000 (14:06 -0700)
src/client/Client.cc
src/client/Client.h

index e30d545d4d61eb3f922b83841a48b564431b0f60..0af54604bde72942a4081491dc59c8d52444a72c 100644 (file)
@@ -438,7 +438,7 @@ Inode* Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dle
       dout(12) << " had dentry " << dname
                << " with WRONG ino " << dn->inode->inode.ino
                << dendl;
-      unlink(dn);
+      unlink(dn, true);
       dn = NULL;
     }
   }
@@ -453,7 +453,7 @@ Inode* Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dle
         dout(12) << " had ino " << in->inode.ino
                  << " not linked or linked at the right position, relinking"
                  << dendl;
-        dn = relink(dir, dname, in);
+        dn = relink_inode(dir, dname, in);
       } else {
         // link
         dout(12) << " had ino " << in->inode.ino
index 5e640a2bd05b4d128c495dda72077d7fcf6891f3..f5652def6b7ecd208b20fc1879e13ba133f36bf7 100644 (file)
@@ -646,7 +646,7 @@ protected:
     return dn;
   }
 
-  void unlink(Dentry *dn) {
+  void unlink(Dentry *dn, bool keepdir = false) {
     Inode *in = dn->inode;
     assert(in->dn == dn);
 
@@ -658,7 +658,7 @@ protected:
         
     // unlink from dir
     dn->dir->dentries.erase(dn->name);
-    if (dn->dir->is_empty()) 
+    if (dn->dir->is_empty() && !keepdir
       close_dir(dn->dir);
     dn->dir = 0;
 
@@ -667,7 +667,7 @@ protected:
     delete dn;
   }
 
-  Dentry *relink(Dir *dir, const string& name, Inode *in) {
+  Dentry *relink_inode(Dir *dir, const string& name, Inode *in) {
     Dentry *olddn = in->dn;
     Dir *olddir = olddn->dir;  // note: might == dir!
 
@@ -688,6 +688,7 @@ protected:
     olddn->inode = 0;
     olddn->dir = 0;
     lru.lru_remove(olddn);
+    delete olddn;
     
     // link new dn to dir
     dir->dentries[name] = newdn;