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>
This commit is contained in:
committed by
Trond Myklebust
parent
86d61d8638
commit
52c4044d00
@@ -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;
|
|||||||
/*
|
/*
|
||||||
* 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);
|
||||||
|
Reference in New Issue
Block a user