|
@@ -906,14 +906,15 @@ send_layoutget(struct pnfs_layout_hdr *lo,
|
|
|
|
|
|
if (IS_ERR(lseg)) {
|
|
|
switch (PTR_ERR(lseg)) {
|
|
|
- case -ENOMEM:
|
|
|
case -ERESTARTSYS:
|
|
|
+ case -EIO:
|
|
|
+ case -ENOSPC:
|
|
|
+ case -EROFS:
|
|
|
+ case -E2BIG:
|
|
|
break;
|
|
|
default:
|
|
|
- /* remember that LAYOUTGET failed and suspend trying */
|
|
|
- pnfs_layout_io_set_failed(lo, range->iomode);
|
|
|
+ return NULL;
|
|
|
}
|
|
|
- return NULL;
|
|
|
} else
|
|
|
pnfs_layout_clear_fail_bit(lo,
|
|
|
pnfs_iomode_to_fail_bit(range->iomode));
|
|
@@ -1649,7 +1650,7 @@ out:
|
|
|
"(%s, offset: %llu, length: %llu)\n",
|
|
|
__func__, ino->i_sb->s_id,
|
|
|
(unsigned long long)NFS_FILEID(ino),
|
|
|
- lseg == NULL ? "not found" : "found",
|
|
|
+ IS_ERR_OR_NULL(lseg) ? "not found" : "found",
|
|
|
iomode==IOMODE_RW ? "read/write" : "read-only",
|
|
|
(unsigned long long)pos,
|
|
|
(unsigned long long)count);
|
|
@@ -1828,6 +1829,11 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
|
|
|
rd_size,
|
|
|
IOMODE_READ,
|
|
|
GFP_KERNEL);
|
|
|
+ if (IS_ERR(pgio->pg_lseg)) {
|
|
|
+ pgio->pg_error = PTR_ERR(pgio->pg_lseg);
|
|
|
+ pgio->pg_lseg = NULL;
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
/* If no lseg, fall back to read through mds */
|
|
|
if (pgio->pg_lseg == NULL)
|
|
@@ -1840,13 +1846,19 @@ void
|
|
|
pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
|
|
struct nfs_page *req, u64 wb_size)
|
|
|
{
|
|
|
- if (pgio->pg_lseg == NULL)
|
|
|
+ if (pgio->pg_lseg == NULL) {
|
|
|
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
|
|
req->wb_context,
|
|
|
req_offset(req),
|
|
|
wb_size,
|
|
|
IOMODE_RW,
|
|
|
GFP_NOFS);
|
|
|
+ if (IS_ERR(pgio->pg_lseg)) {
|
|
|
+ pgio->pg_error = PTR_ERR(pgio->pg_lseg);
|
|
|
+ pgio->pg_lseg = NULL;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
/* If no lseg, fall back to write through mds */
|
|
|
if (pgio->pg_lseg == NULL)
|
|
|
nfs_pageio_reset_write_mds(pgio);
|