summaryrefslogtreecommitdiff
path: root/fs/nfs/pnfs_nfs.c
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@monkey.org>2017-03-09 12:56:49 -0500
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2017-03-17 16:07:17 -0400
commitda066f3f039eba3e72e97b2ccad0dd8b45ba84bd (patch)
tree9d4c5082fab8a1d2d31cf5953db7bd766822276d /fs/nfs/pnfs_nfs.c
parenta33e4b036d4612f62220f37a9fa29d273b6fd0ca (diff)
downloadlwn-da066f3f039eba3e72e97b2ccad0dd8b45ba84bd.tar.gz
lwn-da066f3f039eba3e72e97b2ccad0dd8b45ba84bd.zip
pNFS/flexfiles: never nfs4_mark_deviceid_unavailable
The flexfiles layout should never mark a device unavailable. Move nfs4_mark_deviceid_unavailable out of nfs4_pnfs_ds_connect and call directly from files layout where it's still needed. The flexfiles driver still handles marked devices in error paths, but will now print a rate limited warning. Signed-off-by: Weston Andros Adamson <dros@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'fs/nfs/pnfs_nfs.c')
-rw-r--r--fs/nfs/pnfs_nfs.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c
index a7691b927af6..7250b95549ec 100644
--- a/fs/nfs/pnfs_nfs.c
+++ b/fs/nfs/pnfs_nfs.c
@@ -751,9 +751,11 @@ int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
struct nfs4_deviceid_node *devid, unsigned int timeo,
unsigned int retrans, u32 version, u32 minor_version)
{
- if (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) == 0) {
- int err = 0;
+ int err;
+again:
+ err = 0;
+ if (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) == 0) {
if (version == 3) {
err = _nfs4_pnfs_v3_ds_connect(mds_srv, ds, timeo,
retrans);
@@ -766,23 +768,29 @@ int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
err = -EPROTONOSUPPORT;
}
- if (err)
- nfs4_mark_deviceid_unavailable(devid);
nfs4_clear_ds_conn_bit(ds);
} else {
nfs4_wait_ds_connect(ds);
+
+ /* what was waited on didn't connect AND didn't mark unavail */
+ if (!ds->ds_clp && !nfs4_test_deviceid_unavailable(devid))
+ goto again;
}
/*
* At this point the ds->ds_clp should be ready, but it might have
* hit an error.
*/
- if (!ds->ds_clp || !nfs_client_init_is_complete(ds->ds_clp)) {
- WARN_ON_ONCE(1);
- return -EINVAL;
+ if (!err) {
+ if (!ds->ds_clp || !nfs_client_init_is_complete(ds->ds_clp)) {
+ WARN_ON_ONCE(ds->ds_clp ||
+ !nfs4_test_deviceid_unavailable(devid));
+ return -EINVAL;
+ }
+ err = nfs_client_init_status(ds->ds_clp);
}
- return nfs_client_init_status(ds->ds_clp);
+ return err;
}
EXPORT_SYMBOL_GPL(nfs4_pnfs_ds_connect);