ceph: fix flush_snap logic after putting caps
[ Upstream commit 64f36da5625f7f9853b86750eaa89d499d16a2e9 ] A primary reason for skipping ceph_check_caps after putting the references was to avoid the locking in ceph_check_caps during a reconnect. __ceph_put_cap_refs can still call ceph_flush_snaps in that case though, and that takes many of the same inconvenient locks. Fix the logic in __ceph_put_cap_refs to skip flushing snaps when the skip_checking_caps flag is set. Fixes: e64f44a88465 ("ceph: skip checking caps when session reconnecting and releasing reqs") Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
426b8fb3d6
commit
95f432c0a3
@ -3092,10 +3092,12 @@ static void __ceph_put_cap_refs(struct ceph_inode_info *ci, int had,
|
||||
dout("put_cap_refs %p had %s%s%s\n", inode, ceph_cap_string(had),
|
||||
last ? " last" : "", put ? " put" : "");
|
||||
|
||||
if (last && !skip_checking_caps)
|
||||
ceph_check_caps(ci, 0, NULL);
|
||||
else if (flushsnaps)
|
||||
ceph_flush_snaps(ci, NULL);
|
||||
if (!skip_checking_caps) {
|
||||
if (last)
|
||||
ceph_check_caps(ci, 0, NULL);
|
||||
else if (flushsnaps)
|
||||
ceph_flush_snaps(ci, NULL);
|
||||
}
|
||||
if (wake)
|
||||
wake_up_all(&ci->i_cap_wq);
|
||||
while (put-- > 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user