From: Jeff Layton Date: Thu, 10 Dec 2020 18:35:46 +0000 (-0500) Subject: ceph: fix flush_snap logic after putting caps X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=54fb881885cf816a8e84112518139129dcdef31a;p=ceph-client.git ceph: fix flush_snap logic after putting caps 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 --- diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index c40f713d6d21..54d2bebb8bbe 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -3085,10 +3085,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)