diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-02-08 05:25:37 -0500 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2011-09-28 04:33:03 -0400 |
commit | 907599e0446f03b66257cf79720cc0fc1f37b7e3 (patch) | |
tree | d1b275af54b2fea2980bde79bab5c87a631ca098 /drivers | |
parent | 062e879c8b473d2dba270f8244a211b0c4dafe28 (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.c | 102 |
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 | ||
749 | static 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 | */ |
757 | static int drbd_connect(struct drbd_conf *mdev) | 775 | static 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 | ||
808 | retry: | 824 | retry: |
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 | ||
925 | out_release_sockets: | 929 | out_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); |