aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2011-03-28 08:23:08 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 10:45:08 -0500
commit9f5bdc339e3becd85aa8add305d794b0b1ec8996 (patch)
treea52dcd2faa3fa88d9d5caf65003c1b2ae56f52d9 /drivers/block/drbd
parent52b061a44021ca11ee2fd238040e91341ff8066d (diff)
drbd: Replace and remove old primitives
Centralize sock->mutex locking and unlocking in [drbd|conn]_prepare_command() and [drbd|conn]_send_comman(). Therefore all *_send_* functions are touched to use these primitives instead of drbd_get_data_sock()/drbd_put_data_sock() and former helper functions. That change makes the *_send_* functions more standardized. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd')
-rw-r--r--drivers/block/drbd/drbd_int.h60
-rw-r--r--drivers/block/drbd/drbd_main.c518
-rw-r--r--drivers/block/drbd/drbd_receiver.c90
-rw-r--r--drivers/block/drbd/drbd_worker.c24
4 files changed, 319 insertions, 373 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index 729c96fc0c87..663f7b611756 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1060,22 +1060,6 @@ static inline struct drbd_conf *vnr_to_mdev(struct drbd_tconn *tconn, int vnr)
1060 return (struct drbd_conf *)idr_find(&tconn->volumes, vnr); 1060 return (struct drbd_conf *)idr_find(&tconn->volumes, vnr);
1061} 1061}
1062 1062
1063static inline int drbd_get_data_sock(struct drbd_tconn *tconn)
1064{
1065 mutex_lock(&tconn->data.mutex);
1066 if (!tconn->data.socket) {
1067 /* Disconnected. */
1068 mutex_unlock(&tconn->data.mutex);
1069 return -EIO;
1070 }
1071 return 0;
1072}
1073
1074static inline void drbd_put_data_sock(struct drbd_tconn *tconn)
1075{
1076 mutex_unlock(&tconn->data.mutex);
1077}
1078
1079/* 1063/*
1080 * function declarations 1064 * function declarations
1081 *************************/ 1065 *************************/
@@ -1118,13 +1102,6 @@ extern int _conn_send_state_req(struct drbd_tconn *, int vnr, enum drbd_packet c
1118 union drbd_state, union drbd_state); 1102 union drbd_state, union drbd_state);
1119extern int _drbd_send_state(struct drbd_conf *mdev); 1103extern int _drbd_send_state(struct drbd_conf *mdev);
1120extern int drbd_send_state(struct drbd_conf *mdev); 1104extern int drbd_send_state(struct drbd_conf *mdev);
1121extern int _conn_send_cmd(struct drbd_tconn *tconn, int vnr, struct drbd_socket *sock,
1122 enum drbd_packet cmd, struct p_header *h, size_t size,
1123 unsigned msg_flags);
1124extern int conn_send_cmd(struct drbd_tconn *tconn, int vnr, struct drbd_socket *sock,
1125 enum drbd_packet cmd, struct p_header *h, size_t size);
1126extern int conn_send_cmd2(struct drbd_tconn *tconn, enum drbd_packet cmd,
1127 char *data, size_t size);
1128extern int drbd_send_sync_param(struct drbd_conf *mdev); 1105extern int drbd_send_sync_param(struct drbd_conf *mdev);
1129extern void drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr, 1106extern void drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr,
1130 u32 set_size); 1107 u32 set_size);
@@ -1149,7 +1126,7 @@ extern int drbd_send_ov_request(struct drbd_conf *mdev,sector_t sector,int size)
1149 1126
1150extern int drbd_send_bitmap(struct drbd_conf *mdev); 1127extern int drbd_send_bitmap(struct drbd_conf *mdev);
1151extern void drbd_send_sr_reply(struct drbd_conf *mdev, enum drbd_state_rv retcode); 1128extern void drbd_send_sr_reply(struct drbd_conf *mdev, enum drbd_state_rv retcode);
1152extern int conn_send_sr_reply(struct drbd_tconn *tconn, enum drbd_state_rv retcode); 1129extern void conn_send_sr_reply(struct drbd_tconn *tconn, enum drbd_state_rv retcode);
1153extern void drbd_free_bc(struct drbd_backing_dev *ldev); 1130extern void drbd_free_bc(struct drbd_backing_dev *ldev);
1154extern void drbd_mdev_cleanup(struct drbd_conf *mdev); 1131extern void drbd_mdev_cleanup(struct drbd_conf *mdev);
1155void drbd_print_uuids(struct drbd_conf *mdev, const char *text); 1132void drbd_print_uuids(struct drbd_conf *mdev, const char *text);
@@ -1885,26 +1862,6 @@ static inline void request_ping(struct drbd_tconn *tconn)
1885 wake_asender(tconn); 1862 wake_asender(tconn);
1886} 1863}
1887 1864
1888static inline int _drbd_send_cmd(struct drbd_conf *mdev, struct drbd_socket *sock,
1889 enum drbd_packet cmd, struct p_header *h, size_t size,
1890 unsigned msg_flags)
1891{
1892 return _conn_send_cmd(mdev->tconn, mdev->vnr, sock, cmd, h, size, msg_flags);
1893}
1894
1895static inline int drbd_send_cmd(struct drbd_conf *mdev, struct drbd_socket *sock,
1896 enum drbd_packet cmd, struct p_header *h, size_t size)
1897{
1898 return conn_send_cmd(mdev->tconn, mdev->vnr, sock, cmd, h, size);
1899}
1900
1901static inline int drbd_send_short_cmd(struct drbd_conf *mdev,
1902 enum drbd_packet cmd)
1903{
1904 struct p_header h;
1905 return drbd_send_cmd(mdev, &mdev->tconn->data, cmd, &h, sizeof(h));
1906}
1907
1908extern void *conn_prepare_command(struct drbd_tconn *, struct drbd_socket *); 1865extern void *conn_prepare_command(struct drbd_tconn *, struct drbd_socket *);
1909extern void *drbd_prepare_command(struct drbd_conf *, struct drbd_socket *); 1866extern void *drbd_prepare_command(struct drbd_conf *, struct drbd_socket *);
1910extern int conn_send_command(struct drbd_tconn *, struct drbd_socket *, 1867extern int conn_send_command(struct drbd_tconn *, struct drbd_socket *,
@@ -1916,19 +1873,8 @@ extern int drbd_send_command(struct drbd_conf *, struct drbd_socket *,
1916 1873
1917extern int drbd_send_ping(struct drbd_tconn *tconn); 1874extern int drbd_send_ping(struct drbd_tconn *tconn);
1918extern int drbd_send_ping_ack(struct drbd_tconn *tconn); 1875extern int drbd_send_ping_ack(struct drbd_tconn *tconn);
1919 1876extern int drbd_send_state_req(struct drbd_conf *, union drbd_state, union drbd_state);
1920static inline int drbd_send_state_req(struct drbd_conf *mdev, 1877extern int conn_send_state_req(struct drbd_tconn *, union drbd_state, union drbd_state);
1921 union drbd_state mask, union drbd_state val)
1922{
1923 return _conn_send_state_req(mdev->tconn, mdev->vnr, P_STATE_CHG_REQ, mask, val);
1924}
1925
1926static inline int conn_send_state_req(struct drbd_tconn *tconn,
1927 union drbd_state mask, union drbd_state val)
1928{
1929 enum drbd_packet cmd = tconn->agreed_pro_version < 100 ? P_STATE_CHG_REQ : P_CONN_ST_CHG_REQ;
1930 return _conn_send_state_req(tconn, 0, cmd, mask, val);
1931}
1932 1878
1933static inline void drbd_thread_stop(struct drbd_thread *thi) 1879static inline void drbd_thread_stop(struct drbd_thread *thi)
1934{ 1880{
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 606a9ecbe044..230622f1aae2 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -717,8 +717,8 @@ static void prepare_header95(struct p_header95 *h, enum drbd_packet cmd, int siz
717 h->length = cpu_to_be32(size); 717 h->length = cpu_to_be32(size);
718} 718}
719 719
720static void _prepare_header(struct drbd_tconn *tconn, int vnr, struct p_header *h, 720static void prepare_header(struct drbd_tconn *tconn, int vnr, struct p_header *h,
721 enum drbd_packet cmd, int size) 721 enum drbd_packet cmd, int size)
722{ 722{
723 if (tconn->agreed_pro_version >= 95) 723 if (tconn->agreed_pro_version >= 95)
724 prepare_header95(&h->h95, cmd, size); 724 prepare_header95(&h->h95, cmd, size);
@@ -726,59 +726,6 @@ static void _prepare_header(struct drbd_tconn *tconn, int vnr, struct p_header *
726 prepare_header80(&h->h80, cmd, size); 726 prepare_header80(&h->h80, cmd, size);
727} 727}
728 728
729static void prepare_header(struct drbd_conf *mdev, struct p_header *h,
730 enum drbd_packet cmd, int size)
731{
732 _prepare_header(mdev->tconn, mdev->vnr, h, cmd, size);
733}
734
735/* the appropriate socket mutex must be held already */
736int _conn_send_cmd(struct drbd_tconn *tconn, int vnr, struct drbd_socket *sock,
737 enum drbd_packet cmd, struct p_header *h, size_t size,
738 unsigned msg_flags)
739{
740 int err;
741
742 _prepare_header(tconn, vnr, h, cmd, size - sizeof(struct p_header));
743 err = drbd_send_all(tconn, sock->socket, h, size, msg_flags);
744 if (err && !signal_pending(current))
745 conn_warn(tconn, "short send %s size=%d\n",
746 cmdname(cmd), (int)size);
747 return err;
748}
749
750/* don't pass the socket. we may only look at it
751 * when we hold the appropriate socket mutex.
752 */
753int conn_send_cmd(struct drbd_tconn *tconn, int vnr, struct drbd_socket *sock,
754 enum drbd_packet cmd, struct p_header *h, size_t size)
755{
756 int err = -EIO;
757
758 mutex_lock(&sock->mutex);
759 if (sock->socket)
760 err = _conn_send_cmd(tconn, vnr, sock, cmd, h, size, 0);
761 mutex_unlock(&sock->mutex);
762 return err;
763}
764
765int conn_send_cmd2(struct drbd_tconn *tconn, enum drbd_packet cmd, char *data,
766 size_t size)
767{
768 struct p_header80 h;
769 int err;
770
771 prepare_header80(&h, cmd, size);
772 err = drbd_get_data_sock(tconn);
773 if (!err) {
774 err = drbd_send_all(tconn, tconn->data.socket, &h, sizeof(h), 0);
775 if (!err)
776 err = drbd_send_all(tconn, tconn->data.socket, data, size, 0);
777 drbd_put_data_sock(tconn);
778 }
779 return err;
780}
781
782void *conn_prepare_command(struct drbd_tconn *tconn, struct drbd_socket *sock) 729void *conn_prepare_command(struct drbd_tconn *tconn, struct drbd_socket *sock)
783{ 730{
784 mutex_lock(&sock->mutex); 731 mutex_lock(&sock->mutex);
@@ -811,8 +758,8 @@ static int __send_command(struct drbd_tconn *tconn, int vnr,
811 */ 758 */
812 msg_flags = data ? MSG_MORE : 0; 759 msg_flags = data ? MSG_MORE : 0;
813 760
814 _prepare_header(tconn, vnr, sock->sbuf, cmd, 761 prepare_header(tconn, vnr, sock->sbuf, cmd,
815 header_size - sizeof(struct p_header) + size); 762 header_size - sizeof(struct p_header) + size);
816 err = drbd_send_all(tconn, sock->socket, sock->sbuf, header_size, 763 err = drbd_send_all(tconn, sock->socket, sock->sbuf, header_size,
817 msg_flags); 764 msg_flags);
818 if (data && !err) 765 if (data && !err)
@@ -845,22 +792,36 @@ int drbd_send_command(struct drbd_conf *mdev, struct drbd_socket *sock,
845 792
846int drbd_send_ping(struct drbd_tconn *tconn) 793int drbd_send_ping(struct drbd_tconn *tconn)
847{ 794{
848 struct p_header h; 795 struct drbd_socket *sock;
849 return conn_send_cmd(tconn, 0, &tconn->meta, P_PING, &h, sizeof(h)); 796
797 sock = &tconn->meta;
798 if (!conn_prepare_command(tconn, sock))
799 return -EIO;
800 return conn_send_command(tconn, sock, P_PING, sizeof(struct p_header), NULL, 0);
850} 801}
851 802
852int drbd_send_ping_ack(struct drbd_tconn *tconn) 803int drbd_send_ping_ack(struct drbd_tconn *tconn)
853{ 804{
854 struct p_header h; 805 struct drbd_socket *sock;
855 return conn_send_cmd(tconn, 0, &tconn->meta, P_PING_ACK, &h, sizeof(h)); 806
807 sock = &tconn->meta;
808 if (!conn_prepare_command(tconn, sock))
809 return -EIO;
810 return conn_send_command(tconn, sock, P_PING_ACK, sizeof(struct p_header), NULL, 0);
856} 811}
857 812
858int drbd_send_sync_param(struct drbd_conf *mdev) 813int drbd_send_sync_param(struct drbd_conf *mdev)
859{ 814{
860 struct p_rs_param_95 *p;
861 struct drbd_socket *sock; 815 struct drbd_socket *sock;
862 int size, err; 816 struct p_rs_param_95 *p;
817 int size;
863 const int apv = mdev->tconn->agreed_pro_version; 818 const int apv = mdev->tconn->agreed_pro_version;
819 enum drbd_packet cmd;
820
821 sock = &mdev->tconn->data;
822 p = drbd_prepare_command(mdev, sock);
823 if (!p)
824 return -EIO;
864 825
865 size = apv <= 87 ? sizeof(struct p_rs_param) 826 size = apv <= 87 ? sizeof(struct p_rs_param)
866 : apv == 88 ? sizeof(struct p_rs_param) 827 : apv == 88 ? sizeof(struct p_rs_param)
@@ -868,112 +829,98 @@ int drbd_send_sync_param(struct drbd_conf *mdev)
868 : apv <= 94 ? sizeof(struct p_rs_param_89) 829 : apv <= 94 ? sizeof(struct p_rs_param_89)
869 : /* apv >= 95 */ sizeof(struct p_rs_param_95); 830 : /* apv >= 95 */ sizeof(struct p_rs_param_95);
870 831
871 mutex_lock(&mdev->tconn->data.mutex); 832 cmd = apv >= 89 ? P_SYNC_PARAM89 : P_SYNC_PARAM;
872 sock = &mdev->tconn->data;
873
874 if (likely(sock->socket != NULL)) {
875 enum drbd_packet cmd =
876 apv >= 89 ? P_SYNC_PARAM89 : P_SYNC_PARAM;
877
878 p = mdev->tconn->data.sbuf;
879
880 /* initialize verify_alg and csums_alg */
881 memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX);
882
883 if (get_ldev(mdev)) {
884 p->rate = cpu_to_be32(mdev->ldev->dc.resync_rate);
885 p->c_plan_ahead = cpu_to_be32(mdev->ldev->dc.c_plan_ahead);
886 p->c_delay_target = cpu_to_be32(mdev->ldev->dc.c_delay_target);
887 p->c_fill_target = cpu_to_be32(mdev->ldev->dc.c_fill_target);
888 p->c_max_rate = cpu_to_be32(mdev->ldev->dc.c_max_rate);
889 put_ldev(mdev);
890 } else {
891 p->rate = cpu_to_be32(DRBD_RATE_DEF);
892 p->c_plan_ahead = cpu_to_be32(DRBD_C_PLAN_AHEAD_DEF);
893 p->c_delay_target = cpu_to_be32(DRBD_C_DELAY_TARGET_DEF);
894 p->c_fill_target = cpu_to_be32(DRBD_C_FILL_TARGET_DEF);
895 p->c_max_rate = cpu_to_be32(DRBD_C_MAX_RATE_DEF);
896 }
897 833
898 if (apv >= 88) 834 /* initialize verify_alg and csums_alg */
899 strcpy(p->verify_alg, mdev->tconn->net_conf->verify_alg); 835 memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX);
900 if (apv >= 89)
901 strcpy(p->csums_alg, mdev->tconn->net_conf->csums_alg);
902 836
903 err = _drbd_send_cmd(mdev, sock, cmd, &p->head, size, 0); 837 if (get_ldev(mdev)) {
904 } else 838 p->rate = cpu_to_be32(mdev->ldev->dc.resync_rate);
905 err = -EIO; 839 p->c_plan_ahead = cpu_to_be32(mdev->ldev->dc.c_plan_ahead);
840 p->c_delay_target = cpu_to_be32(mdev->ldev->dc.c_delay_target);
841 p->c_fill_target = cpu_to_be32(mdev->ldev->dc.c_fill_target);
842 p->c_max_rate = cpu_to_be32(mdev->ldev->dc.c_max_rate);
843 put_ldev(mdev);
844 } else {
845 p->rate = cpu_to_be32(DRBD_RATE_DEF);
846 p->c_plan_ahead = cpu_to_be32(DRBD_C_PLAN_AHEAD_DEF);
847 p->c_delay_target = cpu_to_be32(DRBD_C_DELAY_TARGET_DEF);
848 p->c_fill_target = cpu_to_be32(DRBD_C_FILL_TARGET_DEF);
849 p->c_max_rate = cpu_to_be32(DRBD_C_MAX_RATE_DEF);
850 }
906 851
907 mutex_unlock(&mdev->tconn->data.mutex); 852 if (apv >= 88)
853 strcpy(p->verify_alg, mdev->tconn->net_conf->verify_alg);
854 if (apv >= 89)
855 strcpy(p->csums_alg, mdev->tconn->net_conf->csums_alg);
908 856
909 return err; 857 return drbd_send_command(mdev, sock, cmd, size, NULL, 0);
910} 858}
911 859
912int drbd_send_protocol(struct drbd_tconn *tconn) 860int drbd_send_protocol(struct drbd_tconn *tconn)
913{ 861{
862 struct drbd_socket *sock;
914 struct p_protocol *p; 863 struct p_protocol *p;
915 int size, cf, err; 864 int size, cf;
865
866 if (tconn->net_conf->dry_run && tconn->agreed_pro_version < 92) {
867 conn_err(tconn, "--dry-run is not supported by peer");
868 return -EOPNOTSUPP;
869 }
916 870
917 size = sizeof(struct p_protocol); 871 sock = &tconn->data;
872 p = conn_prepare_command(tconn, sock);
873 if (!p)
874 return -EIO;
918 875
876 size = sizeof(*p);
919 if (tconn->agreed_pro_version >= 87) 877 if (tconn->agreed_pro_version >= 87)
920 size += strlen(tconn->net_conf->integrity_alg) + 1; 878 size += strlen(tconn->net_conf->integrity_alg) + 1;
921 879
922 /* we must not recurse into our own queue,
923 * as that is blocked during handshake */
924 p = kmalloc(size, GFP_NOIO);
925 if (p == NULL)
926 return -ENOMEM;
927
928 p->protocol = cpu_to_be32(tconn->net_conf->wire_protocol); 880 p->protocol = cpu_to_be32(tconn->net_conf->wire_protocol);
929 p->after_sb_0p = cpu_to_be32(tconn->net_conf->after_sb_0p); 881 p->after_sb_0p = cpu_to_be32(tconn->net_conf->after_sb_0p);
930 p->after_sb_1p = cpu_to_be32(tconn->net_conf->after_sb_1p); 882 p->after_sb_1p = cpu_to_be32(tconn->net_conf->after_sb_1p);
931 p->after_sb_2p = cpu_to_be32(tconn->net_conf->after_sb_2p); 883 p->after_sb_2p = cpu_to_be32(tconn->net_conf->after_sb_2p);
932 p->two_primaries = cpu_to_be32(tconn->net_conf->two_primaries); 884 p->two_primaries = cpu_to_be32(tconn->net_conf->two_primaries);
933
934 cf = 0; 885 cf = 0;
935 if (tconn->net_conf->want_lose) 886 if (tconn->net_conf->want_lose)
936 cf |= CF_WANT_LOSE; 887 cf |= CF_WANT_LOSE;
937 if (tconn->net_conf->dry_run) { 888 if (tconn->net_conf->dry_run)
938 if (tconn->agreed_pro_version >= 92) 889 cf |= CF_DRY_RUN;
939 cf |= CF_DRY_RUN;
940 else {
941 conn_err(tconn, "--dry-run is not supported by peer");
942 kfree(p);
943 return -EOPNOTSUPP;
944 }
945 }
946 p->conn_flags = cpu_to_be32(cf); 890 p->conn_flags = cpu_to_be32(cf);
947 891
948 if (tconn->agreed_pro_version >= 87) 892 if (tconn->agreed_pro_version >= 87)
949 strcpy(p->integrity_alg, tconn->net_conf->integrity_alg); 893 strcpy(p->integrity_alg, tconn->net_conf->integrity_alg);
950 894 return conn_send_command(tconn, sock, P_PROTOCOL, size, NULL, 0);
951 err = conn_send_cmd2(tconn, P_PROTOCOL, p->head.payload, size - sizeof(struct p_header));
952 kfree(p);
953 return err;
954} 895}
955 896
956int _drbd_send_uuids(struct drbd_conf *mdev, u64 uuid_flags) 897int _drbd_send_uuids(struct drbd_conf *mdev, u64 uuid_flags)
957{ 898{
958 struct p_uuids p; 899 struct drbd_socket *sock;
900 struct p_uuids *p;
959 int i; 901 int i;
960 902
961 if (!get_ldev_if_state(mdev, D_NEGOTIATING)) 903 if (!get_ldev_if_state(mdev, D_NEGOTIATING))
962 return 0; 904 return 0;
963 905
906 sock = &mdev->tconn->data;
907 p = drbd_prepare_command(mdev, sock);
908 if (!p) {
909 put_ldev(mdev);
910 return -EIO;
911 }
964 for (i = UI_CURRENT; i < UI_SIZE; i++) 912 for (i = UI_CURRENT; i < UI_SIZE; i++)
965 p.uuid[i] = mdev->ldev ? cpu_to_be64(mdev->ldev->md.uuid[i]) : 0; 913 p->uuid[i] = mdev->ldev ? cpu_to_be64(mdev->ldev->md.uuid[i]) : 0;
966 914
967 mdev->comm_bm_set = drbd_bm_total_weight(mdev); 915 mdev->comm_bm_set = drbd_bm_total_weight(mdev);
968 p.uuid[UI_SIZE] = cpu_to_be64(mdev->comm_bm_set); 916 p->uuid[UI_SIZE] = cpu_to_be64(mdev->comm_bm_set);
969 uuid_flags |= mdev->tconn->net_conf->want_lose ? 1 : 0; 917 uuid_flags |= mdev->tconn->net_conf->want_lose ? 1 : 0;
970 uuid_flags |= test_bit(CRASHED_PRIMARY, &mdev->flags) ? 2 : 0; 918 uuid_flags |= test_bit(CRASHED_PRIMARY, &mdev->flags) ? 2 : 0;
971 uuid_flags |= mdev->new_state_tmp.disk == D_INCONSISTENT ? 4 : 0; 919 uuid_flags |= mdev->new_state_tmp.disk == D_INCONSISTENT ? 4 : 0;
972 p.uuid[UI_FLAGS] = cpu_to_be64(uuid_flags); 920 p->uuid[UI_FLAGS] = cpu_to_be64(uuid_flags);
973 921
974 put_ldev(mdev); 922 put_ldev(mdev);
975 923 return drbd_send_command(mdev, sock, P_UUIDS, sizeof(*p), NULL, 0);
976 return drbd_send_cmd(mdev, &mdev->tconn->data, P_UUIDS, &p.head, sizeof(p));
977} 924}
978 925
979int drbd_send_uuids(struct drbd_conf *mdev) 926int drbd_send_uuids(struct drbd_conf *mdev)
@@ -1006,7 +953,8 @@ void drbd_print_uuids(struct drbd_conf *mdev, const char *text)
1006 953
1007void drbd_gen_and_send_sync_uuid(struct drbd_conf *mdev) 954void drbd_gen_and_send_sync_uuid(struct drbd_conf *mdev)
1008{ 955{
1009 struct p_rs_uuid p; 956 struct drbd_socket *sock;
957 struct p_rs_uuid *p;
1010 u64 uuid; 958 u64 uuid;
1011 959
1012 D_ASSERT(mdev->state.disk == D_UP_TO_DATE); 960 D_ASSERT(mdev->state.disk == D_UP_TO_DATE);
@@ -1015,14 +963,19 @@ void drbd_gen_and_send_sync_uuid(struct drbd_conf *mdev)
1015 drbd_uuid_set(mdev, UI_BITMAP, uuid); 963 drbd_uuid_set(mdev, UI_BITMAP, uuid);
1016 drbd_print_uuids(mdev, "updated sync UUID"); 964 drbd_print_uuids(mdev, "updated sync UUID");
1017 drbd_md_sync(mdev); 965 drbd_md_sync(mdev);
1018 p.uuid = cpu_to_be64(uuid);
1019 966
1020 drbd_send_cmd(mdev, &mdev->tconn->data, P_SYNC_UUID, &p.head, sizeof(p)); 967 sock = &mdev->tconn->data;
968 p = drbd_prepare_command(mdev, sock);
969 if (p) {
970 p->uuid = cpu_to_be64(uuid);
971 drbd_send_command(mdev, sock, P_SYNC_UUID, sizeof(*p), NULL, 0);
972 }
1021} 973}
1022 974
1023int drbd_send_sizes(struct drbd_conf *mdev, int trigger_reply, enum dds_flags flags) 975int drbd_send_sizes(struct drbd_conf *mdev, int trigger_reply, enum dds_flags flags)
1024{ 976{
1025 struct p_sizes p; 977 struct drbd_socket *sock;
978 struct p_sizes *p;
1026 sector_t d_size, u_size; 979 sector_t d_size, u_size;
1027 int q_order_type, max_bio_size; 980 int q_order_type, max_bio_size;
1028 981
@@ -1041,14 +994,17 @@ int drbd_send_sizes(struct drbd_conf *mdev, int trigger_reply, enum dds_flags fl
1041 max_bio_size = DRBD_MAX_BIO_SIZE; /* ... multiple BIOs per peer_request */ 994 max_bio_size = DRBD_MAX_BIO_SIZE; /* ... multiple BIOs per peer_request */
1042 } 995 }
1043 996
1044 p.d_size = cpu_to_be64(d_size); 997 sock = &mdev->tconn->data;
1045 p.u_size = cpu_to_be64(u_size); 998 p = drbd_prepare_command(mdev, sock);
1046 p.c_size = cpu_to_be64(trigger_reply ? 0 : drbd_get_capacity(mdev->this_bdev)); 999 if (!p)
1047 p.max_bio_size = cpu_to_be32(max_bio_size); 1000 return -EIO;
1048 p.queue_order_type = cpu_to_be16(q_order_type); 1001 p->d_size = cpu_to_be64(d_size);
1049 p.dds_flags = cpu_to_be16(flags); 1002 p->u_size = cpu_to_be64(u_size);
1050 1003 p->c_size = cpu_to_be64(trigger_reply ? 0 : drbd_get_capacity(mdev->this_bdev));
1051 return drbd_send_cmd(mdev, &mdev->tconn->data, P_SIZES, &p.head, sizeof(p)); 1004 p->max_bio_size = cpu_to_be32(max_bio_size);
1005 p->queue_order_type = cpu_to_be16(q_order_type);
1006 p->dds_flags = cpu_to_be16(flags);
1007 return drbd_send_command(mdev, sock, P_SIZES, sizeof(*p), NULL, 0);
1052} 1008}
1053 1009
1054/** 1010/**
@@ -1058,50 +1014,72 @@ int drbd_send_sizes(struct drbd_conf *mdev, int trigger_reply, enum dds_flags fl
1058int drbd_send_state(struct drbd_conf *mdev) 1014int drbd_send_state(struct drbd_conf *mdev)
1059{ 1015{
1060 struct drbd_socket *sock; 1016 struct drbd_socket *sock;
1061 struct p_state p; 1017 struct p_state *p;
1062 int err = -EIO;
1063
1064 mutex_lock(&mdev->tconn->data.mutex);
1065 1018
1066 p.state = cpu_to_be32(mdev->state.i); /* Within the send mutex */
1067 sock = &mdev->tconn->data; 1019 sock = &mdev->tconn->data;
1020 p = drbd_prepare_command(mdev, sock);
1021 if (!p)
1022 return -EIO;
1023 p->state = cpu_to_be32(mdev->state.i); /* Within the send mutex */
1024 return drbd_send_command(mdev, sock, P_STATE, sizeof(*p), NULL, 0);
1025}
1068 1026
1069 if (likely(sock->socket != NULL)) 1027int drbd_send_state_req(struct drbd_conf *mdev, union drbd_state mask, union drbd_state val)
1070 err = _drbd_send_cmd(mdev, sock, P_STATE, &p.head, sizeof(p), 0); 1028{
1029 struct drbd_socket *sock;
1030 struct p_req_state *p;
1071 1031
1072 mutex_unlock(&mdev->tconn->data.mutex); 1032 sock = &mdev->tconn->data;
1033 p = drbd_prepare_command(mdev, sock);
1034 if (!p)
1035 return -EIO;
1036 p->mask = cpu_to_be32(mask.i);
1037 p->val = cpu_to_be32(val.i);
1038 return drbd_send_command(mdev, sock, P_STATE_CHG_REQ, sizeof(*p), NULL, 0);
1073 1039
1074 return err;
1075} 1040}
1076 1041
1077int _conn_send_state_req(struct drbd_tconn *tconn, int vnr, enum drbd_packet cmd, 1042int conn_send_state_req(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val)
1078 union drbd_state mask, union drbd_state val)
1079{ 1043{
1080 struct p_req_state p; 1044 enum drbd_packet cmd;
1081 1045 struct drbd_socket *sock;
1082 p.mask = cpu_to_be32(mask.i); 1046 struct p_req_state *p;
1083 p.val = cpu_to_be32(val.i);
1084 1047
1085 return conn_send_cmd(tconn, vnr, &tconn->data, cmd, &p.head, sizeof(p)); 1048 cmd = tconn->agreed_pro_version < 100 ? P_STATE_CHG_REQ : P_CONN_ST_CHG_REQ;
1049 sock = &tconn->data;
1050 p = conn_prepare_command(tconn, sock);
1051 if (!p)
1052 return -EIO;
1053 p->mask = cpu_to_be32(mask.i);
1054 p->val = cpu_to_be32(val.i);
1055 return conn_send_command(tconn, sock, cmd, sizeof(*p), NULL, 0);
1086} 1056}
1087 1057
1088void drbd_send_sr_reply(struct drbd_conf *mdev, enum drbd_state_rv retcode) 1058void drbd_send_sr_reply(struct drbd_conf *mdev, enum drbd_state_rv retcode)
1089{ 1059{
1090 struct p_req_state_reply p; 1060 struct drbd_socket *sock;
1091 1061 struct p_req_state_reply *p;
1092 p.retcode = cpu_to_be32(retcode);
1093 1062
1094 drbd_send_cmd(mdev, &mdev->tconn->meta, P_STATE_CHG_REPLY, &p.head, sizeof(p)); 1063 sock = &mdev->tconn->meta;
1064 p = drbd_prepare_command(mdev, sock);
1065 if (p) {
1066 p->retcode = cpu_to_be32(retcode);
1067 drbd_send_command(mdev, sock, P_STATE_CHG_REPLY, sizeof(*p), NULL, 0);
1068 }
1095} 1069}
1096 1070
1097int conn_send_sr_reply(struct drbd_tconn *tconn, enum drbd_state_rv retcode) 1071void conn_send_sr_reply(struct drbd_tconn *tconn, enum drbd_state_rv retcode)
1098{ 1072{
1099 struct p_req_state_reply p; 1073 struct drbd_socket *sock;
1074 struct p_req_state_reply *p;
1100 enum drbd_packet cmd = tconn->agreed_pro_version < 100 ? P_STATE_CHG_REPLY : P_CONN_ST_CHG_REPLY; 1075 enum drbd_packet cmd = tconn->agreed_pro_version < 100 ? P_STATE_CHG_REPLY : P_CONN_ST_CHG_REPLY;
1101 1076
1102 p.retcode = cpu_to_be32(retcode); 1077 sock = &tconn->meta;
1103 1078 p = conn_prepare_command(tconn, sock);
1104 return !conn_send_cmd(tconn, 0, &tconn->meta, cmd, &p.head, sizeof(p)); 1079 if (p) {
1080 p->retcode = cpu_to_be32(retcode);
1081 conn_send_command(tconn, sock, cmd, sizeof(*p), NULL, 0);
1082 }
1105} 1083}
1106 1084
1107static void dcbp_set_code(struct p_compressed_bm *p, enum drbd_bitmap_code code) 1085static void dcbp_set_code(struct p_compressed_bm *p, enum drbd_bitmap_code code)
@@ -1224,21 +1202,20 @@ int fill_bitmap_rle_bits(struct drbd_conf *mdev,
1224static int 1202static int
1225send_bitmap_rle_or_plain(struct drbd_conf *mdev, struct bm_xfer_ctx *c) 1203send_bitmap_rle_or_plain(struct drbd_conf *mdev, struct bm_xfer_ctx *c)
1226{ 1204{
1227 struct p_compressed_bm *p = mdev->tconn->data.sbuf; 1205 struct drbd_socket *sock = &mdev->tconn->data;
1206 struct p_compressed_bm *p = sock->sbuf;
1228 unsigned long num_words; 1207 unsigned long num_words;
1229 int len, err; 1208 int len, err;
1230 1209
1231 len = fill_bitmap_rle_bits(mdev, p, c); 1210 len = fill_bitmap_rle_bits(mdev, p, c);
1232
1233 if (len < 0) 1211 if (len < 0)
1234 return -EIO; 1212 return -EIO;
1235 1213
1236 if (len) { 1214 if (len) {
1237 dcbp_set_code(p, RLE_VLI_Bits); 1215 dcbp_set_code(p, RLE_VLI_Bits);
1238 err = _drbd_send_cmd(mdev, &mdev->tconn->data, 1216 err = __send_command(mdev->tconn, mdev->vnr, sock,
1239 P_COMPRESSED_BITMAP, &p->head, 1217 P_COMPRESSED_BITMAP, sizeof(*p) + len,
1240 sizeof(*p) + len, 0); 1218 NULL, 0);
1241
1242 c->packets[0]++; 1219 c->packets[0]++;
1243 c->bytes[0] += sizeof(*p) + len; 1220 c->bytes[0] += sizeof(*p) + len;
1244 1221
@@ -1247,14 +1224,14 @@ send_bitmap_rle_or_plain(struct drbd_conf *mdev, struct bm_xfer_ctx *c)
1247 } else { 1224 } else {
1248 /* was not compressible. 1225 /* was not compressible.
1249 * send a buffer full of plain text bits instead. */ 1226 * send a buffer full of plain text bits instead. */
1250 struct p_header *h = mdev->tconn->data.sbuf; 1227 struct p_header *h = sock->sbuf;
1251 num_words = min_t(size_t, BM_PACKET_WORDS, c->bm_words - c->word_offset); 1228 num_words = min_t(size_t, BM_PACKET_WORDS, c->bm_words - c->word_offset);
1252 len = num_words * sizeof(long); 1229 len = num_words * sizeof(long);
1253 if (len) 1230 if (len)
1254 drbd_bm_get_lel(mdev, c->word_offset, num_words, 1231 drbd_bm_get_lel(mdev, c->word_offset, num_words,
1255 (unsigned long *)h->payload); 1232 (unsigned long *)h->payload);
1256 err = _drbd_send_cmd(mdev, &mdev->tconn->data, P_BITMAP, 1233 err = __send_command(mdev->tconn, mdev->vnr, sock, P_BITMAP,
1257 h, sizeof(struct p_header80) + len, 0); 1234 sizeof(*h) + len, NULL, 0);
1258 c->word_offset += num_words; 1235 c->word_offset += num_words;
1259 c->bit_offset = c->word_offset * BITS_PER_LONG; 1236 c->bit_offset = c->word_offset * BITS_PER_LONG;
1260 1237
@@ -1314,23 +1291,31 @@ static int _drbd_send_bitmap(struct drbd_conf *mdev)
1314 1291
1315int drbd_send_bitmap(struct drbd_conf *mdev) 1292int drbd_send_bitmap(struct drbd_conf *mdev)
1316{ 1293{
1317 int err; 1294 struct drbd_socket *sock = &mdev->tconn->data;
1295 int err = -1;
1318 1296
1319 if (drbd_get_data_sock(mdev->tconn)) 1297 mutex_lock(&sock->mutex);
1320 return -1; 1298 if (sock->socket)
1321 err = !_drbd_send_bitmap(mdev); 1299 err = !_drbd_send_bitmap(mdev);
1322 drbd_put_data_sock(mdev->tconn); 1300 mutex_unlock(&sock->mutex);
1323 return err; 1301 return err;
1324} 1302}
1303
1325void drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr, u32 set_size) 1304void drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr, u32 set_size)
1326{ 1305{
1327 struct p_barrier_ack p; 1306 struct drbd_socket *sock;
1307 struct p_barrier_ack *p;
1328 1308
1329 p.barrier = barrier_nr; 1309 if (mdev->state.conn < C_CONNECTED)
1330 p.set_size = cpu_to_be32(set_size); 1310 return;
1331 1311
1332 if (mdev->state.conn >= C_CONNECTED) 1312 sock = &mdev->tconn->meta;
1333 drbd_send_cmd(mdev, &mdev->tconn->meta, P_BARRIER_ACK, &p.head, sizeof(p)); 1313 p = drbd_prepare_command(mdev, sock);
1314 if (!p)
1315 return;
1316 p->barrier = barrier_nr;
1317 p->set_size = cpu_to_be32(set_size);
1318 drbd_send_command(mdev, sock, P_BARRIER_ACK, sizeof(*p), NULL, 0);
1334} 1319}
1335 1320
1336/** 1321/**
@@ -1344,16 +1329,21 @@ void drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr, u32 set_size)
1344static int _drbd_send_ack(struct drbd_conf *mdev, enum drbd_packet cmd, 1329static int _drbd_send_ack(struct drbd_conf *mdev, enum drbd_packet cmd,
1345 u64 sector, u32 blksize, u64 block_id) 1330 u64 sector, u32 blksize, u64 block_id)
1346{ 1331{
1347 struct p_block_ack p; 1332 struct drbd_socket *sock;
1333 struct p_block_ack *p;
1348 1334
1349 p.sector = sector; 1335 if (mdev->state.conn < C_CONNECTED)
1350 p.block_id = block_id; 1336 return -EIO;
1351 p.blksize = blksize;
1352 p.seq_num = cpu_to_be32(atomic_inc_return(&mdev->packet_seq));
1353 1337
1354 if (!mdev->tconn->meta.socket || mdev->state.conn < C_CONNECTED) 1338 sock = &mdev->tconn->meta;
1339 p = drbd_prepare_command(mdev, sock);
1340 if (!p)
1355 return -EIO; 1341 return -EIO;
1356 return drbd_send_cmd(mdev, &mdev->tconn->meta, cmd, &p.head, sizeof(p)); 1342 p->sector = sector;
1343 p->block_id = block_id;
1344 p->blksize = blksize;
1345 p->seq_num = cpu_to_be32(atomic_inc_return(&mdev->packet_seq));
1346 return drbd_send_command(mdev, sock, cmd, sizeof(*p), NULL, 0);
1357} 1347}
1358 1348
1359/* dp->sector and dp->block_id already/still in network byte order, 1349/* dp->sector and dp->block_id already/still in network byte order,
@@ -1403,43 +1393,51 @@ int drbd_send_ack_ex(struct drbd_conf *mdev, enum drbd_packet cmd,
1403int drbd_send_drequest(struct drbd_conf *mdev, int cmd, 1393int drbd_send_drequest(struct drbd_conf *mdev, int cmd,
1404 sector_t sector, int size, u64 block_id) 1394 sector_t sector, int size, u64 block_id)
1405{ 1395{
1406 struct p_block_req p; 1396 struct drbd_socket *sock;
1407 1397 struct p_block_req *p;
1408 p.sector = cpu_to_be64(sector);
1409 p.block_id = block_id;
1410 p.blksize = cpu_to_be32(size);
1411 1398
1412 return drbd_send_cmd(mdev, &mdev->tconn->data, cmd, &p.head, sizeof(p)); 1399 sock = &mdev->tconn->data;
1400 p = drbd_prepare_command(mdev, sock);
1401 if (!p)
1402 return -EIO;
1403 p->sector = cpu_to_be64(sector);
1404 p->block_id = block_id;
1405 p->blksize = cpu_to_be32(size);
1406 return drbd_send_command(mdev, sock, cmd, sizeof(*p), NULL, 0);
1413} 1407}
1414 1408
1415int drbd_send_drequest_csum(struct drbd_conf *mdev, sector_t sector, int size, 1409int drbd_send_drequest_csum(struct drbd_conf *mdev, sector_t sector, int size,
1416 void *digest, int digest_size, enum drbd_packet cmd) 1410 void *digest, int digest_size, enum drbd_packet cmd)
1417{ 1411{
1418 int err; 1412 struct drbd_socket *sock;
1419 struct p_block_req p; 1413 struct p_block_req *p;
1420 1414
1421 prepare_header(mdev, &p.head, cmd, sizeof(p) - sizeof(struct p_header) + digest_size); 1415 /* FIXME: Put the digest into the preallocated socket buffer. */
1422 p.sector = cpu_to_be64(sector);
1423 p.block_id = ID_SYNCER /* unused */;
1424 p.blksize = cpu_to_be32(size);
1425 1416
1426 mutex_lock(&mdev->tconn->data.mutex); 1417 sock = &mdev->tconn->data;
1427 err = drbd_send_all(mdev->tconn, mdev->tconn->data.socket, &p, sizeof(p), 0); 1418 p = drbd_prepare_command(mdev, sock);
1428 if (!err) 1419 if (!p)
1429 err = drbd_send_all(mdev->tconn, mdev->tconn->data.socket, digest, digest_size, 0); 1420 return -EIO;
1430 mutex_unlock(&mdev->tconn->data.mutex); 1421 p->sector = cpu_to_be64(sector);
1431 return err; 1422 p->block_id = ID_SYNCER /* unused */;
1423 p->blksize = cpu_to_be32(size);
1424 return drbd_send_command(mdev, sock, cmd, sizeof(*p),
1425 digest, digest_size);
1432} 1426}
1433 1427
1434int drbd_send_ov_request(struct drbd_conf *mdev, sector_t sector, int size) 1428int drbd_send_ov_request(struct drbd_conf *mdev, sector_t sector, int size)
1435{ 1429{
1436 struct p_block_req p; 1430 struct drbd_socket *sock;
1437 1431 struct p_block_req *p;
1438 p.sector = cpu_to_be64(sector);
1439 p.block_id = ID_SYNCER /* unused */;
1440 p.blksize = cpu_to_be32(size);
1441 1432
1442 return drbd_send_cmd(mdev, &mdev->tconn->data, P_OV_REQUEST, &p.head, sizeof(p)); 1433 sock = &mdev->tconn->data;
1434 p = drbd_prepare_command(mdev, sock);
1435 if (!p)
1436 return -EIO;
1437 p->sector = cpu_to_be64(sector);
1438 p->block_id = ID_SYNCER /* unused */;
1439 p->blksize = cpu_to_be32(size);
1440 return drbd_send_command(mdev, sock, P_OV_REQUEST, sizeof(*p), NULL, 0);
1443} 1441}
1444 1442
1445/* called on sndtimeo 1443/* called on sndtimeo
@@ -1632,39 +1630,30 @@ static u32 bio_flags_to_wire(struct drbd_conf *mdev, unsigned long bi_rw)
1632 */ 1630 */
1633int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req) 1631int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req)
1634{ 1632{
1635 int err; 1633 struct drbd_socket *sock;
1636 struct p_data p; 1634 struct p_data *p;
1637 unsigned int dp_flags = 0; 1635 unsigned int dp_flags = 0;
1638 void *dgb;
1639 int dgs; 1636 int dgs;
1640 1637 int err;
1641 err = drbd_get_data_sock(mdev->tconn);
1642 if (err)
1643 return err;
1644 1638
1645 dgs = (mdev->tconn->agreed_pro_version >= 87 && mdev->tconn->integrity_w_tfm) ? 1639 dgs = (mdev->tconn->agreed_pro_version >= 87 && mdev->tconn->integrity_w_tfm) ?
1646 crypto_hash_digestsize(mdev->tconn->integrity_w_tfm) : 0; 1640 crypto_hash_digestsize(mdev->tconn->integrity_w_tfm) : 0;
1647 1641
1648 prepare_header(mdev, &p.head, P_DATA, sizeof(p) - sizeof(struct p_header) + dgs + req->i.size); 1642 sock = &mdev->tconn->data;
1649 p.sector = cpu_to_be64(req->i.sector); 1643 p = drbd_prepare_command(mdev, sock);
1650 p.block_id = (unsigned long)req; 1644 if (!p)
1651 p.seq_num = cpu_to_be32(req->seq_num = atomic_inc_return(&mdev->packet_seq)); 1645 return -EIO;
1652 1646 p->sector = cpu_to_be64(req->i.sector);
1647 p->block_id = (unsigned long)req;
1648 p->seq_num = cpu_to_be32(req->seq_num = atomic_inc_return(&mdev->packet_seq));
1653 dp_flags = bio_flags_to_wire(mdev, req->master_bio->bi_rw); 1649 dp_flags = bio_flags_to_wire(mdev, req->master_bio->bi_rw);
1654
1655 if (mdev->state.conn >= C_SYNC_SOURCE && 1650 if (mdev->state.conn >= C_SYNC_SOURCE &&
1656 mdev->state.conn <= C_PAUSED_SYNC_T) 1651 mdev->state.conn <= C_PAUSED_SYNC_T)
1657 dp_flags |= DP_MAY_SET_IN_SYNC; 1652 dp_flags |= DP_MAY_SET_IN_SYNC;
1658 1653 p->dp_flags = cpu_to_be32(dp_flags);
1659 p.dp_flags = cpu_to_be32(dp_flags); 1654 if (dgs)
1660 set_bit(UNPLUG_REMOTE, &mdev->flags); 1655 drbd_csum_bio(mdev, mdev->tconn->integrity_w_tfm, req->master_bio, p + 1);
1661 err = drbd_send_all(mdev->tconn, mdev->tconn->data.socket, &p, 1656 err = __send_command(mdev->tconn, mdev->vnr, sock, P_DATA, sizeof(*p) + dgs, NULL, req->i.size);
1662 sizeof(p), dgs ? MSG_MORE : 0);
1663 if (!err && dgs) {
1664 dgb = mdev->tconn->int_dig_out;
1665 drbd_csum_bio(mdev, mdev->tconn->integrity_w_tfm, req->master_bio, dgb);
1666 err = drbd_send_all(mdev->tconn, mdev->tconn->data.socket, dgb, dgs, 0);
1667 }
1668 if (!err) { 1657 if (!err) {
1669 /* For protocol A, we have to memcpy the payload into 1658 /* For protocol A, we have to memcpy the payload into
1670 * socket buffers, as we may complete right away 1659 * socket buffers, as we may complete right away
@@ -1688,7 +1677,7 @@ int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req)
1688 * currently supported in kernel crypto. */ 1677 * currently supported in kernel crypto. */
1689 unsigned char digest[64]; 1678 unsigned char digest[64];
1690 drbd_csum_bio(mdev, mdev->tconn->integrity_w_tfm, req->master_bio, digest); 1679 drbd_csum_bio(mdev, mdev->tconn->integrity_w_tfm, req->master_bio, digest);
1691 if (memcmp(mdev->tconn->int_dig_out, digest, dgs)) { 1680 if (memcmp(p + 1, digest, dgs)) {
1692 dev_warn(DEV, 1681 dev_warn(DEV,
1693 "Digest mismatch, buffer modified by upper layers during write: %llus +%u\n", 1682 "Digest mismatch, buffer modified by upper layers during write: %llus +%u\n",
1694 (unsigned long long)req->i.sector, req->i.size); 1683 (unsigned long long)req->i.sector, req->i.size);
@@ -1697,8 +1686,7 @@ int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req)
1697 ... Be noisy about digest too large ... 1686 ... Be noisy about digest too large ...
1698 } */ 1687 } */
1699 } 1688 }
1700 1689 mutex_unlock(&sock->mutex); /* locked by drbd_prepare_command() */
1701 drbd_put_data_sock(mdev->tconn);
1702 1690
1703 return err; 1691 return err;
1704} 1692}
@@ -1710,51 +1698,43 @@ int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req)
1710int drbd_send_block(struct drbd_conf *mdev, enum drbd_packet cmd, 1698int drbd_send_block(struct drbd_conf *mdev, enum drbd_packet cmd,
1711 struct drbd_peer_request *peer_req) 1699 struct drbd_peer_request *peer_req)
1712{ 1700{
1701 struct drbd_socket *sock;
1702 struct p_data *p;
1713 int err; 1703 int err;
1714 struct p_data p;
1715 void *dgb;
1716 int dgs; 1704 int dgs;
1717 1705
1718 dgs = (mdev->tconn->agreed_pro_version >= 87 && mdev->tconn->integrity_w_tfm) ? 1706 dgs = (mdev->tconn->agreed_pro_version >= 87 && mdev->tconn->integrity_w_tfm) ?
1719 crypto_hash_digestsize(mdev->tconn->integrity_w_tfm) : 0; 1707 crypto_hash_digestsize(mdev->tconn->integrity_w_tfm) : 0;
1720 1708
1721 prepare_header(mdev, &p.head, cmd, sizeof(p) - 1709 sock = &mdev->tconn->data;
1722 sizeof(struct p_header80) + 1710 p = drbd_prepare_command(mdev, sock);
1723 dgs + peer_req->i.size); 1711 if (!p)
1724 p.sector = cpu_to_be64(peer_req->i.sector); 1712 return -EIO;
1725 p.block_id = peer_req->block_id; 1713 p->sector = cpu_to_be64(peer_req->i.sector);
1726 p.seq_num = 0; /* unused */ 1714 p->block_id = peer_req->block_id;
1727 1715 p->seq_num = 0; /* unused */
1728 /* Only called by our kernel thread. 1716 if (dgs)
1729 * This one may be interrupted by DRBD_SIG and/or DRBD_SIGKILL 1717 drbd_csum_ee(mdev, mdev->tconn->integrity_w_tfm, peer_req, p + 1);
1730 * in response to admin command or module unload. 1718 err = __send_command(mdev->tconn, mdev->vnr, sock, cmd, sizeof(*p) + dgs, NULL, peer_req->i.size);
1731 */
1732 err = drbd_get_data_sock(mdev->tconn);
1733 if (err)
1734 return err;
1735 err = drbd_send_all(mdev->tconn, mdev->tconn->data.socket, &p,
1736 sizeof(p), dgs ? MSG_MORE : 0);
1737 if (!err && dgs) {
1738 dgb = mdev->tconn->int_dig_out;
1739 drbd_csum_ee(mdev, mdev->tconn->integrity_w_tfm, peer_req, dgb);
1740 err = drbd_send_all(mdev->tconn, mdev->tconn->data.socket, dgb,
1741 dgs, 0);
1742 }
1743 if (!err) 1719 if (!err)
1744 err = _drbd_send_zc_ee(mdev, peer_req); 1720 err = _drbd_send_zc_ee(mdev, peer_req);
1745 drbd_put_data_sock(mdev->tconn); 1721 mutex_unlock(&sock->mutex); /* locked by drbd_prepare_command() */
1746 1722
1747 return err; 1723 return err;
1748} 1724}
1749 1725
1750int drbd_send_out_of_sync(struct drbd_conf *mdev, struct drbd_request *req) 1726int drbd_send_out_of_sync(struct drbd_conf *mdev, struct drbd_request *req)
1751{ 1727{
1752 struct p_block_desc p; 1728 struct drbd_socket *sock;
1753 1729 struct p_block_desc *p;
1754 p.sector = cpu_to_be64(req->i.sector);
1755 p.blksize = cpu_to_be32(req->i.size);
1756 1730
1757 return drbd_send_cmd(mdev, &mdev->tconn->data, P_OUT_OF_SYNC, &p.head, sizeof(p)); 1731 sock = &mdev->tconn->data;
1732 p = drbd_prepare_command(mdev, sock);
1733 if (!p)
1734 return -EIO;
1735 p->sector = cpu_to_be64(req->i.sector);
1736 p->blksize = cpu_to_be32(req->i.size);
1737 return drbd_send_command(mdev, sock, P_OUT_OF_SYNC, sizeof(*p), NULL, 0);
1758} 1738}
1759 1739
1760/* 1740/*
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index e52a929d9ed3..40fe7199d5f7 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -729,24 +729,32 @@ out:
729 return s_estab; 729 return s_estab;
730} 730}
731 731
732static int drbd_send_fp(struct drbd_tconn *tconn, struct drbd_socket *sock, enum drbd_packet cmd) 732static int decode_header(struct drbd_tconn *, struct p_header *, struct packet_info *);
733{
734 struct p_header *h = tconn->data.sbuf;
735 733
736 return !_conn_send_cmd(tconn, 0, sock, cmd, h, sizeof(*h), 0); 734static int send_first_packet(struct drbd_tconn *tconn, struct drbd_socket *sock,
735 enum drbd_packet cmd)
736{
737 if (!conn_prepare_command(tconn, sock))
738 return -EIO;
739 return conn_send_command(tconn, sock, cmd, sizeof(struct p_header), NULL, 0);
737} 740}
738 741
739static enum drbd_packet drbd_recv_fp(struct drbd_tconn *tconn, struct socket *sock) 742static int receive_first_packet(struct drbd_tconn *tconn, struct socket *sock)
740{ 743{
741 struct p_header80 h; 744 unsigned int header_size = drbd_header_size(tconn);
742 int rr; 745 struct packet_info pi;
743 746 int err;
744 rr = drbd_recv_short(sock, &h, sizeof(h), 0);
745
746 if (rr == sizeof(h) && h.magic == cpu_to_be32(DRBD_MAGIC))
747 return be16_to_cpu(h.command);
748 747
749 return 0xffff; 748 err = drbd_recv_short(sock, tconn->data.rbuf, header_size, 0);
749 if (err != header_size) {
750 if (err >= 0)
751 err = -EIO;
752 return err;
753 }
754 err = decode_header(tconn, tconn->data.rbuf, &pi);
755 if (err)
756 return err;
757 return pi.cmd;
750} 758}
751 759
752/** 760/**
@@ -834,10 +842,10 @@ static int drbd_connect(struct drbd_tconn *tconn)
834 if (s) { 842 if (s) {
835 if (!tconn->data.socket) { 843 if (!tconn->data.socket) {
836 tconn->data.socket = s; 844 tconn->data.socket = s;
837 drbd_send_fp(tconn, &tconn->data, P_INITIAL_DATA); 845 send_first_packet(tconn, &tconn->data, P_INITIAL_DATA);
838 } else if (!tconn->meta.socket) { 846 } else if (!tconn->meta.socket) {
839 tconn->meta.socket = s; 847 tconn->meta.socket = s;
840 drbd_send_fp(tconn, &tconn->meta, P_INITIAL_META); 848 send_first_packet(tconn, &tconn->meta, P_INITIAL_META);
841 } else { 849 } else {
842 conn_err(tconn, "Logic error in drbd_connect()\n"); 850 conn_err(tconn, "Logic error in drbd_connect()\n");
843 goto out_release_sockets; 851 goto out_release_sockets;
@@ -855,7 +863,7 @@ static int drbd_connect(struct drbd_tconn *tconn)
855retry: 863retry:
856 s = drbd_wait_for_connect(tconn); 864 s = drbd_wait_for_connect(tconn);
857 if (s) { 865 if (s) {
858 try = drbd_recv_fp(tconn, s); 866 try = receive_first_packet(tconn, s);
859 drbd_socket_okay(&tconn->data.socket); 867 drbd_socket_okay(&tconn->data.socket);
860 drbd_socket_okay(&tconn->meta.socket); 868 drbd_socket_okay(&tconn->meta.socket);
861 switch (try) { 869 switch (try) {
@@ -1324,6 +1332,10 @@ read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector,
1324 crypto_hash_digestsize(mdev->tconn->integrity_r_tfm) : 0; 1332 crypto_hash_digestsize(mdev->tconn->integrity_r_tfm) : 0;
1325 1333
1326 if (dgs) { 1334 if (dgs) {
1335 /*
1336 * FIXME: Receive the incoming digest into the receive buffer
1337 * here, together with its struct p_data?
1338 */
1327 err = drbd_recv_all_warn(mdev->tconn, dig_in, dgs); 1339 err = drbd_recv_all_warn(mdev->tconn, dig_in, dgs);
1328 if (err) 1340 if (err)
1329 return NULL; 1341 return NULL;
@@ -4019,8 +4031,8 @@ static void drbdd(struct drbd_tconn *tconn)
4019 4031
4020 err = cmd->fn(tconn, &pi); 4032 err = cmd->fn(tconn, &pi);
4021 if (err) { 4033 if (err) {
4022 conn_err(tconn, "error receiving %s, l: %d!\n", 4034 conn_err(tconn, "error receiving %s, e: %d l: %d!\n",
4023 cmdname(pi.cmd), pi.size); 4035 cmdname(pi.cmd), err, pi.size);
4024 goto err_out; 4036 goto err_out;
4025 } 4037 }
4026 } 4038 }
@@ -4179,27 +4191,17 @@ static int drbd_disconnected(int vnr, void *p, void *data)
4179 */ 4191 */
4180static int drbd_send_features(struct drbd_tconn *tconn) 4192static int drbd_send_features(struct drbd_tconn *tconn)
4181{ 4193{
4182 /* ASSERT current == mdev->tconn->receiver ... */ 4194 struct drbd_socket *sock;
4183 struct p_connection_features *p = tconn->data.sbuf; 4195 struct p_connection_features *p;
4184 int err;
4185
4186 if (mutex_lock_interruptible(&tconn->data.mutex)) {
4187 conn_err(tconn, "interrupted during initial handshake\n");
4188 return -EINTR;
4189 }
4190 4196
4191 if (tconn->data.socket == NULL) { 4197 sock = &tconn->data;
4192 mutex_unlock(&tconn->data.mutex); 4198 p = conn_prepare_command(tconn, sock);
4199 if (!p)
4193 return -EIO; 4200 return -EIO;
4194 }
4195
4196 memset(p, 0, sizeof(*p)); 4201 memset(p, 0, sizeof(*p));
4197 p->protocol_min = cpu_to_be32(PRO_VERSION_MIN); 4202 p->protocol_min = cpu_to_be32(PRO_VERSION_MIN);
4198 p->protocol_max = cpu_to_be32(PRO_VERSION_MAX); 4203 p->protocol_max = cpu_to_be32(PRO_VERSION_MAX);
4199 err = _conn_send_cmd(tconn, 0, &tconn->data, P_CONNECTION_FEATURES, 4204 return conn_send_command(tconn, sock, P_CONNECTION_FEATURES, sizeof(*p), NULL, 0);
4200 &p->head, sizeof(*p), 0);
4201 mutex_unlock(&tconn->data.mutex);
4202 return err;
4203} 4205}
4204 4206
4205/* 4207/*
@@ -4283,6 +4285,7 @@ static int drbd_do_auth(struct drbd_tconn *tconn)
4283 4285
4284static int drbd_do_auth(struct drbd_tconn *tconn) 4286static int drbd_do_auth(struct drbd_tconn *tconn)
4285{ 4287{
4288 struct drbd_socket *sock;
4286 char my_challenge[CHALLENGE_LEN]; /* 64 Bytes... */ 4289 char my_challenge[CHALLENGE_LEN]; /* 64 Bytes... */
4287 struct scatterlist sg; 4290 struct scatterlist sg;
4288 char *response = NULL; 4291 char *response = NULL;
@@ -4294,6 +4297,8 @@ static int drbd_do_auth(struct drbd_tconn *tconn)
4294 struct packet_info pi; 4297 struct packet_info pi;
4295 int err, rv; 4298 int err, rv;
4296 4299
4300 /* FIXME: Put the challenge/response into the preallocated socket buffer. */
4301
4297 desc.tfm = tconn->cram_hmac_tfm; 4302 desc.tfm = tconn->cram_hmac_tfm;
4298 desc.flags = 0; 4303 desc.flags = 0;
4299 4304
@@ -4307,7 +4312,14 @@ static int drbd_do_auth(struct drbd_tconn *tconn)
4307 4312
4308 get_random_bytes(my_challenge, CHALLENGE_LEN); 4313 get_random_bytes(my_challenge, CHALLENGE_LEN);
4309 4314
4310 rv = !conn_send_cmd2(tconn, P_AUTH_CHALLENGE, my_challenge, CHALLENGE_LEN); 4315 sock = &tconn->data;
4316 if (!conn_prepare_command(tconn, sock)) {
4317 rv = 0;
4318 goto fail;
4319 }
4320 rv = !conn_send_command(tconn, sock, P_AUTH_CHALLENGE,
4321 sizeof(struct p_header),
4322 my_challenge, CHALLENGE_LEN);
4311 if (!rv) 4323 if (!rv)
4312 goto fail; 4324 goto fail;
4313 4325
@@ -4361,7 +4373,13 @@ static int drbd_do_auth(struct drbd_tconn *tconn)
4361 goto fail; 4373 goto fail;
4362 } 4374 }
4363 4375
4364 rv = !conn_send_cmd2(tconn, P_AUTH_RESPONSE, response, resp_size); 4376 if (!conn_prepare_command(tconn, sock)) {
4377 rv = 0;
4378 goto fail;
4379 }
4380 rv = !conn_send_command(tconn, sock, P_AUTH_RESPONSE,
4381 sizeof(struct p_header),
4382 response, resp_size);
4365 if (!rv) 4383 if (!rv)
4366 goto fail; 4384 goto fail;
4367 4385
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c
index 7350466ff30c..78b95e902aae 100644
--- a/drivers/block/drbd/drbd_worker.c
+++ b/drivers/block/drbd/drbd_worker.c
@@ -1191,10 +1191,10 @@ int w_prev_work_done(struct drbd_work *w, int cancel)
1191 1191
1192int w_send_barrier(struct drbd_work *w, int cancel) 1192int w_send_barrier(struct drbd_work *w, int cancel)
1193{ 1193{
1194 struct drbd_socket *sock;
1194 struct drbd_tl_epoch *b = container_of(w, struct drbd_tl_epoch, w); 1195 struct drbd_tl_epoch *b = container_of(w, struct drbd_tl_epoch, w);
1195 struct drbd_conf *mdev = w->mdev; 1196 struct drbd_conf *mdev = w->mdev;
1196 struct p_barrier *p = mdev->tconn->data.sbuf; 1197 struct p_barrier *p;
1197 int err = 0;
1198 1198
1199 /* really avoid racing with tl_clear. w.cb may have been referenced 1199 /* really avoid racing with tl_clear. w.cb may have been referenced
1200 * just before it was reassigned and re-queued, so double check that. 1200 * just before it was reassigned and re-queued, so double check that.
@@ -1208,26 +1208,28 @@ int w_send_barrier(struct drbd_work *w, int cancel)
1208 if (cancel) 1208 if (cancel)
1209 return 0; 1209 return 0;
1210 1210
1211 err = drbd_get_data_sock(mdev->tconn); 1211 sock = &mdev->tconn->data;
1212 if (err) 1212 p = drbd_prepare_command(mdev, sock);
1213 return err; 1213 if (!p)
1214 return -EIO;
1214 p->barrier = b->br_number; 1215 p->barrier = b->br_number;
1215 /* inc_ap_pending was done where this was queued. 1216 /* inc_ap_pending was done where this was queued.
1216 * dec_ap_pending will be done in got_BarrierAck 1217 * dec_ap_pending will be done in got_BarrierAck
1217 * or (on connection loss) in w_clear_epoch. */ 1218 * or (on connection loss) in w_clear_epoch. */
1218 err = _drbd_send_cmd(mdev, &mdev->tconn->data, P_BARRIER, 1219 return drbd_send_command(mdev, sock, P_BARRIER, sizeof(*p), NULL, 0);
1219 &p->head, sizeof(*p), 0);
1220 drbd_put_data_sock(mdev->tconn);
1221
1222 return err;
1223} 1220}
1224 1221
1225int w_send_write_hint(struct drbd_work *w, int cancel) 1222int w_send_write_hint(struct drbd_work *w, int cancel)
1226{ 1223{
1227 struct drbd_conf *mdev = w->mdev; 1224 struct drbd_conf *mdev = w->mdev;
1225 struct drbd_socket *sock;
1226
1228 if (cancel) 1227 if (cancel)
1229 return 0; 1228 return 0;
1230 return drbd_send_short_cmd(mdev, P_UNPLUG_REMOTE); 1229 sock = &mdev->tconn->data;
1230 if (!drbd_prepare_command(mdev, sock))
1231 return -EIO;
1232 return drbd_send_command(mdev, sock, P_UNPLUG_REMOTE, sizeof(struct p_header), NULL, 0);
1231} 1233}
1232 1234
1233int w_send_out_of_sync(struct drbd_work *w, int cancel) 1235int w_send_out_of_sync(struct drbd_work *w, int cancel)