Whamcloud - gitweb
LU-15127 llite: Remove path from discard_warn 50/45550/1
authorPatrick Farrell <pfarrell@whamcloud.com>
Fri, 12 Nov 2021 16:27:42 +0000 (11:27 -0500)
committerPatrick Farrell <pfarrell@whamcloud.com>
Fri, 12 Nov 2021 16:27:42 +0000 (11:27 -0500)
commitd04a1929b3adb776173b02e0f6b82d396046dd14
tree48ec56ac3691bce063804d3c3afa877880d6be58
parent05e6ccd344e7eba44e43230fa2fa0a1b3b6115c4
LU-15127 llite: Remove path from discard_warn

It is unfortunately not safe to get the path from inside
dirty page discard warn.  It results in us getting and then
putting a bunch of dentries, and if 'dget' we do on our
file is the last reference on it, we deadlock like this:
ptlrpc_check_set
brw_interpret
osc_extent_finish
osc_ap_completion
cl_page_completion
vvp_page_completion_write
ll_dirty_page_discard_warn
dput
dentry_kill
__dentry_kill
evict
ll_delete_inode
cl_sync_file_range
cl_io_loop
cl_io_start
lov_io_call
cl_io_start
osc_io_fsync_start
osc_cache_writeback_range
osc_cache_wait_range
osc_extent_wait

ll_delete_inode is calling back in to *this file*, which
we are already working on, so this thread ends up waiting
for itself.

This is particularly common if the discard warn is racing
with an unmount, which will be destroying all the inodes
(not deleting them - just removing them from the local
VFS).

There is no way to safely get the path from this location.
If we are deeply committed to the functionality, it would
be possible to rewrite osc_extent_finish + brw_interpret
so they could attempt path lookup *after* the extent has
been completed.

This patch fixes the deadlock, any rewrite is left for
later.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I537fd0d2e110c180a1369a9a3b1a644e613b18e4
lustre/llite/llite_lib.c