diff options
author | Jeff Layton <jlayton@kernel.org> | 2020-12-10 14:39:26 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2021-02-16 12:09:51 +0100 |
commit | a8810cdc007f816e0e2448879ebd84152ce8c907 (patch) | |
tree | 5b95f4fe5b598e155e07842f8eabbe1c4d36eb2e /fs/ceph/inode.c | |
parent | 64f28c627a27abb053561275bf94fbcc78e66198 (diff) | |
download | lwn-a8810cdc007f816e0e2448879ebd84152ce8c907.tar.gz lwn-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.c | 6 |
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); } |