NFS: Clean up list moves of struct nfs_page [Linux 4.19.70]

This Linux kernel change "NFS: Clean up list moves of struct nfs_page" is included in the Linux 4.19.70 release. This change is authored by Trond Myklebust <trond.myklebust [at] hammerspace.com> on Mon Feb 18 11:35:54 2019 -0500. The commit for this change in Linux stable tree is 57c491f (patch) which is from upstream commit 078b5fd. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 078b5fd.

NFS: Clean up list moves of struct nfs_page

[ Upstream commit 078b5fd92c4913dd367361db6c28568386077c89 ]

In several places we're just moving the struct nfs_page from one list to
another by first removing from the existing list, then adding to the new
one.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>

There are 25 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 fs/nfs/direct.c          |  3 +--
 fs/nfs/pagelist.c        | 12 ++++--------
 include/linux/nfs_page.h | 10 ++++++++++
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 33824a0..1377ee2 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -664,8 +664,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)

    list_for_each_entry_safe(req, tmp, &reqs, wb_list) {
        if (!nfs_pageio_add_request(&desc, req)) {
-           nfs_list_remove_request(req);
-           nfs_list_add_request(req, &failed);
+           nfs_list_move_request(req, &failed);
            spin_lock(&cinfo.inode->i_lock);
            dreq->flags = 0;
            if (desc.pg_error < 0)
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 0ec6bce..d40bf56 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -769,8 +769,7 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
    pageused = 0;
    while (!list_empty(head)) {
        req = nfs_list_entry(head->next);
-       nfs_list_remove_request(req);
-       nfs_list_add_request(req, &hdr->pages);
+       nfs_list_move_request(req, &hdr->pages);

        if (!last_page || last_page != req->wb_page) {
            pageused++;
@@ -962,8 +961,7 @@ static int nfs_pageio_do_add_request(struct nfs_pageio_descriptor *desc,
    }
    if (!nfs_can_coalesce_requests(prev, req, desc))
        return 0;
-   nfs_list_remove_request(req);
-   nfs_list_add_request(req, &mirror->pg_list);
+   nfs_list_move_request(req, &mirror->pg_list);
    mirror->pg_count += req->wb_bytes;
    return 1;
 }
@@ -995,8 +993,7 @@ static void nfs_pageio_doio(struct nfs_pageio_descriptor *desc)
 {
    LIST_HEAD(head);

-   nfs_list_remove_request(req);
-   nfs_list_add_request(req, &head);
+   nfs_list_move_request(req, &head);
    desc->pg_completion_ops->error_cleanup(&head);
 }

@@ -1242,9 +1239,8 @@ int nfs_pageio_resend(struct nfs_pageio_descriptor *desc,
    while (!list_empty(&hdr->pages)) {
        struct nfs_page *req = nfs_list_entry(hdr->pages.next);

-       nfs_list_remove_request(req);
        if (!nfs_pageio_add_request(desc, req))
-           nfs_list_add_request(req, &failed);
+           nfs_list_move_request(req, &failed);
    }
    nfs_pageio_complete(desc);
    if (!list_empty(&failed)) {
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index e27572d..ad69430 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -164,6 +164,16 @@ extern size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
    list_add_tail(&req->wb_list, head);
 }

+/**
+ * nfs_list_move_request - Move a request to a new list
+ * @req: request
+ * @head: head of list into which to insert the request.
+ */
+static inline void
+nfs_list_move_request(struct nfs_page *req, struct list_head *head)
+{
+   list_move_tail(&req->wb_list, head);
+}

 /**
  * nfs_list_remove_request - Remove a request from its wb_list

Leave a Reply

Your email address will not be published. Required fields are marked *