From d4b68aedcf797ebaf977392ecd0ec52fab23b7dc Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Fri, 29 Sep 2023 21:19:06 +0100 Subject: [PATCH] LU-13814 clio: add cp_inode to page allocation cp_inode can be set correctly during page allocation, rather than after. This is a prelude to moving cp_inode to the osc_transfer_page, but that's better done in a separate patch. Lustre-change: https://review.whamcloud.com/52208 Lustre-commit: TBD (from f2afaf4eb10d70c36ad6bdbc2def66bee4fcdc23) Signed-off-by: Patrick Farrell Signed-off-by: Artem Blagodarenko Change-Id: I509f6cfbae8e5a6ec6b07c8253d68f6dd2794e59 Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/52557 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/include/cl_object.h | 2 ++ lustre/llite/file.c | 2 +- lustre/llite/llite_lib.c | 2 +- lustre/llite/rw.c | 8 +++++--- lustre/llite/rw26.c | 5 +++-- lustre/llite/vvp_io.c | 3 ++- lustre/obdclass/cl_page.c | 5 ++++- lustre/obdecho/echo_client.c | 3 ++- 8 files changed, 20 insertions(+), 10 deletions(-) diff --git a/lustre/include/cl_object.h b/lustre/include/cl_object.h index 1475adf..47f2288 100644 --- a/lustre/include/cl_object.h +++ b/lustre/include/cl_object.h @@ -2297,10 +2297,12 @@ static inline int cl_object_refc(struct cl_object *clob) struct cl_page *cl_page_find (const struct lu_env *env, struct cl_object *obj, pgoff_t idx, struct page *vmpage, + struct inode *inode, enum cl_page_type type); struct cl_page *cl_page_alloc (const struct lu_env *env, struct cl_object *o, pgoff_t ind, struct page *vmpage, + struct inode *inode, enum cl_page_type type); void cl_page_get (struct cl_page *page); void cl_page_put (const struct lu_env *env, diff --git a/lustre/llite/file.c b/lustre/llite/file.c index f276f1b..6427128 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -609,7 +609,7 @@ void ll_dom_finish_open(struct inode *inode, struct ptlrpc_request *req) break; } /* attach VM page to CL page cache */ - page = cl_page_find(env, obj, vmpage->index, vmpage, + page = cl_page_find(env, obj, vmpage->index, vmpage, inode, CPT_CACHEABLE); if (IS_ERR(page)) { ClearPageUptodate(vmpage); diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index ef668ec..22127bc 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1962,7 +1962,7 @@ int ll_io_zero_page(struct inode *inode, pgoff_t index, pgoff_t offset, if (!PageDirty(vmpage)) { /* associate cl_page */ clpage = cl_page_find(env, clob, vmpage->index, - vmpage, CPT_CACHEABLE); + vmpage, inode, CPT_CACHEABLE); if (IS_ERR(clpage)) GOTO(pagefini, rc = PTR_ERR(clpage)); diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index 7e37afa..44d2ef6 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -242,7 +242,8 @@ static int ll_read_ahead_page(const struct lu_env *env, struct cl_io *io, GOTO(out, rc = -EBUSY); } - page = cl_page_find(env, clob, vmpage->index, vmpage, CPT_CACHEABLE); + page = cl_page_find(env, clob, vmpage->index, vmpage, inode, + CPT_CACHEABLE); if (IS_ERR(page)) { which = RA_STAT_FAILED_GRAB_PAGE; msg = "cl_page_find failed"; @@ -1498,7 +1499,7 @@ int ll_writepage(struct page *vmpage, struct writeback_control *wbc) result = cl_io_init(env, io, CIT_MISC, clob); if (result == 0) { page = cl_page_find(env, clob, vmpage->index, - vmpage, CPT_CACHEABLE); + vmpage, inode, CPT_CACHEABLE); if (!IS_ERR(page)) { lu_ref_add(&page->cp_reference, "writepage", current); @@ -2047,7 +2048,8 @@ int ll_readpage(struct file *file, struct page *vmpage) } LASSERT(io->ci_state == CIS_IO_GOING); - page = cl_page_find(env, clob, vmpage->index, vmpage, CPT_CACHEABLE); + page = cl_page_find(env, clob, vmpage->index, vmpage, inode, + CPT_CACHEABLE); if (!IS_ERR(page)) { LASSERT(page->cp_type == CPT_CACHEABLE); if (likely(!PageUptodate(vmpage))) { diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c index cd2d9b5..3230592 100644 --- a/lustre/llite/rw26.c +++ b/lustre/llite/rw26.c @@ -382,7 +382,7 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, for (i = 0; i < pv->ldp_count; i++) { LASSERT(!(offset & (PAGE_SIZE - 1))); page = cl_page_find(env, obj, cl_index(obj, offset), - pv->ldp_pages[i], CPT_TRANSIENT); + pv->ldp_pages[i], inode, CPT_TRANSIENT); if (IS_ERR(page)) { rc = PTR_ERR(page); break; @@ -821,7 +821,8 @@ again: goto again; } - page = cl_page_find(env, clob, vmpage->index, vmpage, CPT_CACHEABLE); + page = cl_page_find(env, clob, vmpage->index, vmpage, inode, + CPT_CACHEABLE); if (IS_ERR(page)) GOTO(out, result = PTR_ERR(page)); diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index 0f88a40..2abddac 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -1631,7 +1631,8 @@ static int vvp_io_fault_start(const struct lu_env *env, } } - page = cl_page_find(env, obj, fio->ft_index, vmpage, CPT_CACHEABLE); + page = cl_page_find(env, obj, fio->ft_index, vmpage, inode, + CPT_CACHEABLE); if (IS_ERR(page)) GOTO(out, result = PTR_ERR(page)); diff --git a/lustre/obdclass/cl_page.c b/lustre/obdclass/cl_page.c index af52311..b179fc4 100644 --- a/lustre/obdclass/cl_page.c +++ b/lustre/obdclass/cl_page.c @@ -269,6 +269,7 @@ check: struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_object *o, pgoff_t ind, struct page *vmpage, + struct inode *inode, enum cl_page_type type) { struct cl_page *cl_page; @@ -295,6 +296,7 @@ struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_object *o, cl_page->cp_vmpage = vmpage; cl_page->cp_state = CPS_CACHED; cl_page->cp_type = type; + cl_page->cp_inode = inode; if (type == CPT_TRANSIENT) /* ref to correct inode will be added * in ll_direct_rw_pages @@ -344,6 +346,7 @@ struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_object *o, struct cl_page *cl_page_find(const struct lu_env *env, struct cl_object *o, pgoff_t idx, struct page *vmpage, + struct inode *inode, enum cl_page_type type) { struct cl_page *page = NULL; @@ -381,7 +384,7 @@ struct cl_page *cl_page_find(const struct lu_env *env, } /* allocate and initialize cl_page */ - page = cl_page_alloc(env, o, idx, vmpage, type); + page = cl_page_alloc(env, o, idx, vmpage, inode, type); RETURN(page); } EXPORT_SYMBOL(cl_page_find); diff --git a/lustre/obdecho/echo_client.c b/lustre/obdecho/echo_client.c index 8c1f824..86beda5 100644 --- a/lustre/obdecho/echo_client.c +++ b/lustre/obdecho/echo_client.c @@ -1378,8 +1378,9 @@ static int cl_echo_object_brw(struct echo_object *eco, int rw, u64 offset, for (i = 0; i < npages; i++) { LASSERT(pages[i]); + /* TDB: need pass inode here */ clp = cl_page_find(env, obj, cl_index(obj, offset), - pages[i], CPT_TRANSIENT); + pages[i], NULL, CPT_TRANSIENT); if (IS_ERR(clp)) { rc = PTR_ERR(clp); break; -- 1.8.3.1