From bc8873a1651cb68a4b792bfe01d431abb3c5d7b0 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 26 May 2008 14:06:03 -0700 Subject: [PATCH] client: fix relink, memory leak in dcache --- src/client/Client.cc | 4 ++-- src/client/Client.h | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 6f5c3033cc96a..e8148b60d9da1 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -437,7 +437,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; } } @@ -452,7 +452,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 5e640a2bd05b4..f5652def6b7ec 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; -- 2.39.5