Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nfs: remove data list from pgio header

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>

authored by

Weston Andros Adamson and committed by
Trond Myklebust
7f714720 f0cb9ab8

+24 -61
+6 -33
fs/nfs/pagelist.c
··· 470 470 struct nfs_pgio_header *hdr = &header->header; 471 471 472 472 INIT_LIST_HEAD(&hdr->pages); 473 - INIT_LIST_HEAD(&hdr->rpc_list); 474 473 spin_lock_init(&hdr->lock); 475 474 atomic_set(&hdr->refcnt, 0); 476 475 hdr->rw_ops = ops; ··· 647 648 } 648 649 EXPORT_SYMBOL_GPL(nfs_initiate_pgio); 649 650 650 - static int nfs_do_multiple_pgios(struct list_head *head, 651 - const struct rpc_call_ops *call_ops, 652 - int how) 653 - { 654 - struct nfs_pgio_data *data; 655 - int ret = 0; 656 - 657 - while (!list_empty(head)) { 658 - int ret2; 659 - 660 - data = list_first_entry(head, struct nfs_pgio_data, list); 661 - list_del_init(&data->list); 662 - 663 - ret2 = nfs_initiate_pgio(NFS_CLIENT(data->header->inode), 664 - data, call_ops, how, 0); 665 - if (ret == 0) 666 - ret = ret2; 667 - } 668 - return ret; 669 - } 670 - 671 651 /** 672 652 * nfs_pgio_error - Clean up from a pageio error 673 653 * @desc: IO descriptor ··· 655 677 static int nfs_pgio_error(struct nfs_pageio_descriptor *desc, 656 678 struct nfs_pgio_header *hdr) 657 679 { 658 - struct nfs_pgio_data *data; 659 - 660 680 set_bit(NFS_IOHDR_REDO, &hdr->flags); 661 - while (!list_empty(&hdr->rpc_list)) { 662 - data = list_first_entry(&hdr->rpc_list, struct nfs_pgio_data, list); 663 - list_del(&data->list); 664 - nfs_pgio_data_release(data); 665 - } 681 + nfs_pgio_data_release(hdr->data); 682 + hdr->data = NULL; 666 683 desc->pg_completion_ops->error_cleanup(&desc->pg_list); 667 684 return -ENOMEM; 668 685 } ··· 767 794 768 795 /* Set up the argument struct */ 769 796 nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo); 770 - list_add(&data->list, &hdr->rpc_list); 797 + hdr->data = data; 771 798 desc->pg_rpc_callops = &nfs_pgio_common_ops; 772 799 return 0; 773 800 } ··· 789 816 atomic_inc(&hdr->refcnt); 790 817 ret = nfs_generic_pgio(desc, hdr); 791 818 if (ret == 0) 792 - ret = nfs_do_multiple_pgios(&hdr->rpc_list, 793 - desc->pg_rpc_callops, 794 - desc->pg_ioflags); 819 + ret = nfs_initiate_pgio(NFS_CLIENT(hdr->inode), 820 + hdr->data, desc->pg_rpc_callops, 821 + desc->pg_ioflags, 0); 795 822 if (atomic_dec_and_test(&hdr->refcnt)) 796 823 hdr->completion_ops->completion(hdr); 797 824 return ret;
+15 -26
fs/nfs/pnfs.c
··· 1573 1573 } 1574 1574 1575 1575 static void 1576 - pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *head, int how) 1576 + pnfs_do_write(struct nfs_pageio_descriptor *desc, 1577 + struct nfs_pgio_header *hdr, int how) 1577 1578 { 1578 - struct nfs_pgio_data *data; 1579 + struct nfs_pgio_data *data = hdr->data; 1579 1580 const struct rpc_call_ops *call_ops = desc->pg_rpc_callops; 1580 1581 struct pnfs_layout_segment *lseg = desc->pg_lseg; 1582 + enum pnfs_try_status trypnfs; 1581 1583 1582 1584 desc->pg_lseg = NULL; 1583 - while (!list_empty(head)) { 1584 - enum pnfs_try_status trypnfs; 1585 - 1586 - data = list_first_entry(head, struct nfs_pgio_data, list); 1587 - list_del_init(&data->list); 1588 - 1589 - trypnfs = pnfs_try_to_write_data(data, call_ops, lseg, how); 1590 - if (trypnfs == PNFS_NOT_ATTEMPTED) 1591 - pnfs_write_through_mds(desc, data); 1592 - } 1585 + trypnfs = pnfs_try_to_write_data(data, call_ops, lseg, how); 1586 + if (trypnfs == PNFS_NOT_ATTEMPTED) 1587 + pnfs_write_through_mds(desc, data); 1593 1588 pnfs_put_lseg(lseg); 1594 1589 } 1595 1590 ··· 1618 1623 pnfs_put_lseg(desc->pg_lseg); 1619 1624 desc->pg_lseg = NULL; 1620 1625 } else 1621 - pnfs_do_multiple_writes(desc, &hdr->rpc_list, desc->pg_ioflags); 1626 + pnfs_do_write(desc, hdr, desc->pg_ioflags); 1622 1627 if (atomic_dec_and_test(&hdr->refcnt)) 1623 1628 hdr->completion_ops->completion(hdr); 1624 1629 return ret; ··· 1726 1731 } 1727 1732 1728 1733 static void 1729 - pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *head) 1734 + pnfs_do_read(struct nfs_pageio_descriptor *desc, struct nfs_pgio_header *hdr) 1730 1735 { 1731 - struct nfs_pgio_data *data; 1736 + struct nfs_pgio_data *data = hdr->data; 1732 1737 const struct rpc_call_ops *call_ops = desc->pg_rpc_callops; 1733 1738 struct pnfs_layout_segment *lseg = desc->pg_lseg; 1739 + enum pnfs_try_status trypnfs; 1734 1740 1735 1741 desc->pg_lseg = NULL; 1736 - while (!list_empty(head)) { 1737 - enum pnfs_try_status trypnfs; 1738 - 1739 - data = list_first_entry(head, struct nfs_pgio_data, list); 1740 - list_del_init(&data->list); 1741 - 1742 - trypnfs = pnfs_try_to_read_data(data, call_ops, lseg); 1743 - if (trypnfs == PNFS_NOT_ATTEMPTED) 1744 - pnfs_read_through_mds(desc, data); 1745 - } 1742 + trypnfs = pnfs_try_to_read_data(data, call_ops, lseg); 1743 + if (trypnfs == PNFS_NOT_ATTEMPTED) 1744 + pnfs_read_through_mds(desc, data); 1746 1745 pnfs_put_lseg(lseg); 1747 1746 } 1748 1747 ··· 1771 1782 pnfs_put_lseg(desc->pg_lseg); 1772 1783 desc->pg_lseg = NULL; 1773 1784 } else 1774 - pnfs_do_multiple_reads(desc, &hdr->rpc_list); 1785 + pnfs_do_read(desc, hdr); 1775 1786 if (atomic_dec_and_test(&hdr->refcnt)) 1776 1787 hdr->completion_ops->completion(hdr); 1777 1788 return ret;
+3 -2
include/linux/nfs_xdr.h
··· 1256 1256 NFS_IOHDR_NEED_RESCHED, 1257 1257 }; 1258 1258 1259 + struct nfs_pgio_data; 1260 + 1259 1261 struct nfs_pgio_header { 1260 1262 struct inode *inode; 1261 1263 struct rpc_cred *cred; 1262 1264 struct list_head pages; 1263 - struct list_head rpc_list; 1265 + struct nfs_pgio_data *data; 1264 1266 atomic_t refcnt; 1265 1267 struct nfs_page *req; 1266 1268 struct nfs_writeverf verf; /* Used for writes */ ··· 1284 1282 1285 1283 struct nfs_pgio_data { 1286 1284 struct nfs_pgio_header *header; 1287 - struct list_head list; 1288 1285 struct rpc_task task; 1289 1286 struct nfs_fattr fattr; 1290 1287 struct nfs_writeverf verf; /* Used for writes */