Lines Matching refs:connection

66 static int drbd_do_features(struct drbd_connection *connection);
67 static int drbd_do_auth(struct drbd_connection *connection);
69 static void conn_wait_active_ee_empty(struct drbd_connection *connection);
261 nc = rcu_dereference(peer_device->connection->net_conf); in drbd_alloc_pages()
493 static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size) in drbd_recv() argument
497 rv = drbd_recv_short(connection->data.socket, buf, size, 0); in drbd_recv()
501 drbd_info(connection, "sock was reset by peer\n"); in drbd_recv()
503 drbd_err(connection, "sock_recvmsg returned %d\n", rv); in drbd_recv()
505 if (test_bit(DISCONNECT_SENT, &connection->flags)) { in drbd_recv()
508 t = rcu_dereference(connection->net_conf)->ping_timeo * HZ/10; in drbd_recv()
511 t = wait_event_timeout(connection->ping_wait, connection->cstate < C_WF_REPORT_PARAMS, t); in drbd_recv()
516 drbd_info(connection, "sock was shut down by peer\n"); in drbd_recv()
520 conn_request_state(connection, NS(conn, C_BROKEN_PIPE), CS_HARD); in drbd_recv()
526 static int drbd_recv_all(struct drbd_connection *connection, void *buf, size_t size) in drbd_recv_all() argument
530 err = drbd_recv(connection, buf, size); in drbd_recv_all()
539 static int drbd_recv_all_warn(struct drbd_connection *connection, void *buf, size_t size) in drbd_recv_all_warn() argument
543 err = drbd_recv_all(connection, buf, size); in drbd_recv_all_warn()
545 drbd_warn(connection, "short read (expected size %d)\n", (int)size); in drbd_recv_all_warn()
568 static struct socket *drbd_try_connect(struct drbd_connection *connection) in drbd_try_connect() argument
580 nc = rcu_dereference(connection->net_conf); in drbd_try_connect()
590 my_addr_len = min_t(int, connection->my_addr_len, sizeof(src_in6)); in drbd_try_connect()
591 memcpy(&src_in6, &connection->my_addr, my_addr_len); in drbd_try_connect()
593 if (((struct sockaddr *)&connection->my_addr)->sa_family == AF_INET6) in drbd_try_connect()
598 peer_addr_len = min_t(int, connection->peer_addr_len, sizeof(src_in6)); in drbd_try_connect()
599 memcpy(&peer_in6, &connection->peer_addr, peer_addr_len); in drbd_try_connect()
647 drbd_err(connection, "%s failed, err = %d\n", what, err); in drbd_try_connect()
650 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD); in drbd_try_connect()
657 struct drbd_connection *connection; member
675 static int prepare_listen_socket(struct drbd_connection *connection, struct accept_wait_data *ad) in prepare_listen_socket() argument
684 nc = rcu_dereference(connection->net_conf); in prepare_listen_socket()
693 my_addr_len = min_t(int, connection->my_addr_len, sizeof(struct sockaddr_in6)); in prepare_listen_socket()
694 memcpy(&my_addr, &connection->my_addr, my_addr_len); in prepare_listen_socket()
730 drbd_err(connection, "%s failed, err = %d\n", what, err); in prepare_listen_socket()
731 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD); in prepare_listen_socket()
746 static struct socket *drbd_wait_for_connect(struct drbd_connection *connection, struct accept_wait_… in drbd_wait_for_connect() argument
753 nc = rcu_dereference(connection->net_conf); in drbd_wait_for_connect()
772 drbd_err(connection, "accept failed, err = %d\n", err); in drbd_wait_for_connect()
773 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD); in drbd_wait_for_connect()
785 static int send_first_packet(struct drbd_connection *connection, struct drbd_socket *sock, in send_first_packet() argument
788 if (!conn_prepare_command(connection, sock)) in send_first_packet()
790 return conn_send_command(connection, sock, cmd, 0, NULL, 0); in send_first_packet()
793 static int receive_first_packet(struct drbd_connection *connection, struct socket *sock) in receive_first_packet() argument
795 unsigned int header_size = drbd_header_size(connection); in receive_first_packet()
801 nc = rcu_dereference(connection->net_conf); in receive_first_packet()
809 err = drbd_recv_short(sock, connection->data.rbuf, header_size, 0); in receive_first_packet()
815 err = decode_header(connection, connection->data.rbuf, &pi); in receive_first_packet()
844 static bool connection_established(struct drbd_connection *connection, in connection_established() argument
856 nc = rcu_dereference(connection->net_conf); in connection_established()
877 device->state_mutex = peer_device->connection->agreed_pro_version < 100 ? in drbd_connected()
878 &peer_device->connection->cstate_mutex : in drbd_connected()
903 static int conn_connect(struct drbd_connection *connection) in conn_connect() argument
912 .connection = connection, in conn_connect()
916 clear_bit(DISCONNECT_SENT, &connection->flags); in conn_connect()
917 if (conn_request_state(connection, NS(conn, C_WF_CONNECTION), CS_VERBOSE) < SS_SUCCESS) in conn_connect()
921 sock.sbuf = connection->data.sbuf; in conn_connect()
922 sock.rbuf = connection->data.rbuf; in conn_connect()
925 msock.sbuf = connection->meta.sbuf; in conn_connect()
926 msock.rbuf = connection->meta.rbuf; in conn_connect()
930 connection->agreed_pro_version = 80; in conn_connect()
932 if (prepare_listen_socket(connection, &ad)) in conn_connect()
938 s = drbd_try_connect(connection); in conn_connect()
942 send_first_packet(connection, &sock, P_INITIAL_DATA); in conn_connect()
944 clear_bit(RESOLVE_CONFLICTS, &connection->flags); in conn_connect()
946 send_first_packet(connection, &msock, P_INITIAL_META); in conn_connect()
948 drbd_err(connection, "Logic error in conn_connect()\n"); in conn_connect()
953 if (connection_established(connection, &sock.socket, &msock.socket)) in conn_connect()
957 s = drbd_wait_for_connect(connection, &ad); in conn_connect()
959 int fp = receive_first_packet(connection, s); in conn_connect()
965 drbd_warn(connection, "initial packet S crossed\n"); in conn_connect()
973 set_bit(RESOLVE_CONFLICTS, &connection->flags); in conn_connect()
975 drbd_warn(connection, "initial packet M crossed\n"); in conn_connect()
983 drbd_warn(connection, "Error receiving initial packet\n"); in conn_connect()
991 if (connection->cstate <= C_DISCONNECTING) in conn_connect()
996 if (get_t_state(&connection->receiver) == EXITING) in conn_connect()
1000 ok = connection_established(connection, &sock.socket, &msock.socket); in conn_connect()
1021 nc = rcu_dereference(connection->net_conf); in conn_connect()
1038 connection->data.socket = sock.socket; in conn_connect()
1039 connection->meta.socket = msock.socket; in conn_connect()
1040 connection->last_received = jiffies; in conn_connect()
1042 h = drbd_do_features(connection); in conn_connect()
1046 if (connection->cram_hmac_tfm) { in conn_connect()
1048 switch (drbd_do_auth(connection)) { in conn_connect()
1050 drbd_err(connection, "Authentication of peer failed\n"); in conn_connect()
1053 drbd_err(connection, "Authentication of peer failed, trying again.\n"); in conn_connect()
1058 connection->data.socket->sk->sk_sndtimeo = timeout; in conn_connect()
1059 connection->data.socket->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; in conn_connect()
1061 if (drbd_send_protocol(connection) == -EOPNOTSUPP) in conn_connect()
1071 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) in conn_connect()
1074 set_bit(STATE_SENT, &connection->flags); in conn_connect()
1076 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) in conn_connect()
1080 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in conn_connect()
1096 rv = conn_request_state(connection, NS(conn, C_WF_REPORT_PARAMS), CS_VERBOSE); in conn_connect()
1097 if (rv < SS_SUCCESS || connection->cstate != C_WF_REPORT_PARAMS) { in conn_connect()
1098 clear_bit(STATE_SENT, &connection->flags); in conn_connect()
1102 drbd_thread_start(&connection->asender); in conn_connect()
1104 mutex_lock(&connection->resource->conf_update); in conn_connect()
1109 connection->net_conf->discard_my_data = 0; in conn_connect()
1110 mutex_unlock(&connection->resource->conf_update); in conn_connect()
1124 static int decode_header(struct drbd_connection *connection, void *header, struct packet_info *pi) in decode_header() argument
1126 unsigned int header_size = drbd_header_size(connection); in decode_header()
1132 drbd_err(connection, "Header padding is not zero\n"); in decode_header()
1151 drbd_err(connection, "Wrong magic value 0x%08x in protocol version %d\n", in decode_header()
1153 connection->agreed_pro_version); in decode_header()
1160 static int drbd_recv_header(struct drbd_connection *connection, struct packet_info *pi) in drbd_recv_header() argument
1162 void *buffer = connection->data.rbuf; in drbd_recv_header()
1165 err = drbd_recv_all_warn(connection, buffer, drbd_header_size(connection)); in drbd_recv_header()
1169 err = decode_header(connection, buffer, pi); in drbd_recv_header()
1170 connection->last_received = jiffies; in drbd_recv_header()
1175 static void drbd_flush(struct drbd_connection *connection) in drbd_flush() argument
1181 if (connection->resource->write_ordering >= WO_bdev_flush) { in drbd_flush()
1183 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in drbd_flush()
1206 drbd_bump_write_ordering(connection->resource, NULL, WO_drain_io); in drbd_flush()
1225 static enum finish_epoch drbd_may_finish_epoch(struct drbd_connection *connection, in drbd_may_finish_epoch() argument
1233 spin_lock(&connection->epoch_lock); in drbd_may_finish_epoch()
1255 spin_unlock(&connection->epoch_lock); in drbd_may_finish_epoch()
1256 drbd_send_b_ack(epoch->connection, epoch->barrier_nr, epoch_size); in drbd_may_finish_epoch()
1257 spin_lock(&connection->epoch_lock); in drbd_may_finish_epoch()
1263 dec_unacked(epoch->connection); in drbd_may_finish_epoch()
1266 if (connection->current_epoch != epoch) { in drbd_may_finish_epoch()
1270 connection->epochs--; in drbd_may_finish_epoch()
1290 spin_unlock(&connection->epoch_lock); in drbd_may_finish_epoch()
1383 conn_wait_active_ee_empty(first_peer_device(device)->connection); in drbd_submit_peer_request()
1493 static void conn_wait_active_ee_empty(struct drbd_connection *connection) in conn_wait_active_ee_empty() argument
1499 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in conn_wait_active_ee_empty()
1512 conn_peer_device(struct drbd_connection *connection, int volume_number) in conn_peer_device() argument
1514 return idr_find(&connection->peer_devices, volume_number); in conn_peer_device()
1517 static int receive_Barrier(struct drbd_connection *connection, struct packet_info *pi) in receive_Barrier() argument
1526 connection->current_epoch->barrier_nr = p->barrier; in receive_Barrier()
1527 connection->current_epoch->connection = connection; in receive_Barrier()
1528 rv = drbd_may_finish_epoch(connection, connection->current_epoch, EV_GOT_BARRIER_NR); in receive_Barrier()
1535 switch (connection->resource->write_ordering) { in receive_Barrier()
1546 drbd_warn(connection, "Allocation of an epoch failed, slowing down\n"); in receive_Barrier()
1551 conn_wait_active_ee_empty(connection); in receive_Barrier()
1552 drbd_flush(connection); in receive_Barrier()
1554 if (atomic_read(&connection->current_epoch->epoch_size)) { in receive_Barrier()
1562 drbd_err(connection, "Strangeness in connection->write_ordering %d\n", in receive_Barrier()
1563 connection->resource->write_ordering); in receive_Barrier()
1571 spin_lock(&connection->epoch_lock); in receive_Barrier()
1572 if (atomic_read(&connection->current_epoch->epoch_size)) { in receive_Barrier()
1573 list_add(&epoch->list, &connection->current_epoch->list); in receive_Barrier()
1574 connection->current_epoch = epoch; in receive_Barrier()
1575 connection->epochs++; in receive_Barrier()
1580 spin_unlock(&connection->epoch_lock); in receive_Barrier()
1597 void *dig_in = peer_device->connection->int_dig_in; in read_in_block()
1598 void *dig_vv = peer_device->connection->int_dig_vv; in read_in_block()
1603 if (!trim && peer_device->connection->peer_integrity_tfm) { in read_in_block()
1604 digest_size = crypto_hash_digestsize(peer_device->connection->peer_integrity_tfm); in read_in_block()
1609 err = drbd_recv_all_warn(peer_device->connection, dig_in, digest_size); in read_in_block()
1652 err = drbd_recv_all_warn(peer_device->connection, data, len); in read_in_block()
1666 drbd_csum_ee(peer_device->connection->peer_integrity_tfm, peer_req, dig_vv); in read_in_block()
1696 err = drbd_recv_all_warn(peer_device->connection, data, len); in drbd_drain_block()
1713 void *dig_in = peer_device->connection->int_dig_in; in recv_dless_read()
1714 void *dig_vv = peer_device->connection->int_dig_vv; in recv_dless_read()
1717 if (peer_device->connection->peer_integrity_tfm) { in recv_dless_read()
1718 digest_size = crypto_hash_digestsize(peer_device->connection->peer_integrity_tfm); in recv_dless_read()
1719 err = drbd_recv_all_warn(peer_device->connection, dig_in, digest_size); in recv_dless_read()
1735 err = drbd_recv_all_warn(peer_device->connection, mapped, expect); in recv_dless_read()
1743 drbd_csum_bio(peer_device->connection->peer_integrity_tfm, bio, dig_vv); in recv_dless_read()
1839 static int receive_DataReply(struct drbd_connection *connection, struct packet_info *pi) in receive_DataReply() argument
1848 peer_device = conn_peer_device(connection, pi->vnr); in receive_DataReply()
1874 static int receive_RSDataReply(struct drbd_connection *connection, struct packet_info *pi) in receive_RSDataReply() argument
1882 peer_device = conn_peer_device(connection, pi->vnr); in receive_RSDataReply()
1969 …drbd_may_finish_epoch(first_peer_device(device)->connection, peer_req->epoch, EV_PUT + (cancel ? E… in e_end_block()
1996 struct drbd_connection *connection = peer_req->peer_device->connection; in e_send_retry_write() local
1998 return e_send_ack(w, connection->agreed_pro_version >= 100 ? in e_send_retry_write()
2022 if (test_bit(RESOLVE_CONFLICTS, &peer_device->connection->flags)) { in update_peer_seq()
2085 if (!test_bit(RESOLVE_CONFLICTS, &peer_device->connection->flags)) in wait_for_and_update_peer_seq()
2101 tp = rcu_dereference(first_peer_device(device)->connection->net_conf)->two_primaries; in wait_for_and_update_peer_seq()
2111 timeout = rcu_dereference(peer_device->connection->net_conf)->ping_timeo*HZ/10; in wait_for_and_update_peer_seq()
2165 struct drbd_connection *connection = peer_req->peer_device->connection; in handle_write_conflicts() local
2166 bool resolve_conflicts = test_bit(RESOLVE_CONFLICTS, &connection->flags); in handle_write_conflicts()
2220 wake_asender(connection); in handle_write_conflicts()
2249 _conn_request_state(connection, NS(conn, C_TIMEOUT), CS_HARD); in handle_write_conflicts()
2271 static int receive_Data(struct drbd_connection *connection, struct packet_info *pi) in receive_Data() argument
2284 peer_device = conn_peer_device(connection, pi->vnr); in receive_Data()
2294 atomic_inc(&connection->current_epoch->epoch_size); in receive_Data()
2336 spin_lock(&connection->epoch_lock); in receive_Data()
2337 peer_req->epoch = connection->current_epoch; in receive_Data()
2340 spin_unlock(&connection->epoch_lock); in receive_Data()
2343 nc = rcu_dereference(peer_device->connection->net_conf); in receive_Data()
2345 if (peer_device->connection->agreed_pro_version < 100) { in receive_Data()
2426 drbd_may_finish_epoch(connection, peer_req->epoch, EV_PUT + EV_CLEANUP); in receive_Data()
2513 static int receive_DataRequest(struct drbd_connection *connection, struct packet_info *pi) in receive_DataRequest() argument
2525 peer_device = conn_peer_device(connection, pi->vnr); in receive_DataRequest()
2610 if (drbd_recv_all(peer_device->connection, di->digest, pi->size)) in receive_DataRequest()
2614 D_ASSERT(device, peer_device->connection->agreed_pro_version >= 89); in receive_DataRequest()
2633 peer_device->connection->agreed_pro_version >= 90) { in receive_DataRequest()
2686 update_receiver_timing_details(connection, drbd_rs_should_slow_down); in receive_DataRequest()
2690 update_receiver_timing_details(connection, drbd_rs_begin_io); in receive_DataRequest()
2698 update_receiver_timing_details(connection, drbd_submit_peer_request); in receive_DataRequest()
2734 after_sb_0p = rcu_dereference(peer_device->connection->net_conf)->after_sb_0p; in drbd_asb_recover_0p()
2769 rv = test_bit(RESOLVE_CONFLICTS, &peer_device->connection->flags) in drbd_asb_recover_0p()
2785 rv = test_bit(RESOLVE_CONFLICTS, &peer_device->connection->flags) in drbd_asb_recover_0p()
2808 after_sb_1p = rcu_dereference(peer_device->connection->net_conf)->after_sb_1p; in drbd_asb_recover_1p()
2865 after_sb_2p = rcu_dereference(peer_device->connection->net_conf)->after_sb_2p; in drbd_asb_recover_2p()
2937 struct drbd_connection *const connection = peer_device ? peer_device->connection : NULL; in drbd_uuid_compare() local
2963 if (connection->agreed_pro_version < 91) in drbd_uuid_compare()
2986 if (connection->agreed_pro_version < 91) in drbd_uuid_compare()
3019 dc = test_bit(RESOLVE_CONFLICTS, &connection->flags); in drbd_uuid_compare()
3032 if (connection->agreed_pro_version < 96 ? in drbd_uuid_compare()
3039 if (connection->agreed_pro_version < 91) in drbd_uuid_compare()
3069 if (connection->agreed_pro_version < 96 ? in drbd_uuid_compare()
3076 if (connection->agreed_pro_version < 91) in drbd_uuid_compare()
3170 nc = rcu_dereference(peer_device->connection->net_conf); in drbd_sync_handshake()
3245 if (tentative || test_bit(CONN_DRY_RUN, &peer_device->connection->flags)) { in drbd_sync_handshake()
3291 static int receive_protocol(struct drbd_connection *connection, struct packet_info *pi) in receive_protocol() argument
3309 if (connection->agreed_pro_version >= 87) { in receive_protocol()
3314 err = drbd_recv_all(connection, integrity_alg, pi->size); in receive_protocol()
3321 clear_bit(CONN_DRY_RUN, &connection->flags); in receive_protocol()
3324 set_bit(CONN_DRY_RUN, &connection->flags); in receive_protocol()
3327 nc = rcu_dereference(connection->net_conf); in receive_protocol()
3330 drbd_err(connection, "incompatible %s settings\n", "protocol"); in receive_protocol()
3335 drbd_err(connection, "incompatible %s settings\n", "after-sb-0pri"); in receive_protocol()
3340 drbd_err(connection, "incompatible %s settings\n", "after-sb-1pri"); in receive_protocol()
3345 drbd_err(connection, "incompatible %s settings\n", "after-sb-2pri"); in receive_protocol()
3350 drbd_err(connection, "incompatible %s settings\n", "discard-my-data"); in receive_protocol()
3355 drbd_err(connection, "incompatible %s settings\n", "allow-two-primaries"); in receive_protocol()
3360 drbd_err(connection, "incompatible %s settings\n", "data-integrity-alg"); in receive_protocol()
3381 drbd_err(connection, "peer data-integrity-alg %s not supported\n", in receive_protocol()
3390 drbd_err(connection, "Allocation of buffers for data integrity checking failed\n"); in receive_protocol()
3397 drbd_err(connection, "Allocation of new net_conf failed\n"); in receive_protocol()
3401 mutex_lock(&connection->data.mutex); in receive_protocol()
3402 mutex_lock(&connection->resource->conf_update); in receive_protocol()
3403 old_net_conf = connection->net_conf; in receive_protocol()
3412 rcu_assign_pointer(connection->net_conf, new_net_conf); in receive_protocol()
3413 mutex_unlock(&connection->resource->conf_update); in receive_protocol()
3414 mutex_unlock(&connection->data.mutex); in receive_protocol()
3416 crypto_free_hash(connection->peer_integrity_tfm); in receive_protocol()
3417 kfree(connection->int_dig_in); in receive_protocol()
3418 kfree(connection->int_dig_vv); in receive_protocol()
3419 connection->peer_integrity_tfm = peer_integrity_tfm; in receive_protocol()
3420 connection->int_dig_in = int_dig_in; in receive_protocol()
3421 connection->int_dig_vv = int_dig_vv; in receive_protocol()
3424 drbd_info(connection, "peer data-integrity-alg: %s\n", in receive_protocol()
3437 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD); in receive_protocol()
3463 static int ignore_remaining_packet(struct drbd_connection *connection, struct packet_info *pi) in ignore_remaining_packet() argument
3465 void *buffer = connection->data.rbuf; in ignore_remaining_packet()
3470 s = drbd_recv(connection, buffer, s); in ignore_remaining_packet()
3494 static int config_unknown_volume(struct drbd_connection *connection, struct packet_info *pi) in config_unknown_volume() argument
3496 drbd_warn(connection, "%s packet received for volume %u, which is not configured locally\n", in config_unknown_volume()
3498 return ignore_remaining_packet(connection, pi); in config_unknown_volume()
3501 static int receive_SyncParam(struct drbd_connection *connection, struct packet_info *pi) in receive_SyncParam() argument
3511 const int apv = connection->agreed_pro_version; in receive_SyncParam()
3516 peer_device = conn_peer_device(connection, pi->vnr); in receive_SyncParam()
3518 return config_unknown_volume(connection, pi); in receive_SyncParam()
3550 err = drbd_recv_all(peer_device->connection, p, header_size); in receive_SyncParam()
3554 mutex_lock(&connection->resource->conf_update); in receive_SyncParam()
3555 old_net_conf = peer_device->connection->net_conf; in receive_SyncParam()
3560 mutex_unlock(&connection->resource->conf_update); in receive_SyncParam()
3581 err = drbd_recv_all(peer_device->connection, p->verify_alg, data_size); in receive_SyncParam()
3655 crypto_free_hash(peer_device->connection->verify_tfm); in receive_SyncParam()
3656 peer_device->connection->verify_tfm = verify_tfm; in receive_SyncParam()
3662 crypto_free_hash(peer_device->connection->csums_tfm); in receive_SyncParam()
3663 peer_device->connection->csums_tfm = csums_tfm; in receive_SyncParam()
3666 rcu_assign_pointer(connection->net_conf, new_net_conf); in receive_SyncParam()
3680 mutex_unlock(&connection->resource->conf_update); in receive_SyncParam()
3694 mutex_unlock(&connection->resource->conf_update); in receive_SyncParam()
3703 mutex_unlock(&connection->resource->conf_update); in receive_SyncParam()
3709 conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD); in receive_SyncParam()
3726 static int receive_sizes(struct drbd_connection *connection, struct packet_info *pi) in receive_sizes() argument
3736 peer_device = conn_peer_device(connection, pi->vnr); in receive_sizes()
3738 return config_unknown_volume(connection, pi); in receive_sizes()
3771 conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD); in receive_sizes()
3786 mutex_lock(&connection->resource->conf_update); in receive_sizes()
3792 mutex_unlock(&connection->resource->conf_update); in receive_sizes()
3867 static int receive_uuids(struct drbd_connection *connection, struct packet_info *pi) in receive_uuids() argument
3875 peer_device = conn_peer_device(connection, pi->vnr); in receive_uuids()
3877 return config_unknown_volume(connection, pi); in receive_uuids()
3898 conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD); in receive_uuids()
3905 peer_device->connection->agreed_pro_version >= 90 && in receive_uuids()
3974 static int receive_req_state(struct drbd_connection *connection, struct packet_info *pi) in receive_req_state() argument
3982 peer_device = conn_peer_device(connection, pi->vnr); in receive_req_state()
3990 if (test_bit(RESOLVE_CONFLICTS, &peer_device->connection->flags) && in receive_req_state()
4007 static int receive_req_conn_state(struct drbd_connection *connection, struct packet_info *pi) in receive_req_conn_state() argument
4016 if (test_bit(RESOLVE_CONFLICTS, &connection->flags) && in receive_req_conn_state()
4017 mutex_is_locked(&connection->cstate_mutex)) { in receive_req_conn_state()
4018 conn_send_sr_reply(connection, SS_CONCURRENT_ST_CHG); in receive_req_conn_state()
4025 rv = conn_request_state(connection, mask, val, CS_VERBOSE | CS_LOCAL_ONLY | CS_IGN_OUTD_FAIL); in receive_req_conn_state()
4026 conn_send_sr_reply(connection, rv); in receive_req_conn_state()
4031 static int receive_state(struct drbd_connection *connection, struct packet_info *pi) in receive_state() argument
4041 peer_device = conn_peer_device(connection, pi->vnr); in receive_state()
4043 return config_unknown_volume(connection, pi); in receive_state()
4151 if (test_and_clear_bit(CONN_DRY_RUN, &peer_device->connection->flags)) in receive_state()
4154 conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD); in receive_state()
4176 tl_clear(peer_device->connection); in receive_state()
4179 conn_request_state(peer_device->connection, NS2(conn, C_PROTOCOL_ERROR, susp, 0), CS_HARD); in receive_state()
4187 conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD); in receive_state()
4209 static int receive_sync_uuid(struct drbd_connection *connection, struct packet_info *pi) in receive_sync_uuid() argument
4215 peer_device = conn_peer_device(connection, pi->vnr); in receive_sync_uuid()
4255 drbd_header_size(peer_device->connection); in receive_bitmap_plain()
4267 err = drbd_recv_all(peer_device->connection, p, want); in receive_bitmap_plain()
4385 conn_request_state(peer_device->connection, NS(conn, C_PROTOCOL_ERROR), CS_HARD); in decode_bitmap_c()
4393 unsigned int header_size = drbd_header_size(first_peer_device(device)->connection); in INFO_bm_xfer_stats()
4433 static int receive_bitmap(struct drbd_connection *connection, struct packet_info *pi) in receive_bitmap() argument
4440 peer_device = conn_peer_device(connection, pi->vnr); in receive_bitmap()
4462 if (pi->size > DRBD_SOCKET_BUFFER_SIZE - drbd_header_size(connection)) { in receive_bitmap()
4472 err = drbd_recv_all(peer_device->connection, p, pi->size); in receive_bitmap()
4483 c.bytes[pi->cmd == P_BITMAP] += drbd_header_size(connection) + pi->size; in receive_bitmap()
4490 err = drbd_recv_header(peer_device->connection, pi); in receive_bitmap()
4521 static int receive_skip(struct drbd_connection *connection, struct packet_info *pi) in receive_skip() argument
4523 drbd_warn(connection, "skipping unknown optional packet type %d, l: %d!\n", in receive_skip()
4526 return ignore_remaining_packet(connection, pi); in receive_skip()
4529 static int receive_UnplugRemote(struct drbd_connection *connection, struct packet_info *pi) in receive_UnplugRemote() argument
4533 drbd_tcp_quickack(connection->data.socket); in receive_UnplugRemote()
4538 static int receive_out_of_sync(struct drbd_connection *connection, struct packet_info *pi) in receive_out_of_sync() argument
4544 peer_device = conn_peer_device(connection, pi->vnr); in receive_out_of_sync()
4598 static void drbdd(struct drbd_connection *connection) in drbdd() argument
4604 while (get_t_state(&connection->receiver) == RUNNING) { in drbdd()
4607 drbd_thread_current_set_cpu(&connection->receiver); in drbdd()
4608 update_receiver_timing_details(connection, drbd_recv_header); in drbdd()
4609 if (drbd_recv_header(connection, &pi)) in drbdd()
4614 drbd_err(connection, "Unexpected data packet %s (0x%04x)", in drbdd()
4621 drbd_err(connection, "No payload expected %s l:%d\n", in drbdd()
4627 update_receiver_timing_details(connection, drbd_recv_all_warn); in drbdd()
4628 err = drbd_recv_all_warn(connection, pi.data, shs); in drbdd()
4634 update_receiver_timing_details(connection, cmd->fn); in drbdd()
4635 err = cmd->fn(connection, &pi); in drbdd()
4637 drbd_err(connection, "error receiving %s, e: %d l: %d!\n", in drbdd()
4645 conn_request_state(connection, NS(conn, C_PROTOCOL_ERROR), CS_HARD); in drbdd()
4648 static void conn_disconnect(struct drbd_connection *connection) in conn_disconnect() argument
4654 if (connection->cstate == C_STANDALONE) in conn_disconnect()
4662 conn_request_state(connection, NS(conn, C_NETWORK_FAILURE), CS_HARD); in conn_disconnect()
4665 drbd_thread_stop(&connection->asender); in conn_disconnect()
4666 drbd_free_sock(connection); in conn_disconnect()
4669 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in conn_disconnect()
4679 if (!list_empty(&connection->current_epoch->list)) in conn_disconnect()
4680 drbd_err(connection, "ASSERTION FAILED: connection->current_epoch->list not empty\n"); in conn_disconnect()
4682 atomic_set(&connection->current_epoch->epoch_size, 0); in conn_disconnect()
4683 connection->send.seen_any_write_yet = false; in conn_disconnect()
4685 drbd_info(connection, "Connection closed\n"); in conn_disconnect()
4687 if (conn_highest_role(connection) == R_PRIMARY && conn_highest_pdsk(connection) >= D_UNKNOWN) in conn_disconnect()
4688 conn_try_outdate_peer_async(connection); in conn_disconnect()
4690 spin_lock_irq(&connection->resource->req_lock); in conn_disconnect()
4691 oc = connection->cstate; in conn_disconnect()
4693 _conn_request_state(connection, NS(conn, C_UNCONNECTED), CS_VERBOSE); in conn_disconnect()
4695 spin_unlock_irq(&connection->resource->req_lock); in conn_disconnect()
4698 conn_request_state(connection, NS(conn, C_STANDALONE), CS_VERBOSE | CS_HARD); in conn_disconnect()
4735 drbd_flush_workqueue(&peer_device->connection->sender_work); in drbd_disconnected()
4742 drbd_flush_workqueue(&peer_device->connection->sender_work); in drbd_disconnected()
4752 tl_clear(peer_device->connection); in drbd_disconnected()
4794 static int drbd_send_features(struct drbd_connection *connection) in drbd_send_features() argument
4799 sock = &connection->data; in drbd_send_features()
4800 p = conn_prepare_command(connection, sock); in drbd_send_features()
4807 return conn_send_command(connection, sock, P_CONNECTION_FEATURES, sizeof(*p), NULL, 0); in drbd_send_features()
4817 static int drbd_do_features(struct drbd_connection *connection) in drbd_do_features() argument
4825 err = drbd_send_features(connection); in drbd_do_features()
4829 err = drbd_recv_header(connection, &pi); in drbd_do_features()
4834 drbd_err(connection, "expected ConnectionFeatures packet, received: %s (0x%04x)\n", in drbd_do_features()
4840 drbd_err(connection, "expected ConnectionFeatures length: %u, received: %u\n", in drbd_do_features()
4846 err = drbd_recv_all_warn(connection, p, expect); in drbd_do_features()
4859 connection->agreed_pro_version = min_t(int, PRO_VERSION_MAX, p->protocol_max); in drbd_do_features()
4860 connection->agreed_features = PRO_FEATURES & be32_to_cpu(p->feature_flags); in drbd_do_features()
4862 drbd_info(connection, "Handshake successful: " in drbd_do_features()
4863 "Agreed network protocol version %d\n", connection->agreed_pro_version); in drbd_do_features()
4865 drbd_info(connection, "Agreed to%ssupport TRIM on protocol level\n", in drbd_do_features()
4866 connection->agreed_features & FF_TRIM ? " " : " not "); in drbd_do_features()
4871 drbd_err(connection, "incompatible DRBD dialects: " in drbd_do_features()
4879 static int drbd_do_auth(struct drbd_connection *connection) in drbd_do_auth() argument
4881 drbd_err(connection, "This kernel was build without CONFIG_CRYPTO_HMAC.\n"); in drbd_do_auth()
4882 drbd_err(connection, "You need to disable 'cram-hmac-alg' in drbd.conf.\n"); in drbd_do_auth()
4894 static int drbd_do_auth(struct drbd_connection *connection) in drbd_do_auth() argument
4913 nc = rcu_dereference(connection->net_conf); in drbd_do_auth()
4918 desc.tfm = connection->cram_hmac_tfm; in drbd_do_auth()
4921 rv = crypto_hash_setkey(connection->cram_hmac_tfm, (u8 *)secret, key_len); in drbd_do_auth()
4923 drbd_err(connection, "crypto_hash_setkey() failed with %d\n", rv); in drbd_do_auth()
4930 sock = &connection->data; in drbd_do_auth()
4931 if (!conn_prepare_command(connection, sock)) { in drbd_do_auth()
4935 rv = !conn_send_command(connection, sock, P_AUTH_CHALLENGE, 0, in drbd_do_auth()
4940 err = drbd_recv_header(connection, &pi); in drbd_do_auth()
4947 drbd_err(connection, "expected AuthChallenge packet, received: %s (0x%04x)\n", in drbd_do_auth()
4954 drbd_err(connection, "expected AuthChallenge payload too big.\n"); in drbd_do_auth()
4960 drbd_err(connection, "AuthChallenge payload too small.\n"); in drbd_do_auth()
4967 drbd_err(connection, "kmalloc of peers_ch failed\n"); in drbd_do_auth()
4972 err = drbd_recv_all_warn(connection, peers_ch, pi.size); in drbd_do_auth()
4979 drbd_err(connection, "Peer presented the same challenge!\n"); in drbd_do_auth()
4984 resp_size = crypto_hash_digestsize(connection->cram_hmac_tfm); in drbd_do_auth()
4987 drbd_err(connection, "kmalloc of response failed\n"); in drbd_do_auth()
4997 drbd_err(connection, "crypto_hash_digest() failed with %d\n", rv); in drbd_do_auth()
5002 if (!conn_prepare_command(connection, sock)) { in drbd_do_auth()
5006 rv = !conn_send_command(connection, sock, P_AUTH_RESPONSE, 0, in drbd_do_auth()
5011 err = drbd_recv_header(connection, &pi); in drbd_do_auth()
5018 drbd_err(connection, "expected AuthResponse packet, received: %s (0x%04x)\n", in drbd_do_auth()
5025 drbd_err(connection, "expected AuthResponse payload of wrong size\n"); in drbd_do_auth()
5030 err = drbd_recv_all_warn(connection, response , resp_size); in drbd_do_auth()
5038 drbd_err(connection, "kmalloc of right_response failed\n"); in drbd_do_auth()
5047 drbd_err(connection, "crypto_hash_digest() failed with %d\n", rv); in drbd_do_auth()
5055 drbd_info(connection, "Peer authenticated using %d bytes HMAC\n", in drbd_do_auth()
5071 struct drbd_connection *connection = thi->connection; in drbd_receiver() local
5074 drbd_info(connection, "receiver (re)started\n"); in drbd_receiver()
5077 h = conn_connect(connection); in drbd_receiver()
5079 conn_disconnect(connection); in drbd_receiver()
5083 drbd_warn(connection, "Discarding network configuration.\n"); in drbd_receiver()
5084 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD); in drbd_receiver()
5089 drbdd(connection); in drbd_receiver()
5091 conn_disconnect(connection); in drbd_receiver()
5093 drbd_info(connection, "receiver terminated\n"); in drbd_receiver()
5099 static int got_conn_RqSReply(struct drbd_connection *connection, struct packet_info *pi) in got_conn_RqSReply() argument
5105 set_bit(CONN_WD_ST_CHG_OKAY, &connection->flags); in got_conn_RqSReply()
5107 set_bit(CONN_WD_ST_CHG_FAIL, &connection->flags); in got_conn_RqSReply()
5108 drbd_err(connection, "Requested state change failed by peer: %s (%d)\n", in got_conn_RqSReply()
5111 wake_up(&connection->ping_wait); in got_conn_RqSReply()
5116 static int got_RqSReply(struct drbd_connection *connection, struct packet_info *pi) in got_RqSReply() argument
5123 peer_device = conn_peer_device(connection, pi->vnr); in got_RqSReply()
5128 if (test_bit(CONN_WD_ST_CHG_REQ, &connection->flags)) { in got_RqSReply()
5129 D_ASSERT(device, connection->agreed_pro_version < 100); in got_RqSReply()
5130 return got_conn_RqSReply(connection, pi); in got_RqSReply()
5145 static int got_Ping(struct drbd_connection *connection, struct packet_info *pi) in got_Ping() argument
5147 return drbd_send_ping_ack(connection); in got_Ping()
5151 static int got_PingAck(struct drbd_connection *connection, struct packet_info *pi) in got_PingAck() argument
5154 connection->meta.socket->sk->sk_rcvtimeo = connection->net_conf->ping_int*HZ; in got_PingAck()
5155 if (!test_and_set_bit(GOT_PING_ACK, &connection->flags)) in got_PingAck()
5156 wake_up(&connection->ping_wait); in got_PingAck()
5161 static int got_IsInSync(struct drbd_connection *connection, struct packet_info *pi) in got_IsInSync() argument
5169 peer_device = conn_peer_device(connection, pi->vnr); in got_IsInSync()
5174 D_ASSERT(device, peer_device->connection->agreed_pro_version >= 89); in got_IsInSync()
5213 static int got_BlockAck(struct drbd_connection *connection, struct packet_info *pi) in got_BlockAck() argument
5222 peer_device = conn_peer_device(connection, pi->vnr); in got_BlockAck()
5259 static int got_NegAck(struct drbd_connection *connection, struct packet_info *pi) in got_NegAck() argument
5268 peer_device = conn_peer_device(connection, pi->vnr); in got_NegAck()
5295 static int got_NegDReply(struct drbd_connection *connection, struct packet_info *pi) in got_NegDReply() argument
5302 peer_device = conn_peer_device(connection, pi->vnr); in got_NegDReply()
5317 static int got_NegRSDReply(struct drbd_connection *connection, struct packet_info *pi) in got_NegRSDReply() argument
5325 peer_device = conn_peer_device(connection, pi->vnr); in got_NegRSDReply()
5353 static int got_BarrierAck(struct drbd_connection *connection, struct packet_info *pi) in got_BarrierAck() argument
5359 tl_release(connection, p->barrier, be32_to_cpu(p->set_size)); in got_BarrierAck()
5362 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in got_BarrierAck()
5377 static int got_OVResult(struct drbd_connection *connection, struct packet_info *pi) in got_OVResult() argument
5386 peer_device = conn_peer_device(connection, pi->vnr); in got_OVResult()
5418 drbd_queue_work(&peer_device->connection->sender_work, &dw->w); in got_OVResult()
5429 static int got_skip(struct drbd_connection *connection, struct packet_info *pi) in got_skip() argument
5434 static int connection_finish_peer_reqs(struct drbd_connection *connection) in connection_finish_peer_reqs() argument
5440 clear_bit(SIGNAL_ASENDER, &connection->flags); in connection_finish_peer_reqs()
5444 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in connection_finish_peer_reqs()
5455 set_bit(SIGNAL_ASENDER, &connection->flags); in connection_finish_peer_reqs()
5457 spin_lock_irq(&connection->resource->req_lock); in connection_finish_peer_reqs()
5458 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in connection_finish_peer_reqs()
5464 spin_unlock_irq(&connection->resource->req_lock); in connection_finish_peer_reqs()
5473 int (*fn)(struct drbd_connection *connection, struct packet_info *);
5498 struct drbd_connection *connection = thi->connection; in drbd_asender() local
5502 void *buf = connection->meta.rbuf; in drbd_asender()
5504 unsigned int header_size = drbd_header_size(connection); in drbd_asender()
5513 drbd_err(connection, "drbd_asender: ERROR set priority, ret=%d\n", rv); in drbd_asender()
5519 nc = rcu_dereference(connection->net_conf); in drbd_asender()
5525 if (test_and_clear_bit(SEND_PING, &connection->flags)) { in drbd_asender()
5526 if (drbd_send_ping(connection)) { in drbd_asender()
5527 drbd_err(connection, "drbd_send_ping has failed\n"); in drbd_asender()
5530 connection->meta.socket->sk->sk_rcvtimeo = ping_timeo * HZ / 10; in drbd_asender()
5537 drbd_tcp_cork(connection->meta.socket); in drbd_asender()
5538 if (connection_finish_peer_reqs(connection)) { in drbd_asender()
5539 drbd_err(connection, "connection_finish_peer_reqs() failed\n"); in drbd_asender()
5544 drbd_tcp_uncork(connection->meta.socket); in drbd_asender()
5550 rv = drbd_recv_short(connection->meta.socket, buf, expect-received, 0); in drbd_asender()
5551 clear_bit(SIGNAL_ASENDER, &connection->flags); in drbd_asender()
5570 if (test_bit(DISCONNECT_SENT, &connection->flags)) { in drbd_asender()
5573 t = rcu_dereference(connection->net_conf)->ping_timeo * HZ/10; in drbd_asender()
5576 t = wait_event_timeout(connection->ping_wait, in drbd_asender()
5577 connection->cstate < C_WF_REPORT_PARAMS, in drbd_asender()
5582 drbd_err(connection, "meta connection shut down by peer.\n"); in drbd_asender()
5587 if (time_after(connection->last_received, in drbd_asender()
5588 jiffies - connection->meta.socket->sk->sk_rcvtimeo)) in drbd_asender()
5591 drbd_err(connection, "PingAck did not arrive in time.\n"); in drbd_asender()
5594 set_bit(SEND_PING, &connection->flags); in drbd_asender()
5599 drbd_err(connection, "sock_recvmsg returned %d\n", rv); in drbd_asender()
5604 if (decode_header(connection, connection->meta.rbuf, &pi)) in drbd_asender()
5608 drbd_err(connection, "Unexpected meta packet %s (0x%04x)\n", in drbd_asender()
5614 drbd_err(connection, "Wrong packet size on meta (c: %d, l: %d)\n", in drbd_asender()
5622 err = cmd->fn(connection, &pi); in drbd_asender()
5624 drbd_err(connection, "%pf failed\n", cmd->fn); in drbd_asender()
5628 connection->last_received = jiffies; in drbd_asender()
5632 connection->meta.socket->sk->sk_rcvtimeo = ping_int * HZ; in drbd_asender()
5636 buf = connection->meta.rbuf; in drbd_asender()
5641 if (test_bit(SEND_PING, &connection->flags)) in drbd_asender()
5643 rv = drbd_recv_short(connection->meta.socket, buf, expect-received, MSG_DONTWAIT); in drbd_asender()
5650 conn_request_state(connection, NS(conn, C_NETWORK_FAILURE), CS_HARD); in drbd_asender()
5651 conn_md_sync(connection); in drbd_asender()
5655 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD); in drbd_asender()
5657 clear_bit(SIGNAL_ASENDER, &connection->flags); in drbd_asender()
5659 drbd_info(connection, "asender terminated\n"); in drbd_asender()