|
@@ -5603,53 +5603,78 @@ int nfs4_proc_destroy_session(struct nfs4_session *session)
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * With sessions, the client is not marked ready until after a
|
|
|
|
+ * successful EXCHANGE_ID and CREATE_SESSION.
|
|
|
|
+ *
|
|
|
|
+ * Map errors cl_cons_state errors to EPROTONOSUPPORT to indicate
|
|
|
|
+ * other versions of NFS can be tried.
|
|
|
|
+ */
|
|
|
|
+static int nfs41_check_session_ready(struct nfs_client *clp)
|
|
|
|
+{
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ if (clp->cl_cons_state == NFS_CS_SESSION_INITING) {
|
|
|
|
+ ret = nfs4_client_recover_expired_lease(clp);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+ if (clp->cl_cons_state < NFS_CS_READY)
|
|
|
|
+ return -EPROTONOSUPPORT;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
int nfs4_init_session(struct nfs_server *server)
|
|
int nfs4_init_session(struct nfs_server *server)
|
|
{
|
|
{
|
|
struct nfs_client *clp = server->nfs_client;
|
|
struct nfs_client *clp = server->nfs_client;
|
|
struct nfs4_session *session;
|
|
struct nfs4_session *session;
|
|
unsigned int rsize, wsize;
|
|
unsigned int rsize, wsize;
|
|
- int ret;
|
|
|
|
|
|
|
|
if (!nfs4_has_session(clp))
|
|
if (!nfs4_has_session(clp))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
session = clp->cl_session;
|
|
session = clp->cl_session;
|
|
- if (!test_and_clear_bit(NFS4_SESSION_INITING, &session->session_state))
|
|
|
|
- return 0;
|
|
|
|
|
|
+ spin_lock(&clp->cl_lock);
|
|
|
|
+ if (test_and_clear_bit(NFS4_SESSION_INITING, &session->session_state)) {
|
|
|
|
|
|
- rsize = server->rsize;
|
|
|
|
- if (rsize == 0)
|
|
|
|
- rsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
|
- wsize = server->wsize;
|
|
|
|
- if (wsize == 0)
|
|
|
|
- wsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
|
|
|
+ rsize = server->rsize;
|
|
|
|
+ if (rsize == 0)
|
|
|
|
+ rsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
|
+ wsize = server->wsize;
|
|
|
|
+ if (wsize == 0)
|
|
|
|
+ wsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
|
|
|
- session->fc_attrs.max_rqst_sz = wsize + nfs41_maxwrite_overhead;
|
|
|
|
- session->fc_attrs.max_resp_sz = rsize + nfs41_maxread_overhead;
|
|
|
|
|
|
+ session->fc_attrs.max_rqst_sz = wsize + nfs41_maxwrite_overhead;
|
|
|
|
+ session->fc_attrs.max_resp_sz = rsize + nfs41_maxread_overhead;
|
|
|
|
+ }
|
|
|
|
+ spin_unlock(&clp->cl_lock);
|
|
|
|
|
|
- ret = nfs4_recover_expired_lease(server);
|
|
|
|
- if (!ret)
|
|
|
|
- ret = nfs4_check_client_ready(clp);
|
|
|
|
- return ret;
|
|
|
|
|
|
+ return nfs41_check_session_ready(clp);
|
|
}
|
|
}
|
|
|
|
|
|
-int nfs4_init_ds_session(struct nfs_client *clp)
|
|
|
|
|
|
+int nfs4_init_ds_session(struct nfs_client *clp, unsigned long lease_time)
|
|
{
|
|
{
|
|
struct nfs4_session *session = clp->cl_session;
|
|
struct nfs4_session *session = clp->cl_session;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- if (!test_and_clear_bit(NFS4_SESSION_INITING, &session->session_state))
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- ret = nfs4_client_recover_expired_lease(clp);
|
|
|
|
- if (!ret)
|
|
|
|
- /* Test for the DS role */
|
|
|
|
- if (!is_ds_client(clp))
|
|
|
|
- ret = -ENODEV;
|
|
|
|
- if (!ret)
|
|
|
|
- ret = nfs4_check_client_ready(clp);
|
|
|
|
- return ret;
|
|
|
|
|
|
+ spin_lock(&clp->cl_lock);
|
|
|
|
+ if (test_and_clear_bit(NFS4_SESSION_INITING, &session->session_state)) {
|
|
|
|
+ /*
|
|
|
|
+ * Do not set NFS_CS_CHECK_LEASE_TIME instead set the
|
|
|
|
+ * DS lease to be equal to the MDS lease.
|
|
|
|
+ */
|
|
|
|
+ clp->cl_lease_time = lease_time;
|
|
|
|
+ clp->cl_last_renewal = jiffies;
|
|
|
|
+ }
|
|
|
|
+ spin_unlock(&clp->cl_lock);
|
|
|
|
|
|
|
|
+ ret = nfs41_check_session_ready(clp);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ /* Test for the DS role */
|
|
|
|
+ if (!is_ds_client(clp))
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(nfs4_init_ds_session);
|
|
EXPORT_SYMBOL_GPL(nfs4_init_ds_session);
|
|
|
|
|