ceph: don't take i_ceph_lock in handle_cap_import
authorJeff Layton <jlayton@kernel.org>
Thu, 19 Mar 2020 16:00:16 +0000 (12:00 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 1 Jun 2020 11:22:52 +0000 (13:22 +0200)
Just take it before calling it. This means we have to do a couple of
minor in-memory operations under the spinlock now, but those shouldn't
be an issue.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c

index 34aa9f4..f135660 100644 (file)
@@ -3805,7 +3805,6 @@ static void handle_cap_import(struct ceph_mds_client *mdsc,
                              struct ceph_mds_cap_peer *ph,
                              struct ceph_mds_session *session,
                              struct ceph_cap **target_cap, int *old_issued)
-       __acquires(ci->i_ceph_lock)
 {
        struct ceph_inode_info *ci = ceph_inode(inode);
        struct ceph_cap *cap, *ocap, *new_cap = NULL;
@@ -3830,14 +3829,13 @@ static void handle_cap_import(struct ceph_mds_client *mdsc,
 
        dout("handle_cap_import inode %p ci %p mds%d mseq %d peer %d\n",
             inode, ci, mds, mseq, peer);
-
 retry:
-       spin_lock(&ci->i_ceph_lock);
        cap = __get_cap_for_mds(ci, mds);
        if (!cap) {
                if (!new_cap) {
                        spin_unlock(&ci->i_ceph_lock);
                        new_cap = ceph_get_cap(mdsc, NULL);
+                       spin_lock(&ci->i_ceph_lock);
                        goto retry;
                }
                cap = new_cap;
@@ -4051,6 +4049,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
                } else {
                        down_read(&mdsc->snap_rwsem);
                }
+               spin_lock(&ci->i_ceph_lock);
                handle_cap_import(mdsc, inode, h, peer, session,
                                  &cap, &extra_info.issued);
                handle_cap_grant(inode, session, cap,