]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: properly eval locks after importing inode 19646/head
authorYan, Zheng <zyan@redhat.com>
Sat, 9 Dec 2017 06:09:24 +0000 (14:09 +0800)
committerPrashant D <pdhange@redhat.com>
Fri, 22 Dec 2017 02:56:33 +0000 (21:56 -0500)
We should call Locker:eval() for all imported inodes who have non-zero
'wanted caps'. MDS does not properly handle following case.

- client open a inode for read, it send a cap message to MDS.a (the cap
  message updates 'wanted caps')
- MDS.a receive the cap message, the inode is non-auth and is ambiguous
  auth. MDS.a can not request 'wanted caps' from auth mds.
- MDS.a finishes importing the inode from. But no caps are imported and
  mds_caps_wanted map is empty.

The bug can cause read hang.

Fixes: http://tracker.ceph.com/issues/22357
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit debb556076c5685f0d8bb8029a95684b9e552eb8)

src/mds/Migrator.cc

index 6603e4f1a96662a6806214aa69509bc9b5ef723a..9e7caad8947278dbdcb6dcc0f5229d8620fb9caf 100644 (file)
@@ -2987,7 +2987,7 @@ void Migrator::decode_import_inode_caps(CInode *in, bool auth_cap,
   if (auth_cap)
     ::decode(in->get_mds_caps_wanted(), blp);
   if (!cap_map.empty() ||
-      (auth_cap && !in->get_mds_caps_wanted().empty())) {
+      (auth_cap && (in->get_caps_wanted() & ~CEPH_CAP_PIN))) {
     peer_exports[in].swap(cap_map);
     in->get(CInode::PIN_IMPORTINGCAPS);
   }