From: Yan, Zheng Date: Sat, 9 Dec 2017 06:09:24 +0000 (+0800) Subject: mds: properly eval locks after importing inode X-Git-Tag: v13.0.2~768^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=debb556076c5685f0d8bb8029a95684b9e552eb8;p=ceph-ci.git mds: properly eval locks after importing inode 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" --- diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index b09ecc74d25..b8379250d6f 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -3051,7 +3051,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); }