diff options
Diffstat (limited to 'fs/nfs/flexfilelayout/flexfilelayout.c')
-rw-r--r-- | fs/nfs/flexfilelayout/flexfilelayout.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index b04e20d28162..5657b7f2611f 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c | |||
@@ -8,6 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/nfs_fs.h> | 10 | #include <linux/nfs_fs.h> |
11 | #include <linux/nfs_mount.h> | ||
11 | #include <linux/nfs_page.h> | 12 | #include <linux/nfs_page.h> |
12 | #include <linux/module.h> | 13 | #include <linux/module.h> |
13 | #include <linux/sched/mm.h> | 14 | #include <linux/sched/mm.h> |
@@ -928,7 +929,9 @@ retry: | |||
928 | pgm = &pgio->pg_mirrors[0]; | 929 | pgm = &pgio->pg_mirrors[0]; |
929 | pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize; | 930 | pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize; |
930 | 931 | ||
931 | pgio->pg_maxretrans = io_maxretrans; | 932 | if (NFS_SERVER(pgio->pg_inode)->flags & |
933 | (NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR)) | ||
934 | pgio->pg_maxretrans = io_maxretrans; | ||
932 | return; | 935 | return; |
933 | out_nolseg: | 936 | out_nolseg: |
934 | if (pgio->pg_error < 0) | 937 | if (pgio->pg_error < 0) |
@@ -940,6 +943,7 @@ out_mds: | |||
940 | pgio->pg_lseg); | 943 | pgio->pg_lseg); |
941 | pnfs_put_lseg(pgio->pg_lseg); | 944 | pnfs_put_lseg(pgio->pg_lseg); |
942 | pgio->pg_lseg = NULL; | 945 | pgio->pg_lseg = NULL; |
946 | pgio->pg_maxretrans = 0; | ||
943 | nfs_pageio_reset_read_mds(pgio); | 947 | nfs_pageio_reset_read_mds(pgio); |
944 | } | 948 | } |
945 | 949 | ||
@@ -1000,7 +1004,9 @@ retry: | |||
1000 | pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].wsize; | 1004 | pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].wsize; |
1001 | } | 1005 | } |
1002 | 1006 | ||
1003 | pgio->pg_maxretrans = io_maxretrans; | 1007 | if (NFS_SERVER(pgio->pg_inode)->flags & |
1008 | (NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR)) | ||
1009 | pgio->pg_maxretrans = io_maxretrans; | ||
1004 | return; | 1010 | return; |
1005 | 1011 | ||
1006 | out_mds: | 1012 | out_mds: |
@@ -1010,6 +1016,7 @@ out_mds: | |||
1010 | pgio->pg_lseg); | 1016 | pgio->pg_lseg); |
1011 | pnfs_put_lseg(pgio->pg_lseg); | 1017 | pnfs_put_lseg(pgio->pg_lseg); |
1012 | pgio->pg_lseg = NULL; | 1018 | pgio->pg_lseg = NULL; |
1019 | pgio->pg_maxretrans = 0; | ||
1013 | nfs_pageio_reset_write_mds(pgio); | 1020 | nfs_pageio_reset_write_mds(pgio); |
1014 | } | 1021 | } |
1015 | 1022 | ||
@@ -1148,8 +1155,6 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, | |||
1148 | break; | 1155 | break; |
1149 | case -NFS4ERR_RETRY_UNCACHED_REP: | 1156 | case -NFS4ERR_RETRY_UNCACHED_REP: |
1150 | break; | 1157 | break; |
1151 | case -EAGAIN: | ||
1152 | return -NFS4ERR_RESET_TO_PNFS; | ||
1153 | /* Invalidate Layout errors */ | 1158 | /* Invalidate Layout errors */ |
1154 | case -NFS4ERR_PNFS_NO_LAYOUT: | 1159 | case -NFS4ERR_PNFS_NO_LAYOUT: |
1155 | case -ESTALE: /* mapped NFS4ERR_STALE */ | 1160 | case -ESTALE: /* mapped NFS4ERR_STALE */ |
@@ -1210,7 +1215,6 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task, | |||
1210 | case -EBADHANDLE: | 1215 | case -EBADHANDLE: |
1211 | case -ELOOP: | 1216 | case -ELOOP: |
1212 | case -ENOSPC: | 1217 | case -ENOSPC: |
1213 | case -EAGAIN: | ||
1214 | break; | 1218 | break; |
1215 | case -EJUKEBOX: | 1219 | case -EJUKEBOX: |
1216 | nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY); | 1220 | nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY); |
@@ -1445,16 +1449,6 @@ static void ff_layout_read_prepare_v4(struct rpc_task *task, void *data) | |||
1445 | ff_layout_read_prepare_common(task, hdr); | 1449 | ff_layout_read_prepare_common(task, hdr); |
1446 | } | 1450 | } |
1447 | 1451 | ||
1448 | static void | ||
1449 | ff_layout_io_prepare_transmit(struct rpc_task *task, | ||
1450 | void *data) | ||
1451 | { | ||
1452 | struct nfs_pgio_header *hdr = data; | ||
1453 | |||
1454 | if (!pnfs_is_valid_lseg(hdr->lseg)) | ||
1455 | rpc_exit(task, -EAGAIN); | ||
1456 | } | ||
1457 | |||
1458 | static void ff_layout_read_call_done(struct rpc_task *task, void *data) | 1452 | static void ff_layout_read_call_done(struct rpc_task *task, void *data) |
1459 | { | 1453 | { |
1460 | struct nfs_pgio_header *hdr = data; | 1454 | struct nfs_pgio_header *hdr = data; |
@@ -1740,7 +1734,6 @@ static void ff_layout_commit_release(void *data) | |||
1740 | 1734 | ||
1741 | static const struct rpc_call_ops ff_layout_read_call_ops_v3 = { | 1735 | static const struct rpc_call_ops ff_layout_read_call_ops_v3 = { |
1742 | .rpc_call_prepare = ff_layout_read_prepare_v3, | 1736 | .rpc_call_prepare = ff_layout_read_prepare_v3, |
1743 | .rpc_call_prepare_transmit = ff_layout_io_prepare_transmit, | ||
1744 | .rpc_call_done = ff_layout_read_call_done, | 1737 | .rpc_call_done = ff_layout_read_call_done, |
1745 | .rpc_count_stats = ff_layout_read_count_stats, | 1738 | .rpc_count_stats = ff_layout_read_count_stats, |
1746 | .rpc_release = ff_layout_read_release, | 1739 | .rpc_release = ff_layout_read_release, |
@@ -1748,7 +1741,6 @@ static const struct rpc_call_ops ff_layout_read_call_ops_v3 = { | |||
1748 | 1741 | ||
1749 | static const struct rpc_call_ops ff_layout_read_call_ops_v4 = { | 1742 | static const struct rpc_call_ops ff_layout_read_call_ops_v4 = { |
1750 | .rpc_call_prepare = ff_layout_read_prepare_v4, | 1743 | .rpc_call_prepare = ff_layout_read_prepare_v4, |
1751 | .rpc_call_prepare_transmit = ff_layout_io_prepare_transmit, | ||
1752 | .rpc_call_done = ff_layout_read_call_done, | 1744 | .rpc_call_done = ff_layout_read_call_done, |
1753 | .rpc_count_stats = ff_layout_read_count_stats, | 1745 | .rpc_count_stats = ff_layout_read_count_stats, |
1754 | .rpc_release = ff_layout_read_release, | 1746 | .rpc_release = ff_layout_read_release, |
@@ -1756,7 +1748,6 @@ static const struct rpc_call_ops ff_layout_read_call_ops_v4 = { | |||
1756 | 1748 | ||
1757 | static const struct rpc_call_ops ff_layout_write_call_ops_v3 = { | 1749 | static const struct rpc_call_ops ff_layout_write_call_ops_v3 = { |
1758 | .rpc_call_prepare = ff_layout_write_prepare_v3, | 1750 | .rpc_call_prepare = ff_layout_write_prepare_v3, |
1759 | .rpc_call_prepare_transmit = ff_layout_io_prepare_transmit, | ||
1760 | .rpc_call_done = ff_layout_write_call_done, | 1751 | .rpc_call_done = ff_layout_write_call_done, |
1761 | .rpc_count_stats = ff_layout_write_count_stats, | 1752 | .rpc_count_stats = ff_layout_write_count_stats, |
1762 | .rpc_release = ff_layout_write_release, | 1753 | .rpc_release = ff_layout_write_release, |
@@ -1764,7 +1755,6 @@ static const struct rpc_call_ops ff_layout_write_call_ops_v3 = { | |||
1764 | 1755 | ||
1765 | static const struct rpc_call_ops ff_layout_write_call_ops_v4 = { | 1756 | static const struct rpc_call_ops ff_layout_write_call_ops_v4 = { |
1766 | .rpc_call_prepare = ff_layout_write_prepare_v4, | 1757 | .rpc_call_prepare = ff_layout_write_prepare_v4, |
1767 | .rpc_call_prepare_transmit = ff_layout_io_prepare_transmit, | ||
1768 | .rpc_call_done = ff_layout_write_call_done, | 1758 | .rpc_call_done = ff_layout_write_call_done, |
1769 | .rpc_count_stats = ff_layout_write_count_stats, | 1759 | .rpc_count_stats = ff_layout_write_count_stats, |
1770 | .rpc_release = ff_layout_write_release, | 1760 | .rpc_release = ff_layout_write_release, |