diff options
author | Andreas Gruenbacher <agruen@linbit.com> | 2011-03-28 08:23:08 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 10:45:08 -0500 |
commit | 9f5bdc339e3becd85aa8add305d794b0b1ec8996 (patch) | |
tree | a52dcd2faa3fa88d9d5caf65003c1b2ae56f52d9 /drivers/block/drbd | |
parent | 52b061a44021ca11ee2fd238040e91341ff8066d (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.h | 60 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 518 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 90 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_worker.c | 24 |
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 | ||
1063 | static 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 | |||
1074 | static 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); |
1119 | extern int _drbd_send_state(struct drbd_conf *mdev); | 1103 | extern int _drbd_send_state(struct drbd_conf *mdev); |
1120 | extern int drbd_send_state(struct drbd_conf *mdev); | 1104 | extern int drbd_send_state(struct drbd_conf *mdev); |
1121 | extern 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); | ||
1124 | extern 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); | ||
1126 | extern int conn_send_cmd2(struct drbd_tconn *tconn, enum drbd_packet cmd, | ||
1127 | char *data, size_t size); | ||
1128 | extern int drbd_send_sync_param(struct drbd_conf *mdev); | 1105 | extern int drbd_send_sync_param(struct drbd_conf *mdev); |
1129 | extern void drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr, | 1106 | extern 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 | ||
1150 | extern int drbd_send_bitmap(struct drbd_conf *mdev); | 1127 | extern int drbd_send_bitmap(struct drbd_conf *mdev); |
1151 | extern void drbd_send_sr_reply(struct drbd_conf *mdev, enum drbd_state_rv retcode); | 1128 | extern void drbd_send_sr_reply(struct drbd_conf *mdev, enum drbd_state_rv retcode); |
1152 | extern int conn_send_sr_reply(struct drbd_tconn *tconn, enum drbd_state_rv retcode); | 1129 | extern void conn_send_sr_reply(struct drbd_tconn *tconn, enum drbd_state_rv retcode); |
1153 | extern void drbd_free_bc(struct drbd_backing_dev *ldev); | 1130 | extern void drbd_free_bc(struct drbd_backing_dev *ldev); |
1154 | extern void drbd_mdev_cleanup(struct drbd_conf *mdev); | 1131 | extern void drbd_mdev_cleanup(struct drbd_conf *mdev); |
1155 | void drbd_print_uuids(struct drbd_conf *mdev, const char *text); | 1132 | void 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 | ||
1888 | static 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 | |||
1895 | static 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 | |||
1901 | static 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 | |||
1908 | extern void *conn_prepare_command(struct drbd_tconn *, struct drbd_socket *); | 1865 | extern void *conn_prepare_command(struct drbd_tconn *, struct drbd_socket *); |
1909 | extern void *drbd_prepare_command(struct drbd_conf *, struct drbd_socket *); | 1866 | extern void *drbd_prepare_command(struct drbd_conf *, struct drbd_socket *); |
1910 | extern int conn_send_command(struct drbd_tconn *, struct drbd_socket *, | 1867 | extern 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 | ||
1917 | extern int drbd_send_ping(struct drbd_tconn *tconn); | 1874 | extern int drbd_send_ping(struct drbd_tconn *tconn); |
1918 | extern int drbd_send_ping_ack(struct drbd_tconn *tconn); | 1875 | extern int drbd_send_ping_ack(struct drbd_tconn *tconn); |
1919 | 1876 | extern int drbd_send_state_req(struct drbd_conf *, union drbd_state, union drbd_state); | |
1920 | static inline int drbd_send_state_req(struct drbd_conf *mdev, | 1877 | extern 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 | |||
1926 | static 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 | ||
1933 | static inline void drbd_thread_stop(struct drbd_thread *thi) | 1879 | static 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 | ||
720 | static void _prepare_header(struct drbd_tconn *tconn, int vnr, struct p_header *h, | 720 | static 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 | ||
729 | static 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 */ | ||
736 | int _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 | */ | ||
753 | int 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 | |||
765 | int 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 | |||
782 | void *conn_prepare_command(struct drbd_tconn *tconn, struct drbd_socket *sock) | 729 | void *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 | ||
846 | int drbd_send_ping(struct drbd_tconn *tconn) | 793 | int 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 | ||
852 | int drbd_send_ping_ack(struct drbd_tconn *tconn) | 803 | int 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 | ||
858 | int drbd_send_sync_param(struct drbd_conf *mdev) | 813 | int 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 | ||
912 | int drbd_send_protocol(struct drbd_tconn *tconn) | 860 | int 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 | ||
956 | int _drbd_send_uuids(struct drbd_conf *mdev, u64 uuid_flags) | 897 | int _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 | ||
979 | int drbd_send_uuids(struct drbd_conf *mdev) | 926 | int drbd_send_uuids(struct drbd_conf *mdev) |
@@ -1006,7 +953,8 @@ void drbd_print_uuids(struct drbd_conf *mdev, const char *text) | |||
1006 | 953 | ||
1007 | void drbd_gen_and_send_sync_uuid(struct drbd_conf *mdev) | 954 | void 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 | ||
1023 | int drbd_send_sizes(struct drbd_conf *mdev, int trigger_reply, enum dds_flags flags) | 975 | int 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 | |||
1058 | int drbd_send_state(struct drbd_conf *mdev) | 1014 | int 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)) | 1027 | int 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 | ||
1077 | int _conn_send_state_req(struct drbd_tconn *tconn, int vnr, enum drbd_packet cmd, | 1042 | int 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 | ||
1088 | void drbd_send_sr_reply(struct drbd_conf *mdev, enum drbd_state_rv retcode) | 1058 | void 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 | ||
1097 | int conn_send_sr_reply(struct drbd_tconn *tconn, enum drbd_state_rv retcode) | 1071 | void 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 | ||
1107 | static void dcbp_set_code(struct p_compressed_bm *p, enum drbd_bitmap_code code) | 1085 | static 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, | |||
1224 | static int | 1202 | static int |
1225 | send_bitmap_rle_or_plain(struct drbd_conf *mdev, struct bm_xfer_ctx *c) | 1203 | send_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 | ||
1315 | int drbd_send_bitmap(struct drbd_conf *mdev) | 1292 | int 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 | |||
1325 | void drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr, u32 set_size) | 1304 | void 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) | |||
1344 | static int _drbd_send_ack(struct drbd_conf *mdev, enum drbd_packet cmd, | 1329 | static 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, | |||
1403 | int drbd_send_drequest(struct drbd_conf *mdev, int cmd, | 1393 | int 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 | ||
1415 | int drbd_send_drequest_csum(struct drbd_conf *mdev, sector_t sector, int size, | 1409 | int 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 | ||
1434 | int drbd_send_ov_request(struct drbd_conf *mdev, sector_t sector, int size) | 1428 | int 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 | */ |
1633 | int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req) | 1631 | int 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) | |||
1710 | int drbd_send_block(struct drbd_conf *mdev, enum drbd_packet cmd, | 1698 | int 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 | ||
1750 | int drbd_send_out_of_sync(struct drbd_conf *mdev, struct drbd_request *req) | 1726 | int 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 | ||
732 | static int drbd_send_fp(struct drbd_tconn *tconn, struct drbd_socket *sock, enum drbd_packet cmd) | 732 | static 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); | 734 | static 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 | ||
739 | static enum drbd_packet drbd_recv_fp(struct drbd_tconn *tconn, struct socket *sock) | 742 | static 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) | |||
855 | retry: | 863 | retry: |
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 | */ |
4180 | static int drbd_send_features(struct drbd_tconn *tconn) | 4192 | static 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 | ||
4284 | static int drbd_do_auth(struct drbd_tconn *tconn) | 4286 | static 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 | ||
1192 | int w_send_barrier(struct drbd_work *w, int cancel) | 1192 | int 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 | ||
1225 | int w_send_write_hint(struct drbd_work *w, int cancel) | 1222 | int 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 | ||
1233 | int w_send_out_of_sync(struct drbd_work *w, int cancel) | 1235 | int w_send_out_of_sync(struct drbd_work *w, int cancel) |