aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenny Halevy <bhalevy@panasas.com>2009-04-01 09:22:50 -0400
committerBenny Halevy <bhalevy@panasas.com>2009-06-17 15:25:13 -0400
commit008f55d0e019943323c20a03493a2ba5672a4cc8 (patch)
tree9d23ac89a198b307fa39018a228bd365e72a40d2
parentb4b82607ffcf09b57301846d154f2c09c0b807c0 (diff)
nfs41: recover lease in _nfs4_lookup_root
This creates the nfsv4.1 session on mount. Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/client.c16
-rw-r--r--fs/nfs/internal.h1
-rw-r--r--fs/nfs/nfs4proc.c9
3 files changed, 25 insertions, 1 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index d28a987f569e..3e232bf56dfb 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -528,6 +528,22 @@ void nfs_mark_client_ready(struct nfs_client *clp, int state)
528} 528}
529 529
530/* 530/*
531 * With sessions, the client is not marked ready until after a
532 * successful EXCHANGE_ID and CREATE_SESSION.
533 *
534 * Map errors cl_cons_state errors to EPROTONOSUPPORT to indicate
535 * other versions of NFS can be tried.
536 */
537int nfs4_check_client_ready(struct nfs_client *clp)
538{
539 if (!nfs4_has_session(clp))
540 return 0;
541 if (clp->cl_cons_state < NFS_CS_READY)
542 return -EPROTONOSUPPORT;
543 return 0;
544}
545
546/*
531 * Initialise the timeout values for a connection 547 * Initialise the timeout values for a connection
532 */ 548 */
533static void nfs_init_timeout_values(struct rpc_timeout *to, int proto, 549static void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 78508f29c03a..acee3274d275 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -114,6 +114,7 @@ extern struct nfs_server *nfs_clone_server(struct nfs_server *,
114 struct nfs_fh *, 114 struct nfs_fh *,
115 struct nfs_fattr *); 115 struct nfs_fattr *);
116extern void nfs_mark_client_ready(struct nfs_client *clp, int state); 116extern void nfs_mark_client_ready(struct nfs_client *clp, int state);
117extern int nfs4_check_client_ready(struct nfs_client *clp);
117#ifdef CONFIG_PROC_FS 118#ifdef CONFIG_PROC_FS
118extern int __init nfs_fs_proc_init(void); 119extern int __init nfs_fs_proc_init(void);
119extern void nfs_fs_proc_exit(void); 120extern void nfs_fs_proc_exit(void);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 64d611658d1f..31ce758d53d5 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2024,8 +2024,15 @@ static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
2024 .rpc_argp = &args, 2024 .rpc_argp = &args,
2025 .rpc_resp = &res, 2025 .rpc_resp = &res,
2026 }; 2026 };
2027 int status;
2028
2027 nfs_fattr_init(info->fattr); 2029 nfs_fattr_init(info->fattr);
2028 return nfs4_call_sync(server, &msg, &args, &res, 0); 2030 status = nfs4_recover_expired_lease(server);
2031 if (!status)
2032 status = nfs4_check_client_ready(server->nfs_client);
2033 if (!status)
2034 status = nfs4_call_sync(server, &msg, &args, &res, 0);
2035 return status;
2029} 2036}
2030 2037
2031static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, 2038static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,