From: Andriy Skulysh Date: Tue, 11 Jan 2022 07:30:49 +0000 (+0200) Subject: LU-15477 osc: osc_extent_wait() deadlock X-Git-Tag: 2.15.0-RC1~21 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=821a8d7b481d34a54044dfe871e4532f0996de8a;p=fs%2Flustre-release.git LU-15477 osc: osc_extent_wait() deadlock Thread 1: vvp_io_write_commit osc_io_commit_async osc_page_cache_add osc_extent_find osc_extent_wait Thread 2: ptlrpcd_check ptlrpc_check_set brw_queue_work osc_extent_make_ready vvp_page_make_ready_start __lock_page We must not hold a page lock while we do osc_extent_find() Change-Id: Idf669bc8d9c943f28e3f5986826b9637d66ecfca HPE-bug-id: LUS-10414 Fixes: a7299cb012 "LU-9920 vvp: dirty pages with pagevec" Signed-off-by: Andriy Skulysh Reviewed-on: https://review.whamcloud.com/46281 Reviewed-by: Patrick Farrell Tested-by: jenkins Reviewed-by: Alexander Boyko Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/osc/osc_cache.c b/lustre/osc/osc_cache.c index 4d2e1c8..d8be376 100644 --- a/lustre/osc/osc_cache.c +++ b/lustre/osc/osc_cache.c @@ -2413,15 +2413,16 @@ int osc_queue_async_io(const struct lu_env *env, struct cl_io *io, LASSERT(ergo(grants > 0, grants >= tmp)); rc = 0; + + /* We must not hold a page lock while we do osc_enter_cache() + * or osc_extent_find(), so we must mark dirty & unlock + * any pages in the write commit pagevec. */ + if (pagevec_count(pvec)) { + cb(env, io, pvec); + pagevec_reinit(pvec); + } + if (grants == 0) { - /* We haven't allocated grant for this page, and we - * must not hold a page lock while we do enter_cache, - * so we must mark dirty & unlock any pages in the - * write commit pagevec. */ - if (pagevec_count(pvec)) { - cb(env, io, pvec); - pagevec_reinit(pvec); - } rc = osc_enter_cache(env, cli, oap, tmp); if (rc == 0) grants = tmp;