Whamcloud - gitweb
EX-3686 revert: "LU-13799 llite: Adjust dio refcounting"
authorJames Nunez <jnunez@whamcloud.com>
Wed, 1 Sep 2021 15:14:03 +0000 (15:14 +0000)
committerAndreas Dilger <adilger@whamcloud.com>
Thu, 2 Sep 2021 02:14:46 +0000 (02:14 +0000)
This reverts commit 8a31964534358dd1a5db6cf86b9c6014d3c98d48
("LU-13799 llite: Adjust dio refcounting")

This patch is causing several tests to crash with messages
similar to the following:

  BUG: Bad page state in process ptlrpcd_01_01
  BUG: Bad page map in process iozone
  page:ffffdafec7f35640 count:0 mapcount:-1 mapping: (null) index:0x7f5
  page flags: 0x6fffff00080018(uptodate|dirty|swapbacked)
  page dumped because: bad pte
    addr:7f5524800000 vm_flags:8100073
    anon_vma:ffff9e8465843fa0 mapping: (null) index:7f5524800
  WARNING: CPU: 1 PID: 9325 at lib/list_debug.c:62 list_del corruption

Test-Parameters: trivial testlist=sanity
Test-Parameters: testlist=sanity-lfsck
Test-Parameters: testlist=sanity-dom
Test-Parameters: testlist=sanity-flr
Test-Parameters: testlist=replay-single

Change-Id: I97b77b671ff0dea4cd13428f700b7643d9e94f09
Signed-off-by: James Nunez <jnunez@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/44806
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/include/cl_object.h
lustre/llite/llite_lib.c
lustre/llite/rw.c
lustre/llite/rw26.c
lustre/llite/vvp_io.c
lustre/llite/vvp_page.c
lustre/obdclass/cl_io.c
lustre/obdecho/echo_client.c

index 00f4553..10a70b0 100644 (file)
@@ -2528,35 +2528,33 @@ static inline struct cl_page *cl_page_list_first(struct cl_page_list *plist)
 #define cl_page_list_for_each_safe(page, temp, list)                    \
        list_for_each_entry_safe((page), (temp), &(list)->pl_pages, cp_batch)
 
-void cl_page_list_init(struct cl_page_list *plist);
-void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page,
-                     bool get_ref);
-void cl_page_list_move(struct cl_page_list *dst, struct cl_page_list *src,
-                      struct cl_page *page);
+void cl_page_list_init   (struct cl_page_list *plist);
+void cl_page_list_add    (struct cl_page_list *plist, struct cl_page *page);
+void cl_page_list_move   (struct cl_page_list *dst, struct cl_page_list *src,
+                          struct cl_page *page);
 void cl_page_list_move_head(struct cl_page_list *dst, struct cl_page_list *src,
-                           struct cl_page *page);
-void cl_page_list_splice(struct cl_page_list *list,
-                        struct cl_page_list *head);
-void cl_page_list_del(const struct lu_env *env,
-                     struct cl_page_list *plist, struct cl_page *page);
-void cl_page_list_disown(const struct lu_env *env,
-                        struct cl_io *io, struct cl_page_list *plist);
-void cl_page_list_assume(const struct lu_env *env,
-                        struct cl_io *io, struct cl_page_list *plist);
+                         struct cl_page *page);
+void cl_page_list_splice (struct cl_page_list *list,
+                          struct cl_page_list *head);
+void cl_page_list_del    (const struct lu_env *env,
+                          struct cl_page_list *plist, struct cl_page *page);
+void cl_page_list_disown (const struct lu_env *env,
+                          struct cl_io *io, struct cl_page_list *plist);
+void cl_page_list_assume (const struct lu_env *env,
+                          struct cl_io *io, struct cl_page_list *plist);
 void cl_page_list_discard(const struct lu_env *env,
-                         struct cl_io *io, struct cl_page_list *plist);
-void cl_page_list_fini(const struct lu_env *env, struct cl_page_list *plist);
-
-void cl_2queue_init(struct cl_2queue *queue);
-void cl_2queue_add(struct cl_2queue *queue, struct cl_page *page,
-                  bool get_ref);
-void cl_2queue_disown(const struct lu_env *env, struct cl_io *io,
-                     struct cl_2queue *queue);
-void cl_2queue_assume(const struct lu_env *env, struct cl_io *io,
-                     struct cl_2queue *queue);
-void cl_2queue_discard(const struct lu_env *env, struct cl_io *io,
-                      struct cl_2queue *queue);
-void cl_2queue_fini(const struct lu_env *env, struct cl_2queue *queue);
+                          struct cl_io *io, struct cl_page_list *plist);
+void cl_page_list_fini   (const struct lu_env *env, struct cl_page_list *plist);
+
+void cl_2queue_init     (struct cl_2queue *queue);
+void cl_2queue_add      (struct cl_2queue *queue, struct cl_page *page);
+void cl_2queue_disown   (const struct lu_env *env,
+                         struct cl_io *io, struct cl_2queue *queue);
+void cl_2queue_assume   (const struct lu_env *env,
+                         struct cl_io *io, struct cl_2queue *queue);
+void cl_2queue_discard  (const struct lu_env *env,
+                         struct cl_io *io, struct cl_2queue *queue);
+void cl_2queue_fini     (const struct lu_env *env, struct cl_2queue *queue);
 void cl_2queue_init_page(struct cl_2queue *queue, struct cl_page *page);
 
 /** @} cl_page_list */
