diff options
author | Benjamin Poirier <bpoirier@suse.de> | 2012-03-08 00:55:59 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-03-08 16:52:09 -0500 |
commit | 2f2d76cc3e938389feee671b46252dde6880b3b7 (patch) | |
tree | 250a56bfb70175a266ae26132e795d1e884a6196 /fs/dlm | |
parent | 0343c5543b1d3ffa08e6716d82afb62648b80eba (diff) |
dlm: Do not allocate a fd for peeloff
avoids allocating a fd that a) propagates to every kernel thread and
usermodehelper b) is not properly released.
References: http://article.gmane.org/gmane.linux.network.drbd/22529
Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/dlm')
-rw-r--r-- | fs/dlm/lowcomms.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 0b3109ee4257..ca0c59a4246c 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <linux/mutex.h> | 52 | #include <linux/mutex.h> |
53 | #include <linux/sctp.h> | 53 | #include <linux/sctp.h> |
54 | #include <linux/slab.h> | 54 | #include <linux/slab.h> |
55 | #include <net/sctp/sctp.h> | ||
55 | #include <net/sctp/user.h> | 56 | #include <net/sctp/user.h> |
56 | #include <net/ipv6.h> | 57 | #include <net/ipv6.h> |
57 | 58 | ||
@@ -474,9 +475,6 @@ static void process_sctp_notification(struct connection *con, | |||
474 | int prim_len, ret; | 475 | int prim_len, ret; |
475 | int addr_len; | 476 | int addr_len; |
476 | struct connection *new_con; | 477 | struct connection *new_con; |
477 | sctp_peeloff_arg_t parg; | ||
478 | int parglen = sizeof(parg); | ||
479 | int err; | ||
480 | 478 | ||
481 | /* | 479 | /* |
482 | * We get this before any data for an association. | 480 | * We get this before any data for an association. |
@@ -525,23 +523,19 @@ static void process_sctp_notification(struct connection *con, | |||
525 | return; | 523 | return; |
526 | 524 | ||
527 | /* Peel off a new sock */ | 525 | /* Peel off a new sock */ |
528 | parg.associd = sn->sn_assoc_change.sac_assoc_id; | 526 | sctp_lock_sock(con->sock->sk); |
529 | ret = kernel_getsockopt(con->sock, IPPROTO_SCTP, | 527 | ret = sctp_do_peeloff(con->sock->sk, |
530 | SCTP_SOCKOPT_PEELOFF, | 528 | sn->sn_assoc_change.sac_assoc_id, |
531 | (void *)&parg, &parglen); | 529 | &new_con->sock); |
530 | sctp_release_sock(con->sock->sk); | ||
532 | if (ret < 0) { | 531 | if (ret < 0) { |
533 | log_print("Can't peel off a socket for " | 532 | log_print("Can't peel off a socket for " |
534 | "connection %d to node %d: err=%d", | 533 | "connection %d to node %d: err=%d", |
535 | parg.associd, nodeid, ret); | 534 | (int)sn->sn_assoc_change.sac_assoc_id, |
536 | return; | 535 | nodeid, ret); |
537 | } | ||
538 | new_con->sock = sockfd_lookup(parg.sd, &err); | ||
539 | if (!new_con->sock) { | ||
540 | log_print("sockfd_lookup error %d", err); | ||
541 | return; | 536 | return; |
542 | } | 537 | } |
543 | add_sock(new_con->sock, new_con); | 538 | add_sock(new_con->sock, new_con); |
544 | sockfd_put(new_con->sock); | ||
545 | 539 | ||
546 | log_print("connecting to %d sctp association %d", | 540 | log_print("connecting to %d sctp association %d", |
547 | nodeid, (int)sn->sn_assoc_change.sac_assoc_id); | 541 | nodeid, (int)sn->sn_assoc_change.sac_assoc_id); |