From: Zhi Zhang Date: Thu, 18 Feb 2016 03:40:47 +0000 (+0800) Subject: [ceph-fuse] Fh ref might leak at umounting X-Git-Tag: v10.1.0~177^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=06806f7068782bf1c787aafa5ab87aa0b2eb786b;p=ceph.git [ceph-fuse] Fh ref might leak at umounting Signed-off-by: Zhi Zhang --- diff --git a/src/client/Client.cc b/src/client/Client.cc index ed67f589d168..294bbcd15e66 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5490,6 +5490,13 @@ void Client::unmount() ldout(cct, 0) << " destroyed lost open file " << fh << " on " << *fh->inode << dendl; _release_fh(fh); } + + while (!ll_unclosed_fh.empty()) { + set::iterator it = ll_unclosed_fh.begin(); + ll_unclosed_fh.erase(*it); + ldout(cct, 0) << " destroyed lost open file " << *it << " on " << *((*it)->inode) << dendl; + _release_fh(*it); + } _ll_drop_pins(); @@ -11036,6 +11043,9 @@ int Client::ll_open(Inode *in, int flags, Fh **fhp, int uid, int gid) out: Fh *fhptr = fhp ? *fhp : NULL; + if (fhptr) { + ll_unclosed_fh.insert(fhptr); + } tout(cct) << (unsigned long)fhptr << std::endl; ldout(cct, 3) << "ll_open " << vino << " " << flags << " = " << r << " (" << fhptr << ")" << dendl; @@ -11107,6 +11117,9 @@ out: attr->st_ino = 0; Fh *fhptr = fhp ? *fhp : NULL; + if (fhptr) { + ll_unclosed_fh.insert(fhptr); + } tout(cct) << (unsigned long)fhptr << std::endl; tout(cct) << attr->st_ino << std::endl; ldout(cct, 3) << "ll_create " << parent << " " << name << " 0" << oct << @@ -11502,6 +11515,8 @@ int Client::ll_release(Fh *fh) tout(cct) << "ll_release (fh)" << std::endl; tout(cct) << (unsigned long)fh << std::endl; + if (ll_unclosed_fh.count(fh)) + ll_unclosed_fh.erase(fh); return _release_fh(fh); } diff --git a/src/client/Client.h b/src/client/Client.h index a3415b099c09..18e7b3e1699f 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -421,6 +421,7 @@ protected: // file handles, etc. interval_set free_fd_set; // unused fds ceph::unordered_map fd_map; + set ll_unclosed_fh; int get_fd() { int fd = free_fd_set.range_start();