From f2afaf4eb10d70c36ad6bdbc2def66bee4fcdc23 Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Sun, 24 Sep 2023 17:19:34 -0400 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. Test-Parameters: fortestonly Test-Parameters: forjanitoronly Signed-off-by: Patrick Farrell Change-Id: I509f6cfbae8e5a6ec6b07c8253d68f6dd2794e59 --- lustre/include/cl_object.h | 6 +----- lustre/llite/file.c | 2 +- lustre/llite/llite_lib.c | 4 ++-- lustre/llite/rw.c | 10 +++++----- lustre/llite/rw26.c | 4 ++-- lustre/llite/vvp_io.c | 2 +- lustre/obdclass/cl_page.c | 21 +++++++++------------ 7 files changed, 21 insertions(+), 28 deletions(-) diff --git a/lustre/include/cl_object.h b/lustre/include/cl_object.h index d613b5a..cd33305 100644 --- a/lustre/include/cl_object.h +++ b/lustre/include/cl_object.h @@ -2236,12 +2236,8 @@ struct cl_page *cl_page_find (const struct lu_env *env, struct cl_io *io, 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_io *io, - struct cl_object *o, pgoff_t ind, - struct page *vmpage, - enum cl_page_type type); void cl_page_get (struct cl_page *page); void cl_page_put (const struct lu_env *env, struct cl_page *page); diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 2abc902..39335da 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -603,7 +603,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, io, obj, vmpage->index, vmpage, + page = cl_page_find(env, io, 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 0079307..5344d9e 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -2079,8 +2079,8 @@ static 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, io, clob, vmpage->index, - vmpage, CPT_CACHEABLE); + clpage = cl_page_find(env, io, clob, vmpage->index, 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 163c232..17d4576a 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -249,7 +249,8 @@ static int ll_read_ahead_page(const struct lu_env *env, struct cl_io *io, GOTO(out, rc = -EBUSY); } - cp = cl_page_find(env, io, clob, vmpage->index, vmpage, CPT_CACHEABLE); + cp = cl_page_find(env, io, clob, vmpage->index, vmpage, inode, + CPT_CACHEABLE); if (IS_ERR(cp)) { which = RA_STAT_FAILED_GRAB_PAGE; msg = "cl_page_find failed"; @@ -1484,8 +1485,8 @@ int ll_writepage(struct page *vmpage, struct writeback_control *wbc) io->ci_ignore_layout = 1; result = cl_io_init(env, io, CIT_MISC, clob); if (result == 0) { - page = cl_page_find(env, io, clob, vmpage->index, - vmpage, CPT_CACHEABLE); + page = cl_page_find(env, io, clob, vmpage->index, vmpage, inode, + CPT_CACHEABLE); if (!IS_ERR(page)) { lu_ref_add(&page->cp_reference, "writepage", current); @@ -1921,7 +1922,6 @@ int ll_readpage(struct file *file, struct page *vmpage) } if (io == NULL) { /* fast read */ - struct inode *inode = file_inode(file); struct ll_file_data *fd = file->private_data; struct ll_readahead_state *ras = &fd->fd_ras; struct lu_env *local_env = NULL; @@ -2034,7 +2034,7 @@ int ll_readpage(struct file *file, struct page *vmpage) } LASSERT(io->ci_state == CIS_IO_GOING); - page = cl_page_find(env, io, clob, vmpage->index, vmpage, + page = cl_page_find(env, io, clob, vmpage->index, vmpage, inode, CPT_CACHEABLE); if (!IS_ERR(page)) { LASSERT(page->cp_type == CPT_CACHEABLE); diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c index c1a538c..ff4b1e0 100644 --- a/lustre/llite/rw26.c +++ b/lustre/llite/rw26.c @@ -328,7 +328,7 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, size_t to = min(from + size, PAGE_SIZE); page = cl_page_find(env, io, obj, offset >> PAGE_SHIFT, - cdp->cdp_pages[i], CPT_TRANSIENT); + cdp->cdp_pages[i], inode, CPT_TRANSIENT); if (IS_ERR(page)) GOTO(out, rc = PTR_ERR(page)); @@ -805,7 +805,7 @@ again: goto again; } - page = cl_page_find(env, io, clob, vmpage->index, vmpage, + page = cl_page_find(env, io, 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 6f69f23..b30bc714 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -1566,7 +1566,7 @@ static int vvp_io_fault_start(const struct lu_env *env, } } - page = cl_page_find(env, io, obj, fio->ft_index, vmpage, + page = cl_page_find(env, io, 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 2bc2909..5291398 100644 --- a/lustre/obdclass/cl_page.c +++ b/lustre/obdclass/cl_page.c @@ -371,9 +371,11 @@ check: return cl_page; } -struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_io *io, - struct cl_object *o, pgoff_t ind, - struct page *vmpage, enum cl_page_type type) +static struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_io *io, + struct cl_object *o, + pgoff_t ind, struct page *vmpage, + struct inode *inode, + enum cl_page_type type) { struct cl_page *cl_page; struct cl_object *head; @@ -400,13 +402,7 @@ struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_io *io, if (cl_page->cp_type != CPT_TRANSIENT) cl_page->cp_state = CPS_CACHED; cl_page->cp_type = type; - if (type == CPT_TRANSIENT) - /* ref to correct inode will be added - * in ll_direct_rw_pages - */ - cl_page->cp_inode = NULL; - else - cl_page->cp_inode = page2inode(vmpage); + cl_page->cp_inode = inode; INIT_LIST_HEAD(&cl_page->cp_batch); lu_ref_init(&cl_page->cp_reference); head = o; @@ -448,6 +444,7 @@ struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_io *io, struct cl_page *cl_page_find(const struct lu_env *env, struct cl_io *io, struct cl_object *o, pgoff_t idx, struct page *vmpage, + struct inode *inode, enum cl_page_type type) { struct cl_page *page = NULL; @@ -484,8 +481,8 @@ struct cl_page *cl_page_find(const struct lu_env *env, struct cl_io *io, } } - /* allocate and initialize cl_page */ - page = cl_page_alloc(env, io, o, idx, vmpage, type); + /* allocate and initialize cl_page */ + page = cl_page_alloc(env, io, o, idx, vmpage, inode, type); RETURN(page); } EXPORT_SYMBOL(cl_page_find); -- 1.8.3.1