NFSv4.1: new flag for lease time check
authorAndy Adamson <andros@netapp.com>
Tue, 1 Mar 2011 01:34:11 +0000 (01:34 +0000)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 11 Mar 2011 20:38:41 +0000 (15:38 -0500)
Data servers cannot send nfs4_proc_get_lease_time. but still need to setup
state renewal. Add the NFS_CS_CHECK_LEASE_TIME bit to indicate if the lease
time can be checked.

Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/client.c
fs/nfs/nfs4state.c
include/linux/nfs_fs_sb.h

index a86698cd82fdc1952d4412012c4cca588d6bf222..280d41f64a57fe507006911db21b4a1b86a4b4c7 100644 (file)
@@ -1400,6 +1400,15 @@ static int nfs4_set_client(struct nfs_server *server,
                goto error;
        }
 
+       /*
+        * Query for the lease time on clientid setup or renewal
+        *
+        * Note that this will be set on nfs_clients that were created
+        * only for the DS role and did not set this bit, but now will
+        * serve a dual role.
+        */
+       set_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state);
+
        server->nfs_client = clp;
        dprintk("<-- nfs4_set_client() = 0 [new %p]\n", clp);
        return 0;
index 0592288f9f06744216fc497e85717cb637951f2c..69c83637312443e65fa3466eff4aac7066302341 100644 (file)
@@ -153,6 +153,11 @@ static int nfs41_setup_state_renewal(struct nfs_client *clp)
        int status;
        struct nfs_fsinfo fsinfo;
 
+       if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) {
+               nfs4_schedule_state_renewal(clp);
+               return 0;
+       }
+
        status = nfs4_proc_get_lease_time(clp, &fsinfo);
        if (status == 0) {
                /* Update lease time and schedule renewal */
index 0bac4176e505c6a92de7138b6d44e7c171bc2061..c00d4ec47ec3be69a0b170e32377d87f4526d6a6 100644 (file)
@@ -31,6 +31,7 @@ struct nfs_client {
 #define NFS_CS_IDMAP           2               /* - idmap started */
 #define NFS_CS_RENEWD          3               /* - renewd started */
 #define NFS_CS_STOP_RENEW      4               /* no more state to renew */
+#define NFS_CS_CHECK_LEASE_TIME        5               /* need to check lease time */
        struct sockaddr_storage cl_addr;        /* server identifier */
        size_t                  cl_addrlen;
        char *                  cl_hostname;    /* hostname of server */