diff options
-rw-r--r-- | net/sunrpc/rpcb_clnt.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index d550d0b967db..8ea8907d4b8d 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
@@ -262,8 +262,8 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port) | |||
262 | /* | 262 | /* |
263 | * Fill in AF_INET family-specific arguments to register | 263 | * Fill in AF_INET family-specific arguments to register |
264 | */ | 264 | */ |
265 | static int rpcb_register_netid4(const struct sockaddr *sap, | 265 | static int rpcb_register_inet4(const struct sockaddr *sap, |
266 | struct rpc_message *msg) | 266 | struct rpc_message *msg) |
267 | { | 267 | { |
268 | const struct sockaddr_in *sin = (const struct sockaddr_in *)sap; | 268 | const struct sockaddr_in *sin = (const struct sockaddr_in *)sap; |
269 | struct rpcbind_args *map = msg->rpc_argp; | 269 | struct rpcbind_args *map = msg->rpc_argp; |
@@ -290,8 +290,8 @@ static int rpcb_register_netid4(const struct sockaddr *sap, | |||
290 | /* | 290 | /* |
291 | * Fill in AF_INET6 family-specific arguments to register | 291 | * Fill in AF_INET6 family-specific arguments to register |
292 | */ | 292 | */ |
293 | static int rpcb_register_netid6(const struct sockaddr *sap, | 293 | static int rpcb_register_inet6(const struct sockaddr *sap, |
294 | struct rpc_message *msg) | 294 | struct rpc_message *msg) |
295 | { | 295 | { |
296 | const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sap; | 296 | const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sap; |
297 | struct rpcbind_args *map = msg->rpc_argp; | 297 | struct rpcbind_args *map = msg->rpc_argp; |
@@ -319,6 +319,20 @@ static int rpcb_register_netid6(const struct sockaddr *sap, | |||
319 | return rpcb_register_call(RPCBVERS_4, msg); | 319 | return rpcb_register_call(RPCBVERS_4, msg); |
320 | } | 320 | } |
321 | 321 | ||
322 | static int rpcb_unregister_all_protofamilies(struct rpc_message *msg) | ||
323 | { | ||
324 | struct rpcbind_args *map = msg->rpc_argp; | ||
325 | |||
326 | dprintk("RPC: unregistering [%u, %u, '%s'] with " | ||
327 | "local rpcbind\n", | ||
328 | map->r_prog, map->r_vers, map->r_netid); | ||
329 | |||
330 | map->r_addr = ""; | ||
331 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; | ||
332 | |||
333 | return rpcb_register_call(RPCBVERS_4, msg); | ||
334 | } | ||
335 | |||
322 | /** | 336 | /** |
323 | * rpcb_v4_register - set or unset a port registration with the local rpcbind | 337 | * rpcb_v4_register - set or unset a port registration with the local rpcbind |
324 | * @program: RPC program number of service to (un)register | 338 | * @program: RPC program number of service to (un)register |
@@ -336,10 +350,11 @@ static int rpcb_register_netid6(const struct sockaddr *sap, | |||
336 | * invoke this function once for each [program, version, address, | 350 | * invoke this function once for each [program, version, address, |
337 | * netid] tuple they wish to advertise. | 351 | * netid] tuple they wish to advertise. |
338 | * | 352 | * |
339 | * Callers may also unregister RPC services that are no longer | 353 | * Callers may also unregister RPC services that are registered at a |
340 | * available by setting the port number in the passed-in address | 354 | * specific address by setting the port number in @address to zero. |
341 | * to zero. Callers pass a netid of "" to unregister all | 355 | * They may unregister all registered protocol families at once for |
342 | * transport netids associated with [program, version, address]. | 356 | * a service by passing a NULL @address argument. If @netid is "" |
357 | * then all netids for [program, version, address] are unregistered. | ||
343 | * | 358 | * |
344 | * This function uses rpcbind protocol version 4 to contact the | 359 | * This function uses rpcbind protocol version 4 to contact the |
345 | * local rpcbind daemon. The local rpcbind daemon must support | 360 | * local rpcbind daemon. The local rpcbind daemon must support |
@@ -374,11 +389,14 @@ int rpcb_v4_register(const u32 program, const u32 version, | |||
374 | .rpc_argp = &map, | 389 | .rpc_argp = &map, |
375 | }; | 390 | }; |
376 | 391 | ||
392 | if (address == NULL) | ||
393 | return rpcb_unregister_all_protofamilies(&msg); | ||
394 | |||
377 | switch (address->sa_family) { | 395 | switch (address->sa_family) { |
378 | case AF_INET: | 396 | case AF_INET: |
379 | return rpcb_register_netid4(address, &msg); | 397 | return rpcb_register_inet4(address, &msg); |
380 | case AF_INET6: | 398 | case AF_INET6: |
381 | return rpcb_register_netid6(address, &msg); | 399 | return rpcb_register_inet6(address, &msg); |
382 | } | 400 | } |
383 | 401 | ||
384 | return -EAFNOSUPPORT; | 402 | return -EAFNOSUPPORT; |