]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix bug #24491 _ll_drop_pins may access invalid iterator 22786/head
authorLiuYangkuan <liuyangkuan@gmail.com>
Mon, 11 Jun 2018 15:51:16 +0000 (11:51 -0400)
committerPrashant D <pdhange@redhat.com>
Mon, 2 Jul 2018 02:58:44 +0000 (22:58 -0400)
Fixes: https://tracker.ceph.com/issues/24491
Signed-off-by: Liu Yangkuan <liuyangkuan@gmail.com>
(cherry picked from commit 97188fef8596f098aa43aa745a217b40a6c29ea4)

Conflicts:
src/client/Client.cc: Resolved in _ll_drop_pins for ldout

src/client/Client.cc

index 41eff1b4b2a247e64b534a4646a8dfd96172a8df..70b0f16f0fd719495ba184d8ad0d7b08b05e27cf 100644 (file)
@@ -10431,6 +10431,7 @@ int Client::_ll_put(Inode *in, int num)
 void Client::_ll_drop_pins()
 {
   ldout(cct, 10) << "_ll_drop_pins" << dendl;
+  std::set<InodeRef> to_be_put; //this set will be deconstructed item by item when exit
   ceph::unordered_map<vinodeno_t, Inode*>::iterator next;
   for (ceph::unordered_map<vinodeno_t, Inode*>::iterator it = inode_map.begin();
        it != inode_map.end();
@@ -10438,8 +10439,10 @@ void Client::_ll_drop_pins()
     Inode *in = it->second;
     next = it;
     ++next;
-    if (in->ll_ref)
+    if (in->ll_ref){
+      to_be_put.insert(in);
       _ll_put(in, in->ll_ref);
+    }
   }
 }