diff options
-rw-r--r-- | net/sunrpc/rpcb_clnt.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 691bd216f469..8b75c306e661 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
@@ -168,6 +168,30 @@ static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr, | |||
168 | return rpc_create(&args); | 168 | return rpc_create(&args); |
169 | } | 169 | } |
170 | 170 | ||
171 | static int rpcb_register_call(struct sockaddr *addr, size_t addrlen, | ||
172 | u32 version, struct rpc_message *msg, | ||
173 | int *result) | ||
174 | { | ||
175 | struct rpc_clnt *rpcb_clnt; | ||
176 | int error = 0; | ||
177 | |||
178 | *result = 0; | ||
179 | |||
180 | rpcb_clnt = rpcb_create_local(addr, addrlen, version); | ||
181 | if (!IS_ERR(rpcb_clnt)) { | ||
182 | error = rpc_call_sync(rpcb_clnt, msg, 0); | ||
183 | rpc_shutdown_client(rpcb_clnt); | ||
184 | } else | ||
185 | error = PTR_ERR(rpcb_clnt); | ||
186 | |||
187 | if (error < 0) | ||
188 | printk(KERN_WARNING "RPC: failed to contact local rpcbind " | ||
189 | "server (errno %d).\n", -error); | ||
190 | dprintk("RPC: registration status %d/%d\n", error, *result); | ||
191 | |||
192 | return error; | ||
193 | } | ||
194 | |||
171 | /** | 195 | /** |
172 | * rpcb_register - set or unset a port registration with the local rpcbind svc | 196 | * rpcb_register - set or unset a port registration with the local rpcbind svc |
173 | * @prog: RPC program number to bind | 197 | * @prog: RPC program number to bind |
@@ -189,33 +213,21 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) | |||
189 | .r_port = port, | 213 | .r_port = port, |
190 | }; | 214 | }; |
191 | struct rpc_message msg = { | 215 | struct rpc_message msg = { |
192 | .rpc_proc = &rpcb_procedures2[port ? | ||
193 | RPCBPROC_SET : RPCBPROC_UNSET], | ||
194 | .rpc_argp = &map, | 216 | .rpc_argp = &map, |
195 | .rpc_resp = okay, | 217 | .rpc_resp = okay, |
196 | }; | 218 | }; |
197 | struct rpc_clnt *rpcb_clnt; | ||
198 | int error = 0; | ||
199 | 219 | ||
200 | dprintk("RPC: %sregistering (%u, %u, %d, %u) with local " | 220 | dprintk("RPC: %sregistering (%u, %u, %d, %u) with local " |
201 | "rpcbind\n", (port ? "" : "un"), | 221 | "rpcbind\n", (port ? "" : "un"), |
202 | prog, vers, prot, port); | 222 | prog, vers, prot, port); |
203 | 223 | ||
204 | rpcb_clnt = rpcb_create_local((struct sockaddr *)&rpcb_inaddr_loopback, | 224 | msg.rpc_proc = &rpcb_procedures2[RPCBPROC_UNSET]; |
205 | sizeof(rpcb_inaddr_loopback), | 225 | if (port) |
206 | RPCBVERS_2); | 226 | msg.rpc_proc = &rpcb_procedures2[RPCBPROC_SET]; |
207 | if (!IS_ERR(rpcb_clnt)) { | ||
208 | error = rpc_call_sync(rpcb_clnt, &msg, 0); | ||
209 | rpc_shutdown_client(rpcb_clnt); | ||
210 | } else | ||
211 | error = PTR_ERR(rpcb_clnt); | ||
212 | 227 | ||
213 | if (error < 0) | 228 | return rpcb_register_call((struct sockaddr *)&rpcb_inaddr_loopback, |
214 | printk(KERN_WARNING "RPC: failed to contact local rpcbind " | 229 | sizeof(rpcb_inaddr_loopback), |
215 | "server (errno %d).\n", -error); | 230 | RPCBVERS_2, &msg, okay); |
216 | dprintk("RPC: registration status %d/%d\n", error, *okay); | ||
217 | |||
218 | return error; | ||
219 | } | 231 | } |
220 | 232 | ||
221 | /** | 233 | /** |