]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ceph: clean up and optimize ceph_check_delayed_caps()
authorJeff Layton <jlayton@kernel.org>
Tue, 30 Jun 2020 19:36:21 +0000 (15:36 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 3 Aug 2020 09:05:21 +0000 (11:05 +0200)
Make this loop look a bit more sane. Also optimize away the spinlock
release/reacquire if we can't get an inode reference.

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

index 5f4894063a738e98c1f87b2c6b58e9b227e0ac70..55ccccf77ceab50cba27ec82f9eb8cb29408ded0 100644 (file)
@@ -4189,10 +4189,8 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
        struct ceph_inode_info *ci;
 
        dout("check_delayed_caps\n");
-       while (1) {
-               spin_lock(&mdsc->cap_delay_lock);
-               if (list_empty(&mdsc->cap_delay_list))
-                       break;
+       spin_lock(&mdsc->cap_delay_lock);
+       while (!list_empty(&mdsc->cap_delay_list)) {
                ci = list_first_entry(&mdsc->cap_delay_list,
                                      struct ceph_inode_info,
                                      i_cap_delay_list);
@@ -4202,13 +4200,13 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
                list_del_init(&ci->i_cap_delay_list);
 
                inode = igrab(&ci->vfs_inode);
-               spin_unlock(&mdsc->cap_delay_lock);
-
                if (inode) {
+                       spin_unlock(&mdsc->cap_delay_lock);
                        dout("check_delayed_caps on %p\n", inode);
                        ceph_check_caps(ci, 0, NULL);
                        /* avoid calling iput_final() in tick thread */
                        ceph_async_iput(inode);
+                       spin_lock(&mdsc->cap_delay_lock);
                }
        }
        spin_unlock(&mdsc->cap_delay_lock);