]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
NFS/flexfiles: Avoid unnecessary layout invalidations
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 28 Feb 2019 04:46:04 +0000 (23:46 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 2 Mar 2019 03:37:37 +0000 (22:37 -0500)
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>
fs/nfs/flexfilelayout/flexfilelayoutdev.c

index f9a13e1fb1a8f50cc9bb3d71be4f626976e1e1e7..92efb5692eb3add5e72649262c58f4959e1457a3 100644 (file)
@@ -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,