index 8794e7b..2a83264 100644 (file)
@@ -1877,7 +1877,7 @@ int ll_io_zero_page(struct inode *inode, pgoff_t index, pgoff_t offset,
                anchor = &vvp_env_info(env)->vti_anchor;
                cl_sync_io_init(anchor, 1);
                clpage->cp_sync_io = anchor;
-               cl_2queue_add(queue, clpage, true);
+               cl_2queue_add(queue, clpage);
                rc = cl_io_submit_rw(env, io, CRT_WRITE, queue);
                if (rc)
                        GOTO(queuefini1, rc);
index 18981bb..958d848 100644 (file)
@@ -248,7 +248,7 @@ static int ll_read_ahead_page(const struct lu_env *env, struct cl_io *io,
                        vpg->vpg_defer_uptodate = 1;
                        vpg->vpg_ra_used = 0;
                }
-               cl_page_list_add(queue, page, true);
+               cl_page_list_add(queue, page);
        } else {
                /* skip completed pages */
                cl_page_unassume(env, io, page);
@@ -1658,7 +1658,7 @@ int ll_io_read_page(const struct lu_env *env, struct cl_io *io,
                cl_sync_io_init(anchor, 1);
                page->cp_sync_io = anchor;
 
-               cl_2queue_add(queue, page, true);
+               cl_2queue_add(queue, page);
        }
 
        io_start_index = cl_index(io->ci_obj, io->u.ci_rw.crw_pos);
index 5b7417d..39becc1 100644 (file)
@@ -368,10 +368,7 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size,
                         */
                        page->cp_inode = inode;
                }
-               /* We keep the refcount from cl_page_find, so we don't need
-                * another one here
-                */
-               cl_2queue_add(queue, page, false);
+               cl_2queue_add(queue, page);
                /*
                 * Set page clip to tell transfer formation engine
                 * that page has to be sent even if it is beyond KMS.
@@ -380,6 +377,8 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size,
                        cl_page_clip(env, page, 0, size);
                ++io_pages;
 
+               /* drop the reference count for cl_page_find */
+               cl_page_put(env, page);
                offset += page_size;
                size -= page_size;
        }
