From 5ff58170050f567d7f14060787f91cdf68ad9de8 Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Mon, 22 Jan 2024 20:14:56 +0800 Subject: [PATCH] LU-17469 llite: hold object reference in IO There could be a race between page write and inode free, hold a cl_object reference during the IO lest accessing freed object. Lustre-change: https://review.whamcloud.com/53819 Lustre-commit: TBD (from a84242bc202e402664a5f5d7461b66c770896851) Signed-off-by: Bobi Jam Change-Id: Ic70cc27430e68265aba0662fc68e9bfe2f86cfe1 Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/53760 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Patrick Farrell Reviewed-by: Andreas Dilger --- lustre/llite/file.c | 2 ++ lustre/llite/rw.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lustre/llite/file.c b/lustre/llite/file.c index e38d944..c4dc8e4 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -4975,6 +4975,7 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end, io = vvp_env_thread_io(env); io->ci_obj = ll_i2info(inode)->lli_clob; + cl_object_get(io->ci_obj); io->ci_ignore_layout = ignore_layout; /* initialize parameters for sync */ @@ -4992,6 +4993,7 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end, if (result == 0) result = fio->fi_nr_written; cl_io_fini(env, io); + cl_object_put(env, io->ci_obj); cl_env_put(env, &refcheck); RETURN(result); diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index 103c100..a2559ea 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -1619,7 +1619,7 @@ int ll_writepages(struct address_space *mapping, struct writeback_control *wbc) #endif } - if (ll_i2info(inode)->lli_clob == NULL) + if (ll_i2info(inode)->lli_clob == NULL || (inode->i_state & I_FREEING)) RETURN(0); /* for directio, it would call writepages() to evict cached pages -- 1.8.3.1