Whamcloud - gitweb
LU-13814 llite: refactor ll_direct_rw_pages 99/52399/4
authorPatrick Farrell <pfarrell@whamcloud.com>
Sun, 17 Sep 2023 17:57:15 +0000 (13:57 -0400)
committerOleg Drokin <green@whamcloud.com>
Fri, 23 Feb 2024 07:00:20 +0000 (07:00 +0000)
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 <pfarrell@whamcloud.com>
Change-Id: I64b4639df948556da03824a71b4b30806deced0d
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52399
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Sebastien Buisson <sbuisson@ddn.com>
Reviewed-by: Qian Yingjin <qian@ddn.com>
lustre/llite/rw26.c

index 5586468..d554f66 100644 (file)
@@ -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);