diff options
Diffstat (limited to 'fs/nfs/filelayout/filelayout.c')
-rw-r--r-- | fs/nfs/filelayout/filelayout.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index 02ec07973bc4..bb1f4e7a3270 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c | |||
@@ -202,6 +202,7 @@ static int filelayout_async_handle_error(struct rpc_task *task, | |||
202 | task->tk_status); | 202 | task->tk_status); |
203 | nfs4_mark_deviceid_unavailable(devid); | 203 | nfs4_mark_deviceid_unavailable(devid); |
204 | pnfs_error_mark_layout_for_return(inode, lseg); | 204 | pnfs_error_mark_layout_for_return(inode, lseg); |
205 | pnfs_set_lo_fail(lseg); | ||
205 | rpc_wake_up(&tbl->slot_tbl_waitq); | 206 | rpc_wake_up(&tbl->slot_tbl_waitq); |
206 | /* fall through */ | 207 | /* fall through */ |
207 | default: | 208 | default: |
@@ -883,13 +884,19 @@ static void | |||
883 | filelayout_pg_init_read(struct nfs_pageio_descriptor *pgio, | 884 | filelayout_pg_init_read(struct nfs_pageio_descriptor *pgio, |
884 | struct nfs_page *req) | 885 | struct nfs_page *req) |
885 | { | 886 | { |
886 | if (!pgio->pg_lseg) | 887 | if (!pgio->pg_lseg) { |
887 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, | 888 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, |
888 | req->wb_context, | 889 | req->wb_context, |
889 | 0, | 890 | 0, |
890 | NFS4_MAX_UINT64, | 891 | NFS4_MAX_UINT64, |
891 | IOMODE_READ, | 892 | IOMODE_READ, |
892 | GFP_KERNEL); | 893 | GFP_KERNEL); |
894 | if (IS_ERR(pgio->pg_lseg)) { | ||
895 | pgio->pg_error = PTR_ERR(pgio->pg_lseg); | ||
896 | pgio->pg_lseg = NULL; | ||
897 | return; | ||
898 | } | ||
899 | } | ||
893 | /* If no lseg, fall back to read through mds */ | 900 | /* If no lseg, fall back to read through mds */ |
894 | if (pgio->pg_lseg == NULL) | 901 | if (pgio->pg_lseg == NULL) |
895 | nfs_pageio_reset_read_mds(pgio); | 902 | nfs_pageio_reset_read_mds(pgio); |
@@ -902,13 +909,20 @@ filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio, | |||
902 | struct nfs_commit_info cinfo; | 909 | struct nfs_commit_info cinfo; |
903 | int status; | 910 | int status; |
904 | 911 | ||
905 | if (!pgio->pg_lseg) | 912 | if (!pgio->pg_lseg) { |
906 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, | 913 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, |
907 | req->wb_context, | 914 | req->wb_context, |
908 | 0, | 915 | 0, |
909 | NFS4_MAX_UINT64, | 916 | NFS4_MAX_UINT64, |
910 | IOMODE_RW, | 917 | IOMODE_RW, |
911 | GFP_NOFS); | 918 | GFP_NOFS); |
919 | if (IS_ERR(pgio->pg_lseg)) { | ||
920 | pgio->pg_error = PTR_ERR(pgio->pg_lseg); | ||
921 | pgio->pg_lseg = NULL; | ||
922 | return; | ||
923 | } | ||
924 | } | ||
925 | |||
912 | /* If no lseg, fall back to write through mds */ | 926 | /* If no lseg, fall back to write through mds */ |
913 | if (pgio->pg_lseg == NULL) | 927 | if (pgio->pg_lseg == NULL) |
914 | goto out_mds; | 928 | goto out_mds; |