@@ -875,7 +874,7 @@ static int ll_write_end(struct file *file, struct address_space *mapping,
                lcc->lcc_page = NULL; /* page will be queued */
 
                /* Add it into write queue */
-               cl_page_list_add(plist, page, true);
+               cl_page_list_add(plist, page);
                if (plist->pl_nr == 1) /* first page */
                        vio->u.readwrite.vui_from = from;
                else
index ac0e79b..d3ac0da 100644 (file)
@@ -1500,7 +1500,7 @@ static int vvp_io_fault_start(const struct lu_env *env,
                        cl_page_assume(env, io, page);
 
                        cl_page_list_init(plist);
-                       cl_page_list_add(plist, page, true);
+                       cl_page_list_add(plist, page);
 
                        /* size fixup */
                        if (last_index == vvp_index(vpg))
@@ -1520,7 +1520,7 @@ static int vvp_io_fault_start(const struct lu_env *env,
                                if (result >= 0) {
                                        io->ci_noquota = 1;
                                        cl_page_own(env, io, page);
-                                       cl_page_list_add(plist, page, true);
+                                       cl_page_list_add(plist, page);
                                        lu_ref_add(&page->cp_reference,
                                                   "cl_io", io);
                                        result = cl_io_commit_async(env, io,
index be61460..529244f 100644 (file)
@@ -477,18 +477,18 @@ int vvp_page_init(const struct lu_env *env, struct cl_object *obj,
        CLOBINVRNT(env, obj, vvp_object_invariant(obj));
 
        vpg->vpg_page = vmpage;
+       get_page(vmpage);
 
-       if (page->cp_type == CPT_TRANSIENT) {
-               cl_page_slice_add(page, &vpg->vpg_cl, obj,
-                                 &vvp_transient_page_ops);
-       } else {
-               get_page(vmpage);
+       if (page->cp_type == CPT_CACHEABLE) {
                /* in cache, decref in vvp_page_delete */
                atomic_inc(&page->cp_ref);
                SetPagePrivate(vmpage);
                vmpage->private = (unsigned long)page;
                cl_page_slice_add(page, &vpg->vpg_cl, obj,
                                &vvp_page_ops);
+       } else {
+               cl_page_slice_add(page, &vpg->vpg_cl, obj,
+                                 &vvp_transient_page_ops);
        }
        return 0;
 }
index dc78aba..fbc7825 100644 (file)
@@ -832,8 +832,7 @@ EXPORT_SYMBOL(cl_page_list_init);
 /**
  * Adds a page to a page list.
  */
-void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page,
-                     bool get_ref)
+void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page)
 {
        ENTRY;
        /* it would be better to check that page is owned by "current" io, but
@@ -844,8 +843,7 @@ void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page,
        list_add_tail(&page->cp_batch, &plist->pl_pages);
        ++plist->pl_nr;
        lu_ref_add_at(&page->cp_reference, &page->cp_queue_ref, "queue", plist);
-       if (get_ref)
-               cl_page_get(page);
+       cl_page_get(page);
        EXIT;
 }
 EXPORT_SYMBOL(cl_page_list_add);
@@ -1022,9 +1020,11 @@ EXPORT_SYMBOL(cl_2queue_init);
 /**
  * Add a page to the incoming page list of 2-queue.
  */
-void cl_2queue_add(struct cl_2queue *queue, struct cl_page *page, bool get_ref)
+void cl_2queue_add(struct cl_2queue *queue, struct cl_page *page)
 {
-       cl_page_list_add(&queue->c2_qin, page, get_ref);
+        ENTRY;
+        cl_page_list_add(&queue->c2_qin, page);
+        EXIT;
 }
 EXPORT_SYMBOL(cl_2queue_add);
 
@@ -1081,10 +1081,10 @@ EXPORT_SYMBOL(cl_2queue_fini);
  */
 void cl_2queue_init_page(struct cl_2queue *queue, struct cl_page *page)
 {
-       ENTRY;
-       cl_2queue_init(queue);
-       cl_2queue_add(queue, page, true);
-       EXIT;
+        ENTRY;
+        cl_2queue_init(queue);
+        cl_2queue_add(queue, page);
+        EXIT;
 }
 EXPORT_SYMBOL(cl_2queue_init_page);
 
index bdec008..820cd22 100644 (file)
@@ -1330,7 +1330,7 @@ static void echo_commit_callback(const struct lu_env *env, struct cl_io *io,
                struct page *vmpage = pvec->pages[i];
                struct cl_page *page = (struct cl_page *)vmpage->private;
 
-               cl_page_list_add(&queue->c2_qout, page, true);
+               cl_page_list_add(&queue->c2_qout, page);
        }
 }
 
@@ -1393,7 +1393,7 @@ static int cl_echo_object_brw(struct echo_object *eco, int rw, u64 offset,
                        break;
                }
 
-               cl_2queue_add(queue, clp, true);
+               cl_2queue_add(queue, clp);
 
                /*
                 * drop the reference count for cl_page_find, so that the page