From 75dc1bb4bd98226cbf7a87621693784c4e4a953f Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Sun, 17 Sep 2023 13:57:15 -0400 Subject: [PATCH] LU-13814 llite: refactor ll_direct_rw_pages ll_direct_rw_pages has some oddities in the control flow, which make it a little harder to understand. Clean those up so it's easier to modify. Signed-off-by: Patrick Farrell Change-Id: I64b4639df948556da03824a71b4b30806deced0d Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52399 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin Reviewed-by: Sebastien Buisson Reviewed-by: Qian Yingjin --- lustre/llite/rw26.c | 70 +++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c index 5586468..d554f66 100644 --- a/lustre/llite/rw26.c +++ b/lustre/llite/rw26.c @@ -366,12 +366,13 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, int rw, struct inode *inode, struct cl_sub_dio *sdio) { struct ll_dio_pages *pv = &sdio->csd_dio_pages; - struct cl_page *page; - struct cl_2queue *queue = &io->ci_queue; - struct cl_object *obj = io->ci_obj; struct cl_sync_io *anchor = &sdio->csd_sync; - loff_t offset = pv->ldp_file_offset; - int io_pages = 0; + struct cl_2queue *queue = &io->ci_queue; + struct cl_object *obj = io->ci_obj; + struct cl_page *page; + int iot = rw == READ ? CRT_READ : CRT_WRITE; + loff_t offset = pv->ldp_file_offset; + int io_pages = 0; ssize_t rc = 0; int i = 0; @@ -384,10 +385,8 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, page = cl_page_find(env, obj, offset >> PAGE_SHIFT, pv->ldp_pages[i], CPT_TRANSIENT); - if (IS_ERR(page)) { - rc = PTR_ERR(page); - break; - } + if (IS_ERR(page)) + GOTO(out, rc = PTR_ERR(page)); LASSERT(page->cp_type == CPT_TRANSIENT); rc = cl_page_own(env, io, page); @@ -427,37 +426,34 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, /* on success, we should hit every page in the pvec and have no bytes * left in 'size' */ - LASSERT(ergo(rc == 0, i == pv->ldp_count)); - LASSERT(ergo(rc == 0, size == 0)); - - if (rc == 0 && io_pages > 0) { - int iot = rw == READ ? CRT_READ : CRT_WRITE; + LASSERT(i == pv->ldp_count); + LASSERT(size == 0); - atomic_add(io_pages, &anchor->csi_sync_nr); - /* - * Avoid out-of-order execution of adding inflight - * modifications count and io submit. - */ - smp_mb(); - rc = cl_io_submit_rw(env, io, iot, queue); - if (rc == 0) { - cl_page_list_splice(&queue->c2_qout, &sdio->csd_pages); - } else { - atomic_add(-queue->c2_qin.pl_nr, - &anchor->csi_sync_nr); - cl_page_list_for_each(page, &queue->c2_qin) - page->cp_sync_io = NULL; - } - /* handle partially submitted reqs */ - if (queue->c2_qin.pl_nr > 0) { - CERROR(DFID " failed to submit %d dio pages: %zd\n", - PFID(lu_object_fid(&obj->co_lu)), - queue->c2_qin.pl_nr, rc); - if (rc == 0) - rc = -EIO; - } + atomic_add(io_pages, &anchor->csi_sync_nr); + /* + * Avoid out-of-order execution of adding inflight + * modifications count and io submit. + */ + smp_mb(); + rc = cl_io_submit_rw(env, io, iot, queue); + if (rc == 0) { + cl_page_list_splice(&queue->c2_qout, &sdio->csd_pages); + } else { + atomic_add(-queue->c2_qin.pl_nr, + &anchor->csi_sync_nr); + cl_page_list_for_each(page, &queue->c2_qin) + page->cp_sync_io = NULL; + } + /* handle partially submitted reqs */ + if (queue->c2_qin.pl_nr > 0) { + CERROR(DFID " failed to submit %d dio pages: %zd\n", + PFID(lu_object_fid(&obj->co_lu)), + queue->c2_qin.pl_nr, rc); + if (rc == 0) + rc = -EIO; } +out: cl_2queue_discard(env, io, queue); cl_2queue_disown(env, queue); cl_2queue_fini(env, queue); -- 1.8.3.1