From: Bobi Jam Date: Thu, 30 May 2024 12:58:57 +0000 (+0800) Subject: EX-9823 osc: clear oi_write_osclock in lock fini func X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=f57a008044db262f95c2f6c13abafbd7c215bfdf;p=fs%2Flustre-release.git EX-9823 osc: clear oi_write_osclock in lock fini func 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 Change-Id: Ied42f5befc1abd76aa10a7666eadb9a58e1f1783 Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/55261 Reviewed-by: Vitaliy Kuznetsov Reviewed-by: Artem Blagodarenko Reviewed-by: Andreas Dilger Tested-by: Maloo --- diff --git a/lustre/include/lustre_osc.h b/lustre/include/lustre_osc.h index f99619b..21f8f76 100644 --- a/lustre/include/lustre_osc.h +++ b/lustre/include/lustre_osc.h @@ -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; /** diff --git a/lustre/osc/osc_io.c b/lustre/osc/osc_io.c index 6ebebf8..7777445 100644 --- a/lustre/osc/osc_io.c +++ b/lustre/osc/osc_io.c @@ -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); } diff --git a/lustre/osc/osc_lock.c b/lustre/osc/osc_lock.c index cd1960b..a48e782 100644 --- a/lustre/osc/osc_lock.c +++ b/lustre/osc/osc_lock.c @@ -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);