summaryrefslogtreecommitdiffstats
path: root/fs/ceph/inode.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@kernel.org>2020-12-10 14:39:26 -0500
committerIlya Dryomov <idryomov@gmail.com>2021-02-16 12:09:51 +0100
commita8810cdc007f816e0e2448879ebd84152ce8c907 (patch)
tree5b95f4fe5b598e155e07842f8eabbe1c4d36eb2e /fs/ceph/inode.c
parent64f28c627a27abb053561275bf94fbcc78e66198 (diff)
downloadlinux-a8810cdc007f816e0e2448879ebd84152ce8c907.tar.gz
linux-a8810cdc007f816e0e2448879ebd84152ce8c907.tar.bz2
linux-a8810cdc007f816e0e2448879ebd84152ce8c907.zip
ceph: allow queueing cap/snap handling after putting cap references
Testing with the fscache overhaul has triggered some lockdep warnings about circular lock dependencies involving page_mkwrite and the mmap_lock. It'd be better to do the "real work" without the mmap lock being held. Change the skip_checking_caps parameter in __ceph_put_cap_refs to an enum, and use that to determine whether to queue check_caps, do it synchronously or not at all. Change ceph_page_mkwrite to do a ceph_put_cap_refs_async(). Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph/inode.c')
-rw-r--r--fs/ceph/inode.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index e64ccd93350f..5d20a620e96c 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -1965,6 +1965,12 @@ static void ceph_inode_work(struct work_struct *work)
if (test_and_clear_bit(CEPH_I_WORK_VMTRUNCATE, &ci->i_work_mask))
__ceph_do_pending_vmtruncate(inode);
+ if (test_and_clear_bit(CEPH_I_WORK_CHECK_CAPS, &ci->i_work_mask))
+ ceph_check_caps(ci, 0, NULL);
+
+ if (test_and_clear_bit(CEPH_I_WORK_FLUSH_SNAPS, &ci->i_work_mask))
+ ceph_flush_snaps(ci, NULL);
+
iput(inode);
}