aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/drbd/drbd_receiver.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index a56340dd5710..f9a3e199e715 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -571,6 +571,25 @@ static int drbd_recv(struct drbd_conf *mdev, void *buf, size_t size)
571 return rv; 571 return rv;
572} 572}
573 573
574/* quoting tcp(7):
575 * On individual connections, the socket buffer size must be set prior to the
576 * listen(2) or connect(2) calls in order to have it take effect.
577 * This is our wrapper to do so.
578 */
579static void drbd_setbufsize(struct socket *sock, unsigned int snd,
580 unsigned int rcv)
581{
582 /* open coded SO_SNDBUF, SO_RCVBUF */
583 if (snd) {
584 sock->sk->sk_sndbuf = snd;
585 sock->sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
586 }
587 if (rcv) {
588 sock->sk->sk_rcvbuf = rcv;
589 sock->sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
590 }
591}
592
574static struct socket *drbd_try_connect(struct drbd_conf *mdev) 593static struct socket *drbd_try_connect(struct drbd_conf *mdev)
575{ 594{
576 const char *what; 595 const char *what;
@@ -592,6 +611,8 @@ static struct socket *drbd_try_connect(struct drbd_conf *mdev)
592 611
593 sock->sk->sk_rcvtimeo = 612 sock->sk->sk_rcvtimeo =
594 sock->sk->sk_sndtimeo = mdev->net_conf->try_connect_int*HZ; 613 sock->sk->sk_sndtimeo = mdev->net_conf->try_connect_int*HZ;
614 drbd_setbufsize(sock, mdev->net_conf->sndbuf_size,
615 mdev->net_conf->rcvbuf_size);
595 616
596 /* explicitly bind to the configured IP as source IP 617 /* explicitly bind to the configured IP as source IP
597 * for the outgoing connections. 618 * for the outgoing connections.
@@ -670,6 +691,8 @@ static struct socket *drbd_wait_for_connect(struct drbd_conf *mdev)
670 s_listen->sk->sk_reuse = 1; /* SO_REUSEADDR */ 691 s_listen->sk->sk_reuse = 1; /* SO_REUSEADDR */
671 s_listen->sk->sk_rcvtimeo = timeo; 692 s_listen->sk->sk_rcvtimeo = timeo;
672 s_listen->sk->sk_sndtimeo = timeo; 693 s_listen->sk->sk_sndtimeo = timeo;
694 drbd_setbufsize(s_listen, mdev->net_conf->sndbuf_size,
695 mdev->net_conf->rcvbuf_size);
673 696
674 what = "bind before listen"; 697 what = "bind before listen";
675 err = s_listen->ops->bind(s_listen, 698 err = s_listen->ops->bind(s_listen,
@@ -856,16 +879,6 @@ retry:
856 sock->sk->sk_priority = TC_PRIO_INTERACTIVE_BULK; 879 sock->sk->sk_priority = TC_PRIO_INTERACTIVE_BULK;
857 msock->sk->sk_priority = TC_PRIO_INTERACTIVE; 880 msock->sk->sk_priority = TC_PRIO_INTERACTIVE;
858 881
859 if (mdev->net_conf->sndbuf_size) {
860 sock->sk->sk_sndbuf = mdev->net_conf->sndbuf_size;
861 sock->sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
862 }
863
864 if (mdev->net_conf->rcvbuf_size) {
865 sock->sk->sk_rcvbuf = mdev->net_conf->rcvbuf_size;
866 sock->sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
867 }
868
869 /* NOT YET ... 882 /* NOT YET ...
870 * sock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/10; 883 * sock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/10;
871 * sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; 884 * sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;