diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-02-28 07:46:04 +0300 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-03-02 06:37:37 +0300 |
commit | 0a156dd58274b0b847118966365203955288f4c6 (patch) | |
tree | 262a60db11824a39274be96c5508012e3bad8b2a /fs/nfs | |
parent | 2444ff277a686d743b5479dd52d8357c21d5ce13 (diff) | |
download | linux-0a156dd58274b0b847118966365203955288f4c6.tar.xz |
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>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/flexfilelayout/flexfilelayoutdev.c | 6 |
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, |