diff options
-rw-r--r-- | fs/lockd/clntlock.c | 22 | ||||
-rw-r--r-- | fs/nfs/client.c | 17 | ||||
-rw-r--r-- | include/linux/lockd/bind.h | 19 |
3 files changed, 32 insertions, 26 deletions
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index 9a8f4f45c19e..0b45fd3a4bfd 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c | |||
@@ -43,31 +43,25 @@ static LIST_HEAD(nlm_blocked); | |||
43 | 43 | ||
44 | /** | 44 | /** |
45 | * nlmclnt_init - Set up per-NFS mount point lockd data structures | 45 | * nlmclnt_init - Set up per-NFS mount point lockd data structures |
46 | * @server_name: server's hostname | 46 | * @nlm_init: pointer to arguments structure |
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 | * | 47 | * |
52 | * Returns pointer to an appropriate nlm_host struct, | 48 | * Returns pointer to an appropriate nlm_host struct, |
53 | * or an ERR_PTR value. | 49 | * or an ERR_PTR value. |
54 | */ | 50 | */ |
55 | struct nlm_host *nlmclnt_init(const char *server_name, | 51 | struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init) |
56 | const struct sockaddr *server_address, | ||
57 | size_t server_addrlen, | ||
58 | unsigned short protocol, u32 nfs_version) | ||
59 | { | 52 | { |
60 | struct nlm_host *host; | 53 | struct nlm_host *host; |
61 | u32 nlm_version = (nfs_version == 2) ? 1 : 4; | 54 | u32 nlm_version = (nlm_init->nfs_version == 2) ? 1 : 4; |
62 | int status; | 55 | int status; |
63 | 56 | ||
64 | status = lockd_up(protocol); | 57 | status = lockd_up(nlm_init->protocol); |
65 | if (status < 0) | 58 | if (status < 0) |
66 | return ERR_PTR(status); | 59 | return ERR_PTR(status); |
67 | 60 | ||
68 | host = nlmclnt_lookup_host((struct sockaddr_in *)server_address, | 61 | host = nlmclnt_lookup_host((struct sockaddr_in *)nlm_init->address, |
69 | protocol, nlm_version, | 62 | nlm_init->protocol, nlm_version, |
70 | server_name, strlen(server_name)); | 63 | nlm_init->hostname, |
64 | strlen(nlm_init->hostname)); | ||
71 | if (host == NULL) { | 65 | if (host == NULL) { |
72 | lockd_down(); | 66 | lockd_down(); |
73 | return ERR_PTR(-ENOLCK); | 67 | return ERR_PTR(-ENOLCK); |
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 0b3ce86f6fc9..7a15832369e9 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -468,18 +468,21 @@ static int nfs_start_lockd(struct nfs_server *server) | |||
468 | { | 468 | { |
469 | struct nlm_host *host; | 469 | struct nlm_host *host; |
470 | struct nfs_client *clp = server->nfs_client; | 470 | struct nfs_client *clp = server->nfs_client; |
471 | u32 nfs_version = clp->rpc_ops->version; | 471 | struct nlmclnt_initdata nlm_init = { |
472 | unsigned short protocol = server->flags & NFS_MOUNT_TCP ? | 472 | .hostname = clp->cl_hostname, |
473 | IPPROTO_TCP : IPPROTO_UDP; | 473 | .address = (struct sockaddr *)&clp->cl_addr, |
474 | .addrlen = clp->cl_addrlen, | ||
475 | .protocol = server->flags & NFS_MOUNT_TCP ? | ||
476 | IPPROTO_TCP : IPPROTO_UDP, | ||
477 | .nfs_version = clp->rpc_ops->version, | ||
478 | }; | ||
474 | 479 | ||
475 | if (nfs_version > 3) | 480 | if (nlm_init.nfs_version > 3) |
476 | return 0; | 481 | return 0; |
477 | if (server->flags & NFS_MOUNT_NONLM) | 482 | if (server->flags & NFS_MOUNT_NONLM) |
478 | return 0; | 483 | return 0; |
479 | 484 | ||
480 | host = nlmclnt_init(clp->cl_hostname, | 485 | host = nlmclnt_init(&nlm_init); |
481 | (struct sockaddr *)&clp->cl_addr, | ||
482 | clp->cl_addrlen, protocol, nfs_version); | ||
483 | if (IS_ERR(host)) | 486 | if (IS_ERR(host)) |
484 | return PTR_ERR(host); | 487 | return PTR_ERR(host); |
485 | 488 | ||
diff --git a/include/linux/lockd/bind.h b/include/linux/lockd/bind.h index 73368075af03..3d25bcd139d1 100644 --- a/include/linux/lockd/bind.h +++ b/include/linux/lockd/bind.h | |||
@@ -33,13 +33,22 @@ struct nlmsvc_binding { | |||
33 | extern struct nlmsvc_binding * nlmsvc_ops; | 33 | extern struct nlmsvc_binding * nlmsvc_ops; |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * Similar to nfs_client_initdata, but without the NFS-specific | ||
37 | * rpc_ops field. | ||
38 | */ | ||
39 | struct nlmclnt_initdata { | ||
40 | const char *hostname; | ||
41 | const struct sockaddr *address; | ||
42 | size_t addrlen; | ||
43 | unsigned short protocol; | ||
44 | u32 nfs_version; | ||
45 | }; | ||
46 | |||
47 | /* | ||
36 | * Functions exported by the lockd module | 48 | * Functions exported by the lockd module |
37 | */ | 49 | */ |
38 | extern struct nlm_host *nlmclnt_init(const char *server_name, | 50 | |
39 | const struct sockaddr *server_address, | 51 | extern struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init); |
40 | size_t server_addrlen, | ||
41 | unsigned short protocol, | ||
42 | u32 nfs_version); | ||
43 | extern void nlmclnt_done(struct nlm_host *host); | 52 | extern void nlmclnt_done(struct nlm_host *host); |
44 | 53 | ||
45 | extern int nlmclnt_proc(struct nlm_host *host, int cmd, | 54 | extern int nlmclnt_proc(struct nlm_host *host, int cmd, |