nfs41: nfs41_setup_state_renewal
authorRicardo Labiaga <Ricardo.Labiaga@netapp.com>
Sun, 6 Dec 2009 17:23:46 +0000 (12:23 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sun, 6 Dec 2009 17:23:46 +0000 (12:23 -0500)
Move call to get the lease time and the setup of the state
renewal out of nfs4_create_session so that it can be called
after clearing the DRAINING flag.  We use the getattr RPC
to obtain the lease time, which requires a sequence slot.

Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4_fs.h
fs/nfs/nfs4proc.c
fs/nfs/nfs4state.c

index 50dd55069d3dd7394c2e5768ac2086ac35c414de..7e57b04e40141f5971dfabd63f848d07cc7ceeb2 100644 (file)
@@ -225,6 +225,8 @@ extern struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp);
 extern int nfs4_proc_create_session(struct nfs_client *);
 extern int nfs4_proc_destroy_session(struct nfs4_session *);
 extern int nfs4_init_session(struct nfs_server *server);
+extern int nfs4_proc_get_lease_time(struct nfs_client *clp,
+               struct nfs_fsinfo *fsinfo);
 #else /* CONFIG_NFS_v4_1 */
 static inline int nfs4_setup_sequence(struct nfs_client *clp,
                struct nfs4_sequence_args *args, struct nfs4_sequence_res *res,
index b4ef570eb53c49b7db0cf8ecb07448cd57a1a71f..4be0369425697e6fe97eedff1a750591c49cbbc3 100644 (file)
@@ -4745,7 +4745,6 @@ int nfs4_proc_create_session(struct nfs_client *clp)
 {
        int status;
        unsigned *ptr;
-       struct nfs_fsinfo fsinfo;
        struct nfs4_session *session = clp->cl_session;
 
        dprintk("--> %s clp=%p session=%p\n", __func__, clp, session);
@@ -4767,18 +4766,6 @@ int nfs4_proc_create_session(struct nfs_client *clp)
        ptr = (unsigned *)&session->sess_id.data[0];
        dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__,
                clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]);
-
-       /* Get the lease time */
-       status = nfs4_proc_get_lease_time(clp, &fsinfo);
-       if (status == 0) {
-               /* Update lease time and schedule renewal */
-               spin_lock(&clp->cl_lock);
-               clp->cl_lease_time = fsinfo.lease_time * HZ;
-               clp->cl_last_renewal = jiffies;
-               spin_unlock(&clp->cl_lock);
-
-               nfs4_schedule_state_renewal(clp);
-       }
 out:
        dprintk("<-- %s\n", __func__);
        return status;
index ef9622e500e4d16936790d3dcfb71970b5197689..9cfe6864d9ed506da17241828dd7c1411af57e23 100644 (file)
@@ -116,16 +116,38 @@ struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp)
 
 #if defined(CONFIG_NFS_V4_1)
 
+static int nfs41_setup_state_renewal(struct nfs_client *clp)
+{
+       int status;
+       struct nfs_fsinfo fsinfo;
+
+       status = nfs4_proc_get_lease_time(clp, &fsinfo);
+       if (status == 0) {
+               /* Update lease time and schedule renewal */
+               spin_lock(&clp->cl_lock);
+               clp->cl_lease_time = fsinfo.lease_time * HZ;
+               clp->cl_last_renewal = jiffies;
+               spin_unlock(&clp->cl_lock);
+
+               nfs4_schedule_state_renewal(clp);
+       }
+
+       return status;
+}
+
 int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
 {
        int status;
 
        status = nfs4_proc_exchange_id(clp, cred);
-       if (status == 0)
-               /* create session schedules state renewal upon success */
-               status = nfs4_proc_create_session(clp);
-       if (status == 0)
-               nfs_mark_client_ready(clp, NFS_CS_READY);
+       if (status != 0)
+               goto out;
+       status = nfs4_proc_create_session(clp);
+       if (status != 0)
+               goto out;
+       nfs41_setup_state_renewal(clp);
+       nfs_mark_client_ready(clp, NFS_CS_READY);
+out:
        return status;
 }
 
@@ -1248,6 +1270,8 @@ out:
        /* Wake up the next rpc task even on error */
        clear_bit(NFS4CLNT_SESSION_DRAINING, &clp->cl_state);
        rpc_wake_up(&clp->cl_session->fc_slot_table.slot_tbl_waitq);
+       if (status == 0)
+               nfs41_setup_state_renewal(clp);
        return status;
 }