diff options
| author | Chuck Lever <chuck.lever@oracle.com> | 2008-01-11 17:09:44 -0500 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-01-30 02:06:06 -0500 |
| commit | 52c4044d00fe703eb3fb18e0d8dfd1c196eb28be (patch) | |
| tree | e8ff891bc68ee10ebe3d067b13ba31e2deb645bb /fs/lockd | |
| parent | 86d61d8638ddf9cdf87df26c7fa69b2804425fbe (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>
Diffstat (limited to 'fs/lockd')
| -rw-r--r-- | fs/lockd/clntlock.c | 48 |
1 files changed, 48 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 | ||
| 42 | static LIST_HEAD(nlm_blocked); | 42 | static 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 | */ | ||
| 55 | struct 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 | } | ||
| 78 | EXPORT_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 | */ | ||
| 85 | void nlmclnt_done(struct nlm_host *host) | ||
| 86 | { | ||
| 87 | nlm_release_host(host); | ||
| 88 | lockd_down(); | ||
| 89 | } | ||
| 90 | EXPORT_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 | */ |
