NFS/flexfiles: Don't invalidate DS deviceids for being unresponsive
If the DS is unresponsive, we want to just mark it as such, while reporting the errors. If the server later returns the same deviceid in a new layout, then we don't want to have to look it up again. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
d082d4b5a0
commit
17aaec8167
|
@ -180,24 +180,6 @@ ff_layout_no_read_on_rw(struct pnfs_layout_segment *lseg)
|
||||||
return FF_LAYOUT_LSEG(lseg)->flags & FF_FLAGS_NO_READ_IO;
|
return FF_LAYOUT_LSEG(lseg)->flags & FF_FLAGS_NO_READ_IO;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
|
||||||
ff_layout_test_devid_unavailable(struct nfs4_deviceid_node *node)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Flexfiles should never mark a DS unavailable, but if it does
|
|
||||||
* print a (ratelimited) warning as this can affect performance.
|
|
||||||
*/
|
|
||||||
if (nfs4_test_deviceid_unavailable(node)) {
|
|
||||||
u32 *p = (u32 *)node->deviceid.data;
|
|
||||||
|
|
||||||
pr_warn_ratelimited("NFS: flexfiles layout referencing an "
|
|
||||||
"unavailable device [%x%x%x%x]\n",
|
|
||||||
p[0], p[1], p[2], p[3]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
nfs4_ff_layout_ds_version(struct pnfs_layout_segment *lseg, u32 ds_idx)
|
nfs4_ff_layout_ds_version(struct pnfs_layout_segment *lseg, u32 ds_idx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -186,7 +186,7 @@ out_err:
|
||||||
static void ff_layout_mark_devid_invalid(struct pnfs_layout_segment *lseg,
|
static void ff_layout_mark_devid_invalid(struct pnfs_layout_segment *lseg,
|
||||||
struct nfs4_deviceid_node *devid)
|
struct nfs4_deviceid_node *devid)
|
||||||
{
|
{
|
||||||
nfs4_delete_deviceid(devid->ld, devid->nfs_client, &devid->deviceid);
|
nfs4_mark_deviceid_unavailable(devid);
|
||||||
if (!ff_layout_has_available_ds(lseg))
|
if (!ff_layout_has_available_ds(lseg))
|
||||||
pnfs_error_mark_layout_for_return(lseg->pls_layout->plh_inode,
|
pnfs_error_mark_layout_for_return(lseg->pls_layout->plh_inode,
|
||||||
lseg);
|
lseg);
|
||||||
|
@ -605,7 +605,7 @@ static bool ff_read_layout_has_available_ds(struct pnfs_layout_segment *lseg)
|
||||||
if (IS_ERR(mirror->mirror_ds))
|
if (IS_ERR(mirror->mirror_ds))
|
||||||
continue;
|
continue;
|
||||||
devid = &mirror->mirror_ds->id_node;
|
devid = &mirror->mirror_ds->id_node;
|
||||||
if (!ff_layout_test_devid_unavailable(devid))
|
if (!nfs4_test_deviceid_unavailable(devid))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -626,7 +626,7 @@ static bool ff_rw_layout_has_available_ds(struct pnfs_layout_segment *lseg)
|
||||||
if (!mirror->mirror_ds)
|
if (!mirror->mirror_ds)
|
||||||
continue;
|
continue;
|
||||||
devid = &mirror->mirror_ds->id_node;
|
devid = &mirror->mirror_ds->id_node;
|
||||||
if (ff_layout_test_devid_unavailable(devid))
|
if (nfs4_test_deviceid_unavailable(devid))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue