nfs: remove data list from pgio header
authorWeston Andros Adamson <dros@primarydata.com>
Thu, 15 May 2014 15:56:53 +0000 (11:56 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 29 May 2014 15:11:48 +0000 (11:11 -0400)
Since the ability to split pages into subpage requests has been added,
nfs_pgio_header->rpc_list only ever has one pgio data.

Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/pagelist.c
fs/nfs/pnfs.c
include/linux/nfs_xdr.h

index ec4311df05d9ed31f18fef8e6b02502da0b82398..fab78d13ee140be2be7d94a689b865545278d7f6 100644 (file)
@@ -470,7 +470,6 @@ struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *ops)
                struct nfs_pgio_header *hdr = &header->header;
 
                INIT_LIST_HEAD(&hdr->pages);
-               INIT_LIST_HEAD(&hdr->rpc_list);
                spin_lock_init(&hdr->lock);
                atomic_set(&hdr->refcnt, 0);
                hdr->rw_ops = ops;
@@ -648,27 +647,6 @@ out:
 }
 EXPORT_SYMBOL_GPL(nfs_initiate_pgio);
 
-static int nfs_do_multiple_pgios(struct list_head *head,
-                                const struct rpc_call_ops *call_ops,
-                                int how)
-{
-       struct nfs_pgio_data *data;
-       int ret = 0;
-
-       while (!list_empty(head)) {
-               int ret2;
-
-               data = list_first_entry(head, struct nfs_pgio_data, list);
-               list_del_init(&data->list);
-
-               ret2 = nfs_initiate_pgio(NFS_CLIENT(data->header->inode),
-                                        data, call_ops, how, 0);
-               if (ret == 0)
-                        ret = ret2;
-       }
-       return ret;
-}
-
 /**
  * nfs_pgio_error - Clean up from a pageio error
  * @desc: IO descriptor
@@ -677,14 +655,9 @@ static int nfs_do_multiple_pgios(struct list_head *head,
 static int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
                          struct nfs_pgio_header *hdr)
 {
-       struct nfs_pgio_data *data;
-
        set_bit(NFS_IOHDR_REDO, &hdr->flags);
-       while (!list_empty(&hdr->rpc_list)) {
-               data = list_first_entry(&hdr->rpc_list, struct nfs_pgio_data, list);
-               list_del(&data->list);
-               nfs_pgio_data_release(data);
-       }
+       nfs_pgio_data_release(hdr->data);
+       hdr->data = NULL;
        desc->pg_completion_ops->error_cleanup(&desc->pg_list);
        return -ENOMEM;
 }
@@ -794,7 +767,7 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
 
        /* Set up the argument struct */
        nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
-       list_add(&data->list, &hdr->rpc_list);
+       hdr->data = data;
        desc->pg_rpc_callops = &nfs_pgio_common_ops;
        return 0;
 }
@@ -816,9 +789,9 @@ static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
        atomic_inc(&hdr->refcnt);
        ret = nfs_generic_pgio(desc, hdr);
        if (ret == 0)
-               ret = nfs_do_multiple_pgios(&hdr->rpc_list,
-                                           desc->pg_rpc_callops,
-                                           desc->pg_ioflags);
+               ret = nfs_initiate_pgio(NFS_CLIENT(hdr->inode),
+                                       hdr->data, desc->pg_rpc_callops,
+                                       desc->pg_ioflags, 0);
        if (atomic_dec_and_test(&hdr->refcnt))
                hdr->completion_ops->completion(hdr);
        return ret;
index 354c53cd40950dd4824efecfe707a67f7bad5f1b..6ef108b1d85f111e3696b1eda554b8bc4570991f 100644 (file)
@@ -1573,23 +1573,18 @@ pnfs_try_to_write_data(struct nfs_pgio_data *wdata,
 }
 
 static void
-pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *head, int how)
+pnfs_do_write(struct nfs_pageio_descriptor *desc,
+             struct nfs_pgio_header *hdr, int how)
 {
-       struct nfs_pgio_data *data;
+       struct nfs_pgio_data *data = hdr->data;
        const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
        struct pnfs_layout_segment *lseg = desc->pg_lseg;
+       enum pnfs_try_status trypnfs;
 
        desc->pg_lseg = NULL;
-       while (!list_empty(head)) {
-               enum pnfs_try_status trypnfs;
-
-               data = list_first_entry(head, struct nfs_pgio_data, list);
-               list_del_init(&data->list);
-
-               trypnfs = pnfs_try_to_write_data(data, call_ops, lseg, how);
-               if (trypnfs == PNFS_NOT_ATTEMPTED)
-                       pnfs_write_through_mds(desc, data);
-       }
+       trypnfs = pnfs_try_to_write_data(data, call_ops, lseg, how);
+       if (trypnfs == PNFS_NOT_ATTEMPTED)
+               pnfs_write_through_mds(desc, data);
        pnfs_put_lseg(lseg);
 }
 
@@ -1623,7 +1618,7 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
                pnfs_put_lseg(desc->pg_lseg);
                desc->pg_lseg = NULL;
        } else
-               pnfs_do_multiple_writes(desc, &hdr->rpc_list, desc->pg_ioflags);
+               pnfs_do_write(desc, hdr, desc->pg_ioflags);
        if (atomic_dec_and_test(&hdr->refcnt))
                hdr->completion_ops->completion(hdr);
        return ret;
@@ -1731,23 +1726,17 @@ pnfs_try_to_read_data(struct nfs_pgio_data *rdata,
 }
 
 static void
-pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *head)
+pnfs_do_read(struct nfs_pageio_descriptor *desc, struct nfs_pgio_header *hdr)
 {
-       struct nfs_pgio_data *data;
+       struct nfs_pgio_data *data = hdr->data;
        const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
        struct pnfs_layout_segment *lseg = desc->pg_lseg;
+       enum pnfs_try_status trypnfs;
 
        desc->pg_lseg = NULL;
-       while (!list_empty(head)) {
-               enum pnfs_try_status trypnfs;
-
-               data = list_first_entry(head, struct nfs_pgio_data, list);
-               list_del_init(&data->list);
-
-               trypnfs = pnfs_try_to_read_data(data, call_ops, lseg);
-               if (trypnfs == PNFS_NOT_ATTEMPTED)
-                       pnfs_read_through_mds(desc, data);
-       }
+       trypnfs = pnfs_try_to_read_data(data, call_ops, lseg);
+       if (trypnfs == PNFS_NOT_ATTEMPTED)
+               pnfs_read_through_mds(desc, data);
        pnfs_put_lseg(lseg);
 }
 
@@ -1782,7 +1771,7 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
                pnfs_put_lseg(desc->pg_lseg);
                desc->pg_lseg = NULL;
        } else
-               pnfs_do_multiple_reads(desc, &hdr->rpc_list);
+               pnfs_do_read(desc, hdr);
        if (atomic_dec_and_test(&hdr->refcnt))
                hdr->completion_ops->completion(hdr);
        return ret;
index adef7bd2d06dc300255ce9c1a6707fb0d00f261a..ae636013fb1f30a5e61125058f793610ddf83ef0 100644 (file)
@@ -1256,11 +1256,13 @@ enum {
        NFS_IOHDR_NEED_RESCHED,
 };
 
+struct nfs_pgio_data;
+
 struct nfs_pgio_header {
        struct inode            *inode;
        struct rpc_cred         *cred;
        struct list_head        pages;
-       struct list_head        rpc_list;
+       struct nfs_pgio_data    *data;
        atomic_t                refcnt;
        struct nfs_page         *req;
        struct nfs_writeverf    verf;           /* Used for writes */
@@ -1282,7 +1284,6 @@ struct nfs_pgio_header {
 
 struct nfs_pgio_data {
        struct nfs_pgio_header  *header;
-       struct list_head        list;
        struct rpc_task         task;
        struct nfs_fattr        fattr;
        struct nfs_writeverf    verf;           /* Used for writes */