Whamcloud - gitweb
EX-9823 osc: clear oi_write_osclock in lock fini func
authorBobi Jam <bobijam@whamcloud.com>
Thu, 30 May 2024 12:58:57 +0000 (20:58 +0800)
committerAndreas Dilger <adilger@whamcloud.com>
Thu, 6 Jun 2024 08:19:54 +0000 (08:19 +0000)
Move osc_io::oi_write_osclock clearance in osc_lock_fini() as
it's set in osc_lock_init().

Compression IO could possibly expand lock region and
osc_lock_set_writer() could access a osc_io that is not accessed
in osc_io_iter_init(), so that osc_io_rw_iter_fini() miss clearing
osc_io's oi_writer_osclock.

This patch moves the oi_write_osclock clearance in lock fini function
to match its creation in osc_lock_init().

Test-Parameters: testlist=sanity-compr env=COMPR_EXTRA_LAYOUT="-E 1M -c 1 -E eof -c 4 -Z lz4:3"
Test-Parameters: testlist=sanity-compr env=COMPR_EXTRA_LAYOUT="-E 1M -c 1 -E eof -Z lz4:3"
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ied42f5befc1abd76aa10a7666eadb9a58e1f1783
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/55261
Reviewed-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
Reviewed-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/include/lustre_osc.h
lustre/osc/osc_io.c
lustre/osc/osc_lock.c

index f99619b..21f8f76 100644 (file)
@@ -436,6 +436,8 @@ struct osc_lock {
        enum osc_lock_state     ols_state;
        /** lock value block */
        struct ost_lvb          ols_lvb;
+       /** back pointer to osc_io */
+       struct osc_io           *ols_oio;
        /** Lockless operations to be used by lockless lock */
        const struct cl_lock_operations *ols_lockless_ops;
        /**
index 6ebebf8..7777445 100644 (file)
@@ -454,8 +454,6 @@ void osc_io_rw_iter_fini(const struct lu_env *env,
                osc_lru_unreserve(osc_cli(osc), oio->oi_lru_reserved);
                oio->oi_lru_reserved = 0;
        }
-       oio->oi_write_osclock = NULL;
-       oio->oi_read_osclock = NULL;
 
        osc_io_iter_fini(env, ios);
 }
index cd1960b..a48e782 100644 (file)
@@ -120,11 +120,16 @@ static int osc_lock_invariant(struct osc_lock *ols)
 
 void osc_lock_fini(const struct lu_env *env, struct cl_lock_slice *slice)
 {
-       struct osc_lock  *ols = cl2osc_lock(slice);
+       struct osc_lock *ols = cl2osc_lock(slice);
 
        LINVRNT(osc_lock_invariant(ols));
        LASSERT(ols->ols_dlmlock == NULL);
 
+       if (ols->ols_oio) {
+               ols->ols_oio->oi_write_osclock = NULL;
+               ols->ols_oio->oi_read_osclock = NULL;
+       }
+
        OBD_SLAB_FREE_PTR(ols, osc_lock_kmem);
 }
 EXPORT_SYMBOL(osc_lock_fini);
@@ -1183,6 +1188,7 @@ void osc_lock_set_writer(const struct lu_env *env, const struct cl_io *io,
                /* There must be only one lock to match the write region */
                LASSERT(oio->oi_write_osclock == NULL);
                oio->oi_write_osclock = oscl;
+               oscl->ols_oio = oio;
        }
 }
 EXPORT_SYMBOL(osc_lock_set_writer);
@@ -1198,8 +1204,10 @@ void osc_lock_set_reader(const struct lu_env *env, const struct cl_io *io,
        if (oscl->ols_glimpse || osc_lock_is_lockless(oscl))
                return;
 
-       if (oio->oi_read_osclock == NULL)
+       if (oio->oi_read_osclock == NULL) {
                oio->oi_read_osclock = oscl;
+               oscl->ols_oio = oio;
+       }
 }
 EXPORT_SYMBOL(osc_lock_set_reader);