diff options
Diffstat (limited to 'fs/nfs/pnfs.c')
-rw-r--r-- | fs/nfs/pnfs.c | 41 |
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 | ||
1575 | static void | 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 | 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 | ||
1733 | static void | 1728 | static void |
1734 | pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *head) | 1729 | pnfs_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; |