aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/pnfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/pnfs.c')
-rw-r--r--fs/nfs/pnfs.c41
1 files changed, 15 insertions, 26 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 354c53cd4095..6ef108b1d85f 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1573,23 +1573,18 @@ pnfs_try_to_write_data(struct nfs_pgio_data *wdata,
1573} 1573}
1574 1574
1575static void 1575static void
1576pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *head, int how) 1576pnfs_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 const struct rpc_call_ops *call_ops = desc->pg_rpc_callops; 1580 const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
1580 struct pnfs_layout_segment *lseg = desc->pg_lseg; 1581 struct pnfs_layout_segment *lseg = desc->pg_lseg;
1582 enum pnfs_try_status trypnfs;
1581 1583
1582 desc->pg_lseg = NULL; 1584 desc->pg_lseg = NULL;
1583 while (!list_empty(head)) { 1585 trypnfs = pnfs_try_to_write_data(data, call_ops, lseg, how);
1584 enum pnfs_try_status trypnfs; 1586 if (trypnfs == PNFS_NOT_ATTEMPTED)
1585 1587 pnfs_write_through_mds(desc, data);
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 }
1593 pnfs_put_lseg(lseg); 1588 pnfs_put_lseg(lseg);
1594} 1589}
1595 1590
@@ -1623,7 +1618,7 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
1623 pnfs_put_lseg(desc->pg_lseg); 1618 pnfs_put_lseg(desc->pg_lseg);
1624 desc->pg_lseg = NULL; 1619 desc->pg_lseg = NULL;
1625 } else 1620 } else
1626 pnfs_do_multiple_writes(desc, &hdr->rpc_list, desc->pg_ioflags); 1621 pnfs_do_write(desc, hdr, desc->pg_ioflags);
1627 if (atomic_dec_and_test(&hdr->refcnt)) 1622 if (atomic_dec_and_test(&hdr->refcnt))
1628 hdr->completion_ops->completion(hdr); 1623 hdr->completion_ops->completion(hdr);
1629 return ret; 1624 return ret;
@@ -1731,23 +1726,17 @@ pnfs_try_to_read_data(struct nfs_pgio_data *rdata,
1731} 1726}
1732 1727
1733static void 1728static void
1734pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *head) 1729pnfs_do_read(struct nfs_pageio_descriptor *desc, struct nfs_pgio_header *hdr)
1735{ 1730{
1736 struct nfs_pgio_data *data; 1731 struct nfs_pgio_data *data = hdr->data;
1737 const struct rpc_call_ops *call_ops = desc->pg_rpc_callops; 1732 const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
1738 struct pnfs_layout_segment *lseg = desc->pg_lseg; 1733 struct pnfs_layout_segment *lseg = desc->pg_lseg;
1734 enum pnfs_try_status trypnfs;
1739 1735
1740 desc->pg_lseg = NULL; 1736 desc->pg_lseg = NULL;
1741 while (!list_empty(head)) { 1737 trypnfs = pnfs_try_to_read_data(data, call_ops, lseg);
1742 enum pnfs_try_status trypnfs; 1738 if (trypnfs == PNFS_NOT_ATTEMPTED)
1743 1739 pnfs_read_through_mds(desc, data);
1744 data = list_first_entry(head, struct nfs_pgio_data, list);
1745 list_del_init(&data->list);
1746
1747 trypnfs = pnfs_try_to_read_data(data, call_ops, lseg);
1748 if (trypnfs == PNFS_NOT_ATTEMPTED)
1749 pnfs_read_through_mds(desc, data);
1750 }
1751 pnfs_put_lseg(lseg); 1740 pnfs_put_lseg(lseg);
1752} 1741}
1753 1742
@@ -1782,7 +1771,7 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
1782 pnfs_put_lseg(desc->pg_lseg); 1771 pnfs_put_lseg(desc->pg_lseg);
1783 desc->pg_lseg = NULL; 1772 desc->pg_lseg = NULL;
1784 } else 1773 } else
1785 pnfs_do_multiple_reads(desc, &hdr->rpc_list); 1774 pnfs_do_read(desc, hdr);
1786 if (atomic_dec_and_test(&hdr->refcnt)) 1775 if (atomic_dec_and_test(&hdr->refcnt))
1787 hdr->completion_ops->completion(hdr); 1776 hdr->completion_ops->completion(hdr);
1788 return ret; 1777 return ret;