From: Sage Weil Date: Mon, 26 May 2008 21:06:03 +0000 (-0700) Subject: client: fix relink, memory leak in dcache X-Git-Tag: v0.3~170^2~54 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=23a88eede95a1915139f5eb45e43b66ed5db2c6f;p=ceph.git client: fix relink, memory leak in dcache --- diff --git a/src/client/Client.cc b/src/client/Client.cc index e30d545d4d61..0af54604bde7 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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 diff --git a/src/client/Client.h b/src/client/Client.h index 5e640a2bd05b..f5652def6b7e 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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;