|
|
@@ -2143,12 +2143,15 @@ pnfs_try_to_read_data(struct nfs_pgio_header *hdr,
|
|
|
}
|
|
|
|
|
|
/* Resend all requests through pnfs. */
|
|
|
-int pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr)
|
|
|
+void pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr)
|
|
|
{
|
|
|
struct nfs_pageio_descriptor pgio;
|
|
|
|
|
|
- nfs_pageio_init_read(&pgio, hdr->inode, false, hdr->completion_ops);
|
|
|
- return nfs_pageio_resend(&pgio, hdr);
|
|
|
+ if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags)) {
|
|
|
+ nfs_pageio_init_read(&pgio, hdr->inode, false,
|
|
|
+ hdr->completion_ops);
|
|
|
+ hdr->task.tk_status = nfs_pageio_resend(&pgio, hdr);
|
|
|
+ }
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pnfs_read_resend_pnfs);
|
|
|
|
|
|
@@ -2158,12 +2161,11 @@ pnfs_do_read(struct nfs_pageio_descriptor *desc, struct nfs_pgio_header *hdr)
|
|
|
const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
|
|
|
struct pnfs_layout_segment *lseg = desc->pg_lseg;
|
|
|
enum pnfs_try_status trypnfs;
|
|
|
- int err = 0;
|
|
|
|
|
|
trypnfs = pnfs_try_to_read_data(hdr, call_ops, lseg);
|
|
|
if (trypnfs == PNFS_TRY_AGAIN)
|
|
|
- err = pnfs_read_resend_pnfs(hdr);
|
|
|
- if (trypnfs == PNFS_NOT_ATTEMPTED || err)
|
|
|
+ pnfs_read_resend_pnfs(hdr);
|
|
|
+ if (trypnfs == PNFS_NOT_ATTEMPTED || hdr->task.tk_status)
|
|
|
pnfs_read_through_mds(desc, hdr);
|
|
|
}
|
|
|
|