summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-02-27 23:46:04 -0500
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-03-01 22:37:37 -0500
commit0a156dd58274b0b847118966365203955288f4c6 (patch)
tree262a60db11824a39274be96c5508012e3bad8b2a
parent2444ff277a686d743b5479dd52d8357c21d5ce13 (diff)
NFS/flexfiles: Avoid unnecessary layout invalidations
In ff_layout_mirror_valid() we may not want to invalidate the layout segment despite the call to GETDEVICEINFO failing. The reason is that a read may still be able to make progress on another mirror. So instead we let the caller (in this case nfs4_ff_layout_prepare_ds()) decide whether or not it needs to invalidate. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
-rw-r--r--fs/nfs/flexfilelayout/flexfilelayoutdev.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
index f9a13e1fb1a8..92efb5692eb3 100644
--- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c
+++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
@@ -196,7 +196,7 @@ static bool ff_layout_mirror_valid(struct pnfs_layout_segment *lseg,
struct nfs4_ff_layout_mirror *mirror,
bool create)
{
- if (mirror == NULL || IS_ERR(mirror->mirror_ds))
+ if (mirror == NULL)
goto outerr;
if (mirror->mirror_ds == NULL) {
if (create) {
@@ -229,7 +229,6 @@ static bool ff_layout_mirror_valid(struct pnfs_layout_segment *lseg,
}
return true;
outerr:
- pnfs_error_mark_layout_for_return(lseg->pls_layout->plh_inode, lseg);
return false;
}
@@ -417,7 +416,7 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg,
int status;
if (!ff_layout_mirror_valid(lseg, mirror, true))
- goto out;
+ goto noconnect;
ds = mirror->mirror_ds->ds;
/* matching smp_wmb() in _nfs4_pnfs_v3/4_ds_connect */
@@ -444,6 +443,7 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg,
mirror->mirror_ds->ds_versions[0].wsize = max_payload;
goto out;
}
+noconnect:
ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout),
mirror, lseg->pls_range.offset,
lseg->pls_range.length, NFS4ERR_NXIO,