Commit 52c4044d authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust

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: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 86d61d86
...@@ -41,6 +41,54 @@ struct nlm_wait { ...@@ -41,6 +41,54 @@ struct nlm_wait {
static LIST_HEAD(nlm_blocked); static LIST_HEAD(nlm_blocked);
/**
* nlmclnt_init - Set up per-NFS mount point lockd data structures
* @server_name: server's hostname
* @server_address: server's network address
* @server_addrlen: length of server's address
* @protocol: transport protocol lockd should use
* @nfs_version: NFS protocol version for this mount point
*
* Returns pointer to an appropriate nlm_host struct,
* or an ERR_PTR value.
*/
struct nlm_host *nlmclnt_init(const char *server_name,
const struct sockaddr *server_address,
size_t server_addrlen,
unsigned short protocol, u32 nfs_version)
{
struct nlm_host *host;
u32 nlm_version = (nfs_version == 2) ? 1 : 4;
int status;
status = lockd_up(protocol);
if (status < 0)
return ERR_PTR(status);
host = nlmclnt_lookup_host((struct sockaddr_in *)server_address,
protocol, nlm_version,
server_name, strlen(server_name));
if (host == NULL) {
lockd_down();
return ERR_PTR(-ENOLCK);
}
return host;
}
EXPORT_SYMBOL_GPL(nlmclnt_init);
/**
* nlmclnt_done - Release resources allocated by nlmclnt_init()
* @host: nlm_host structure reserved by nlmclnt_init()
*
*/
void nlmclnt_done(struct nlm_host *host)
{
nlm_release_host(host);
lockd_down();
}
EXPORT_SYMBOL_GPL(nlmclnt_done);
/* /*
* Queue up a lock for blocking so that the GRANTED request can see it * Queue up a lock for blocking so that the GRANTED request can see it
*/ */
......
...@@ -35,6 +35,13 @@ extern struct nlmsvc_binding * nlmsvc_ops; ...@@ -35,6 +35,13 @@ extern struct nlmsvc_binding * nlmsvc_ops;
/* /*
* Functions exported by the lockd module * Functions exported by the lockd module
*/ */
extern struct nlm_host *nlmclnt_init(const char *server_name,
const struct sockaddr *server_address,
size_t server_addrlen,
unsigned short protocol,
u32 nfs_version);
extern void nlmclnt_done(struct nlm_host *host);
extern int nlmclnt_proc(struct inode *, int, struct file_lock *); extern int nlmclnt_proc(struct inode *, int, struct file_lock *);
extern int lockd_up(int proto); extern int lockd_up(int proto);
extern void lockd_down(void); extern void lockd_down(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment