aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2008-01-11 17:09:44 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-01-30 02:06:06 -0500
commit52c4044d00fe703eb3fb18e0d8dfd1c196eb28be (patch)
treee8ff891bc68ee10ebe3d067b13ba31e2deb645bb
parent86d61d8638ddf9cdf87df26c7fa69b2804425fbe (diff)
NLM: Introduce external nlm_host set-up and tear-down functions
We would like to remove the per-lock-operation nlm_lookup_host() call from nlmclnt_proc(). The new architecture pins an nlm_host structure to each NFS client superblock that has the "lock" mount option set. The NFS client passes in the pinned nlm_host structure during each call to nlmclnt_proc(). NFS client unmount processing "puts" the nlm_host so it can be garbage- collected later. This patch introduces externally callable NLM functions that handle mount-time nlm_host set up and tear-down. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/lockd/clntlock.c48
-rw-r--r--include/linux/lockd/bind.h7
2 files changed, 55 insertions, 0 deletions
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c
index d070b18e539d..9a8f4f45c19e 100644
--- a/fs/lockd/clntlock.c
+++ b/fs/lockd/clntlock.c
@@ -41,6 +41,54 @@ struct nlm_wait {
41 41
42static LIST_HEAD(nlm_blocked); 42static LIST_HEAD(nlm_blocked);
43 43
44/**
45 * nlmclnt_init - Set up per-NFS mount point lockd data structures
46 * @server_name: server's hostname
47 * @server_address: server's network address
48 * @server_addrlen: length of server's address
49 * @protocol: transport protocol lockd should use
50 * @nfs_version: NFS protocol version for this mount point
51 *
52 * Returns pointer to an appropriate nlm_host struct,
53 * or an ERR_PTR value.
54 */
55struct nlm_host *nlmclnt_init(const char *server_name,
56 const struct sockaddr *server_address,
57 size_t server_addrlen,
58 unsigned short protocol, u32 nfs_version)
59{
60 struct nlm_host *host;
61 u32 nlm_version = (nfs_version == 2) ? 1 : 4;
62 int status;
63
64 status = lockd_up(protocol);
65 if (status < 0)
66 return ERR_PTR(status);
67
68 host = nlmclnt_lookup_host((struct sockaddr_in *)server_address,
69 protocol, nlm_version,
70 server_name, strlen(server_name));
71 if (host == NULL) {
72 lockd_down();
73 return ERR_PTR(-ENOLCK);
74 }
75
76 return host;
77}
78EXPORT_SYMBOL_GPL(nlmclnt_init);
79
80/**
81 * nlmclnt_done - Release resources allocated by nlmclnt_init()
82 * @host: nlm_host structure reserved by nlmclnt_init()
83 *
84 */
85void nlmclnt_done(struct nlm_host *host)
86{
87 nlm_release_host(host);
88 lockd_down();
89}
90EXPORT_SYMBOL_GPL(nlmclnt_done);
91
44/* 92/*
45 * Queue up a lock for blocking so that the GRANTED request can see it 93 * Queue up a lock for blocking so that the GRANTED request can see it
46 */ 94 */
diff --git a/include/linux/lockd/bind.h b/include/linux/lockd/bind.h
index 6f1637c61e10..ad5402f5456b 100644
--- a/include/linux/lockd/bind.h
+++ b/include/linux/lockd/bind.h
@@ -35,6 +35,13 @@ extern struct nlmsvc_binding * nlmsvc_ops;
35/* 35/*
36 * Functions exported by the lockd module 36 * Functions exported by the lockd module
37 */ 37 */
38extern struct nlm_host *nlmclnt_init(const char *server_name,
39 const struct sockaddr *server_address,
40 size_t server_addrlen,
41 unsigned short protocol,
42 u32 nfs_version);
43extern void nlmclnt_done(struct nlm_host *host);
44
38extern int nlmclnt_proc(struct inode *, int, struct file_lock *); 45extern int nlmclnt_proc(struct inode *, int, struct file_lock *);
39extern int lockd_up(int proto); 46extern int lockd_up(int proto);
40extern void lockd_down(void); 47extern void lockd_down(void);