Whamcloud - gitweb
LU-15477 osc: osc_extent_wait() deadlock 81/46281/2
authorAndriy Skulysh <c17819@cray.com>
Tue, 11 Jan 2022 07:30:49 +0000 (09:30 +0200)
committerOleg Drokin <green@whamcloud.com>
Mon, 31 Jan 2022 01:37:27 +0000 (01:37 +0000)
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 <andriy.skulysh@hpe.com>
Reviewed-on: https://review.whamcloud.com/46281
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Alexander Boyko <alexander.boyko@hpe.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osc/osc_cache.c

index 4d2e1c8..d8be376 100644 (file)
@@ -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;