aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-02-08 05:25:37 -0500
committerPhilipp Reisner <philipp.reisner@linbit.com>2011-09-28 04:33:03 -0400
commit907599e0446f03b66257cf79720cc0fc1f37b7e3 (patch)
treed1b275af54b2fea2980bde79bab5c87a631ca098 /drivers
parent062e879c8b473d2dba270f8244a211b0c4dafe28 (diff)
drbd: Converted drbd_connect() from mdev to tconn
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/drbd/drbd_receiver.c102
1 files changed, 53 insertions, 49 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 05d6499da63b..28df7cd55b3f 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -746,6 +746,24 @@ static int drbd_socket_okay(struct socket **sock)
746 } 746 }
747} 747}
748 748
749static int drbd_connected(int vnr, void *p, void *data)
750{
751 struct drbd_conf *mdev = (struct drbd_conf *)p;
752 int ok = 1;
753
754 atomic_set(&mdev->packet_seq, 0);
755 mdev->peer_seq = 0;
756
757 ok &= drbd_send_sync_param(mdev, &mdev->sync_conf);
758 ok &= drbd_send_sizes(mdev, 0, 0);
759 ok &= drbd_send_uuids(mdev);
760 ok &= drbd_send_state(mdev);
761 clear_bit(USE_DEGR_WFC_T, &mdev->flags);
762 clear_bit(RESIZE_PENDING, &mdev->flags);
763
764 return !ok;
765}
766
749/* 767/*
750 * return values: 768 * return values:
751 * 1 yes, we have a valid connection 769 * 1 yes, we have a valid connection
@@ -754,18 +772,16 @@ static int drbd_socket_okay(struct socket **sock)
754 * no point in trying again, please go standalone. 772 * no point in trying again, please go standalone.
755 * -2 We do not have a network config... 773 * -2 We do not have a network config...
756 */ 774 */
757static int drbd_connect(struct drbd_conf *mdev) 775static int drbd_connect(struct drbd_tconn *tconn)
758{ 776{
759 struct socket *s, *sock, *msock; 777 struct socket *s, *sock, *msock;
760 int try, h, ok; 778 int try, h, ok;
761 779
762 D_ASSERT(!mdev->tconn->data.socket); 780 if (drbd_request_state(tconn->volume0, NS(conn, C_WF_CONNECTION)) < SS_SUCCESS)
763
764 if (drbd_request_state(mdev, NS(conn, C_WF_CONNECTION)) < SS_SUCCESS)
765 return -2; 781 return -2;
766 782
767 clear_bit(DISCARD_CONCURRENT, &mdev->tconn->flags); 783 clear_bit(DISCARD_CONCURRENT, &tconn->flags);
768 mdev->tconn->agreed_pro_version = 99; 784 tconn->agreed_pro_version = 99;
769 /* agreed_pro_version must be smaller than 100 so we send the old 785 /* agreed_pro_version must be smaller than 100 so we send the old
770 header (h80) in the first packet and in the handshake packet. */ 786 header (h80) in the first packet and in the handshake packet. */
771 787
@@ -775,7 +791,7 @@ static int drbd_connect(struct drbd_conf *mdev)
775 do { 791 do {
776 for (try = 0;;) { 792 for (try = 0;;) {
777 /* 3 tries, this should take less than a second! */ 793 /* 3 tries, this should take less than a second! */
778 s = drbd_try_connect(mdev->tconn); 794 s = drbd_try_connect(tconn);
779 if (s || ++try >= 3) 795 if (s || ++try >= 3)
780 break; 796 break;
781 /* give the other side time to call bind() & listen() */ 797 /* give the other side time to call bind() & listen() */
@@ -784,21 +800,21 @@ static int drbd_connect(struct drbd_conf *mdev)
784 800
785 if (s) { 801 if (s) {
786 if (!sock) { 802 if (!sock) {
787 drbd_send_fp(mdev->tconn, s, P_HAND_SHAKE_S); 803 drbd_send_fp(tconn, s, P_HAND_SHAKE_S);
788 sock = s; 804 sock = s;
789 s = NULL; 805 s = NULL;
790 } else if (!msock) { 806 } else if (!msock) {
791 drbd_send_fp(mdev->tconn, s, P_HAND_SHAKE_M); 807 drbd_send_fp(tconn, s, P_HAND_SHAKE_M);
792 msock = s; 808 msock = s;
793 s = NULL; 809 s = NULL;
794 } else { 810 } else {
795 dev_err(DEV, "Logic error in drbd_connect()\n"); 811 conn_err(tconn, "Logic error in drbd_connect()\n");
796 goto out_release_sockets; 812 goto out_release_sockets;
797 } 813 }
798 } 814 }
799 815
800 if (sock && msock) { 816 if (sock && msock) {
801 schedule_timeout_interruptible(mdev->tconn->net_conf->ping_timeo*HZ/10); 817 schedule_timeout_interruptible(tconn->net_conf->ping_timeo*HZ/10);
802 ok = drbd_socket_okay(&sock); 818 ok = drbd_socket_okay(&sock);
803 ok = drbd_socket_okay(&msock) && ok; 819 ok = drbd_socket_okay(&msock) && ok;
804 if (ok) 820 if (ok)
@@ -806,41 +822,41 @@ static int drbd_connect(struct drbd_conf *mdev)
806 } 822 }
807 823
808retry: 824retry:
809 s = drbd_wait_for_connect(mdev->tconn); 825 s = drbd_wait_for_connect(tconn);
810 if (s) { 826 if (s) {
811 try = drbd_recv_fp(mdev->tconn, s); 827 try = drbd_recv_fp(tconn, s);
812 drbd_socket_okay(&sock); 828 drbd_socket_okay(&sock);
813 drbd_socket_okay(&msock); 829 drbd_socket_okay(&msock);
814 switch (try) { 830 switch (try) {
815 case P_HAND_SHAKE_S: 831 case P_HAND_SHAKE_S:
816 if (sock) { 832 if (sock) {
817 dev_warn(DEV, "initial packet S crossed\n"); 833 conn_warn(tconn, "initial packet S crossed\n");
818 sock_release(sock); 834 sock_release(sock);
819 } 835 }
820 sock = s; 836 sock = s;
821 break; 837 break;
822 case P_HAND_SHAKE_M: 838 case P_HAND_SHAKE_M:
823 if (msock) { 839 if (msock) {
824 dev_warn(DEV, "initial packet M crossed\n"); 840 conn_warn(tconn, "initial packet M crossed\n");
825 sock_release(msock); 841 sock_release(msock);
826 } 842 }
827 msock = s; 843 msock = s;
828 set_bit(DISCARD_CONCURRENT, &mdev->tconn->flags); 844 set_bit(DISCARD_CONCURRENT, &tconn->flags);
829 break; 845 break;
830 default: 846 default:
831 dev_warn(DEV, "Error receiving initial packet\n"); 847 conn_warn(tconn, "Error receiving initial packet\n");
832 sock_release(s); 848 sock_release(s);
833 if (random32() & 1) 849 if (random32() & 1)
834 goto retry; 850 goto retry;
835 } 851 }
836 } 852 }
837 853
838 if (mdev->state.conn <= C_DISCONNECTING) 854 if (tconn->volume0->state.conn <= C_DISCONNECTING)
839 goto out_release_sockets; 855 goto out_release_sockets;
840 if (signal_pending(current)) { 856 if (signal_pending(current)) {
841 flush_signals(current); 857 flush_signals(current);
842 smp_rmb(); 858 smp_rmb();
843 if (get_t_state(&mdev->tconn->receiver) == EXITING) 859 if (get_t_state(&tconn->receiver) == EXITING)
844 goto out_release_sockets; 860 goto out_release_sockets;
845 } 861 }
846 862
@@ -862,65 +878,53 @@ retry:
862 msock->sk->sk_priority = TC_PRIO_INTERACTIVE; 878 msock->sk->sk_priority = TC_PRIO_INTERACTIVE;
863 879
864 /* NOT YET ... 880 /* NOT YET ...
865 * sock->sk->sk_sndtimeo = mdev->tconn->net_conf->timeout*HZ/10; 881 * sock->sk->sk_sndtimeo = tconn->net_conf->timeout*HZ/10;
866 * sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; 882 * sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
867 * first set it to the P_HAND_SHAKE timeout, 883 * first set it to the P_HAND_SHAKE timeout,
868 * which we set to 4x the configured ping_timeout. */ 884 * which we set to 4x the configured ping_timeout. */
869 sock->sk->sk_sndtimeo = 885 sock->sk->sk_sndtimeo =
870 sock->sk->sk_rcvtimeo = mdev->tconn->net_conf->ping_timeo*4*HZ/10; 886 sock->sk->sk_rcvtimeo = tconn->net_conf->ping_timeo*4*HZ/10;
871 887
872 msock->sk->sk_sndtimeo = mdev->tconn->net_conf->timeout*HZ/10; 888 msock->sk->sk_sndtimeo = tconn->net_conf->timeout*HZ/10;
873 msock->sk->sk_rcvtimeo = mdev->tconn->net_conf->ping_int*HZ; 889 msock->sk->sk_rcvtimeo = tconn->net_conf->ping_int*HZ;
874 890
875 /* we don't want delays. 891 /* we don't want delays.
876 * we use TCP_CORK where appropriate, though */ 892 * we use TCP_CORK where appropriate, though */
877 drbd_tcp_nodelay(sock); 893 drbd_tcp_nodelay(sock);
878 drbd_tcp_nodelay(msock); 894 drbd_tcp_nodelay(msock);
879 895
880 mdev->tconn->data.socket = sock; 896 tconn->data.socket = sock;
881 mdev->tconn->meta.socket = msock; 897 tconn->meta.socket = msock;
882 mdev->tconn->last_received = jiffies; 898 tconn->last_received = jiffies;
883
884 D_ASSERT(mdev->tconn->asender.task == NULL);
885 899
886 h = drbd_do_handshake(mdev->tconn); 900 h = drbd_do_handshake(tconn);
887 if (h <= 0) 901 if (h <= 0)
888 return h; 902 return h;
889 903
890 if (mdev->tconn->cram_hmac_tfm) { 904 if (tconn->cram_hmac_tfm) {
891 /* drbd_request_state(mdev, NS(conn, WFAuth)); */ 905 /* drbd_request_state(mdev, NS(conn, WFAuth)); */
892 switch (drbd_do_auth(mdev->tconn)) { 906 switch (drbd_do_auth(tconn)) {
893 case -1: 907 case -1:
894 dev_err(DEV, "Authentication of peer failed\n"); 908 conn_err(tconn, "Authentication of peer failed\n");
895 return -1; 909 return -1;
896 case 0: 910 case 0:
897 dev_err(DEV, "Authentication of peer failed, trying again.\n"); 911 conn_err(tconn, "Authentication of peer failed, trying again.\n");
898 return 0; 912 return 0;
899 } 913 }
900 } 914 }
901 915
902 if (drbd_request_state(mdev, NS(conn, C_WF_REPORT_PARAMS)) < SS_SUCCESS) 916 if (drbd_request_state(tconn->volume0, NS(conn, C_WF_REPORT_PARAMS)) < SS_SUCCESS)
903 return 0; 917 return 0;
904 918
905 sock->sk->sk_sndtimeo = mdev->tconn->net_conf->timeout*HZ/10; 919 sock->sk->sk_sndtimeo = tconn->net_conf->timeout*HZ/10;
906 sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; 920 sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
907 921
908 atomic_set(&mdev->packet_seq, 0); 922 drbd_thread_start(&tconn->asender);
909 mdev->peer_seq = 0;
910
911 drbd_thread_start(&mdev->tconn->asender);
912 923
913 if (drbd_send_protocol(mdev->tconn) == -1) 924 if (drbd_send_protocol(tconn) == -1)
914 return -1; 925 return -1;
915 drbd_send_sync_param(mdev, &mdev->sync_conf);
916 drbd_send_sizes(mdev, 0, 0);
917 drbd_send_uuids(mdev);
918 drbd_send_state(mdev);
919 clear_bit(USE_DEGR_WFC_T, &mdev->flags);
920 clear_bit(RESIZE_PENDING, &mdev->flags);
921 mod_timer(&mdev->request_timer, jiffies + HZ); /* just start it here. */
922 926
923 return 1; 927 return !idr_for_each(&tconn->volumes, drbd_connected, tconn);
924 928
925out_release_sockets: 929out_release_sockets:
926 if (sock) 930 if (sock)
@@ -4222,7 +4226,7 @@ int drbdd_init(struct drbd_thread *thi)
4222 dev_info(DEV, "receiver (re)started\n"); 4226 dev_info(DEV, "receiver (re)started\n");
4223 4227
4224 do { 4228 do {
4225 h = drbd_connect(mdev); 4229 h = drbd_connect(mdev->tconn);
4226 if (h == 0) { 4230 if (h == 0) {
4227 drbd_disconnect(mdev); 4231 drbd_disconnect(mdev);
4228 schedule_timeout_interruptible(HZ); 4232 schedule_timeout_interruptible(HZ);