Whamcloud - gitweb
LU-16745 mdc: md_open_data should keep ref on close_req
authorLi Dongyang <dongyangli@ddn.com>
Mon, 17 Apr 2023 11:13:03 +0000 (21:13 +1000)
committerAndreas Dilger <adilger@whamcloud.com>
Mon, 12 Jun 2023 23:59:59 +0000 (23:59 +0000)
md_open_data should keep a ref on mod_close_req,
otherwise the mod_close_req could be freed before
we try to access mod_close_req via md_open_data.

Lustre-change: https://review.whamcloud.com/50656
Lustre-commit: ca716f763f89af192ab86678ee9d14f49c80cae6

Change-Id: I621f7db389854326db298d99957a0bce43024b6e
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/51198
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/include/obd.h
lustre/mdc/mdc_request.c

index 96098d4..7bdd275 100644 (file)
@@ -1262,6 +1262,8 @@ static inline struct md_open_data *obd_mod_alloc(void)
        if (atomic_dec_and_test(&(mod)->mod_refcount)) {          \
                if ((mod)->mod_open_req)                          \
                        ptlrpc_req_finished((mod)->mod_open_req); \
+               if ((mod)->mod_close_req)                         \
+                       ptlrpc_req_finished((mod)->mod_close_req);\
                OBD_FREE_PTR(mod);                                \
        }                                                         \
 })
index 343214b..b882f71 100644 (file)
@@ -1026,14 +1026,16 @@ static int mdc_close(struct obd_export *exp, struct md_op_data *op_data,
        }
 
 out:
-        if (mod) {
-                if (rc != 0)
-                        mod->mod_close_req = NULL;
-                /* Since now, mod is accessed through open_req only,
-                 * thus close req does not keep a reference on mod anymore. */
-                obd_mod_put(mod);
-        }
-        *request = req;
+       if (mod) {
+               if (rc != 0)
+                       mod->mod_close_req = NULL;
+               if (mod->mod_close_req)
+                       ptlrpc_request_addref(mod->mod_close_req);
+               /* Since now, mod is accessed through open_req only,
+                * thus close req does not keep a reference on mod anymore. */
+               obd_mod_put(mod);
+       }
+       *request = req;
 
        RETURN(rc < 0 ? rc : saved_rc);
 }