Whamcloud - gitweb
LU-16612 llite: protect cp_state with vmpage lock 80/50180/2
authorBobi Jam <bobijam@whamcloud.com>
Thu, 2 Mar 2023 09:39:01 +0000 (17:39 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 21 Mar 2023 23:11:30 +0000 (23:11 +0000)
cl_page_make_ready() calls cl_page_io_start() without vmpage lock
protection, and that could mess up cl_page's cp_state/cp_owner.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id0df7e14246aa561494a9b6e581cebc55241c4b9
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/50180
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/obdclass/cl_page.c

index 42e1630..8593731 100644 (file)
@@ -989,6 +989,7 @@ int cl_page_make_ready(const struct lu_env *env, struct cl_page *cp,
                       enum cl_req_type crt)
 {
        struct page *vmpage = cp->cp_vmpage;
+       bool unlock = false;
        int rc;
 
        ENTRY;
@@ -998,6 +999,7 @@ int cl_page_make_ready(const struct lu_env *env, struct cl_page *cp,
                GOTO(out, rc = 0);
 
        lock_page(vmpage);
+       unlock = true;
 
        if (clear_page_dirty_for_io(vmpage)) {
                LASSERT(cp->cp_state == CPS_CACHED);
@@ -1019,13 +1021,15 @@ int cl_page_make_ready(const struct lu_env *env, struct cl_page *cp,
                LBUG();
        }
 
-       unlock_page(vmpage);
 out:
        if (rc == 0) {
                PASSERT(env, cp, cp->cp_state == CPS_CACHED);
                cl_page_io_start(env, cp, crt);
        }
 
+       if (unlock)
+               unlock_page(vmpage);
+
        CL_PAGE_HEADER(D_TRACE, env, cp, "%d %d\n", crt, rc);
 
        return rc;