Lines Matching full:connection

162  * @connection:	DRBD connection.
168 * termination of the connection.
170 void tl_release(struct drbd_connection *connection, unsigned int barrier_nr, in tl_release() argument
178 spin_lock_irq(&connection->resource->req_lock); in tl_release()
182 list_for_each_entry(r, &connection->transfer_log, tl_requests) { in tl_release()
207 drbd_err(connection, "BAD! BarrierAck #%u received, but no epoch in tl!?\n", in tl_release()
212 drbd_err(connection, "BAD! BarrierAck #%u received, expected #%u!\n", in tl_release()
218 drbd_err(connection, "BAD! BarrierAck #%u received with n_writes=%u, expected n_writes=%u!\n", in tl_release()
227 list_for_each_entry(req, &connection->transfer_log, tl_requests) in tl_release()
230 list_for_each_entry_safe_from(req, r, &connection->transfer_log, tl_requests) { in tl_release()
235 spin_unlock_irq(&connection->resource->req_lock); in tl_release()
240 spin_unlock_irq(&connection->resource->req_lock); in tl_release()
241 conn_request_state(connection, NS(conn, C_PROTOCOL_ERROR), CS_HARD); in tl_release()
247 * @connection: DRBD connection to operate on.
254 void _tl_restart(struct drbd_connection *connection, enum drbd_req_event what) in _tl_restart() argument
258 list_for_each_entry_safe(req, r, &connection->transfer_log, tl_requests) in _tl_restart()
262 void tl_restart(struct drbd_connection *connection, enum drbd_req_event what) in tl_restart() argument
264 spin_lock_irq(&connection->resource->req_lock); in tl_restart()
265 _tl_restart(connection, what); in tl_restart()
266 spin_unlock_irq(&connection->resource->req_lock); in tl_restart()
271 * @connection: DRBD connection.
273 * This is called after the connection to the peer was lost. The storage covered
277 void tl_clear(struct drbd_connection *connection) in tl_clear() argument
279 tl_restart(connection, CONNECTION_LOST_WHILE_PENDING); in tl_clear()
288 struct drbd_connection *connection = first_peer_device(device)->connection; in tl_abort_disk_io() local
291 spin_lock_irq(&connection->resource->req_lock); in tl_abort_disk_io()
292 list_for_each_entry_safe(req, r, &connection->transfer_log, tl_requests) { in tl_abort_disk_io()
299 spin_unlock_irq(&connection->resource->req_lock); in tl_abort_disk_io()
347 if (thi->connection) in drbd_thread_setup()
348 kref_put(&thi->connection->kref, drbd_destroy_connection); in drbd_thread_setup()
362 thi->connection = NULL; in drbd_thread_init()
389 if (thi->connection) in drbd_thread_start()
390 kref_get(&thi->connection->kref); in drbd_thread_start()
404 if (thi->connection) in drbd_thread_start()
405 kref_put(&thi->connection->kref, drbd_destroy_connection); in drbd_thread_start()
467 int conn_lowest_minor(struct drbd_connection *connection) in conn_lowest_minor() argument
473 peer_device = idr_get_next(&connection->peer_devices, &vnr); in conn_lowest_minor()
547 unsigned int drbd_header_size(struct drbd_connection *connection) in drbd_header_size() argument
549 if (connection->agreed_pro_version >= 100) { in drbd_header_size()
587 static unsigned int prepare_header(struct drbd_connection *connection, int vnr, in prepare_header() argument
590 if (connection->agreed_pro_version >= 100) in prepare_header()
592 else if (connection->agreed_pro_version >= 95 && in prepare_header()
599 static void *__conn_prepare_command(struct drbd_connection *connection, in __conn_prepare_command() argument
604 return sock->sbuf + drbd_header_size(connection); in __conn_prepare_command()
607 void *conn_prepare_command(struct drbd_connection *connection, struct drbd_socket *sock) in conn_prepare_command() argument
612 p = __conn_prepare_command(connection, sock); in conn_prepare_command()
621 return conn_prepare_command(peer_device->connection, sock); in drbd_prepare_command()
624 static int __send_command(struct drbd_connection *connection, int vnr, in __send_command() argument
641 header_size += prepare_header(connection, vnr, sock->sbuf, cmd, in __send_command()
643 err = drbd_send_all(connection, sock->socket, sock->sbuf, header_size, in __send_command()
646 err = drbd_send_all(connection, sock->socket, data, size, 0); in __send_command()
655 static int __conn_send_command(struct drbd_connection *connection, struct drbd_socket *sock, in __conn_send_command() argument
659 return __send_command(connection, 0, sock, cmd, header_size, data, size); in __conn_send_command()
662 int conn_send_command(struct drbd_connection *connection, struct drbd_socket *sock, in conn_send_command() argument
668 err = __conn_send_command(connection, sock, cmd, header_size, data, size); in conn_send_command()
679 err = __send_command(peer_device->connection, peer_device->device->vnr, in drbd_send_command()
685 int drbd_send_ping(struct drbd_connection *connection) in drbd_send_ping() argument
689 sock = &connection->meta; in drbd_send_ping()
690 if (!conn_prepare_command(connection, sock)) in drbd_send_ping()
692 return conn_send_command(connection, sock, P_PING, 0, NULL, 0); in drbd_send_ping()
695 int drbd_send_ping_ack(struct drbd_connection *connection) in drbd_send_ping_ack() argument
699 sock = &connection->meta; in drbd_send_ping_ack()
700 if (!conn_prepare_command(connection, sock)) in drbd_send_ping_ack()
702 return conn_send_command(connection, sock, P_PING_ACK, 0, NULL, 0); in drbd_send_ping_ack()
710 const int apv = peer_device->connection->agreed_pro_version; in drbd_send_sync_param()
715 sock = &peer_device->connection->data; in drbd_send_sync_param()
721 nc = rcu_dereference(peer_device->connection->net_conf); in drbd_send_sync_param()
759 int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_packet cmd) in __drbd_send_protocol() argument
766 sock = &connection->data; in __drbd_send_protocol()
767 p = __conn_prepare_command(connection, sock); in __drbd_send_protocol()
772 nc = rcu_dereference(connection->net_conf); in __drbd_send_protocol()
774 if (nc->tentative && connection->agreed_pro_version < 92) { in __drbd_send_protocol()
776 drbd_err(connection, "--dry-run is not supported by peer"); in __drbd_send_protocol()
781 if (connection->agreed_pro_version >= 87) in __drbd_send_protocol()
796 if (connection->agreed_pro_version >= 87) in __drbd_send_protocol()
800 return __conn_send_command(connection, sock, cmd, size, NULL, 0); in __drbd_send_protocol()
803 int drbd_send_protocol(struct drbd_connection *connection) in drbd_send_protocol() argument
807 mutex_lock(&connection->data.mutex); in drbd_send_protocol()
808 err = __drbd_send_protocol(connection, P_PROTOCOL); in drbd_send_protocol()
809 mutex_unlock(&connection->data.mutex); in drbd_send_protocol()
824 sock = &peer_device->connection->data; in _drbd_send_uuids()
838 uuid_flags |= rcu_dereference(peer_device->connection->net_conf)->discard_my_data ? 1 : 0; in _drbd_send_uuids()
894 sock = &peer_device->connection->data; in drbd_gen_and_send_sync_uuid()
937 sock = &peer_device->connection->data; in drbd_send_sizes()
943 if (peer_device->connection->agreed_features & DRBD_FF_WSAME) in drbd_send_sizes()
966 if (peer_device->connection->agreed_pro_version <= 94) in drbd_send_sizes()
968 else if (peer_device->connection->agreed_pro_version < 100) in drbd_send_sizes()
993 sock = &peer_device->connection->data; in drbd_send_current_state()
1016 sock = &peer_device->connection->data; in drbd_send_state()
1029 sock = &peer_device->connection->data; in drbd_send_state_req()
1038 int conn_send_state_req(struct drbd_connection *connection, union drbd_state mask, union drbd_state… in conn_send_state_req() argument
1044 cmd = connection->agreed_pro_version < 100 ? P_STATE_CHG_REQ : P_CONN_ST_CHG_REQ; in conn_send_state_req()
1045 sock = &connection->data; in conn_send_state_req()
1046 p = conn_prepare_command(connection, sock); in conn_send_state_req()
1051 return conn_send_command(connection, sock, cmd, sizeof(*p), NULL, 0); in conn_send_state_req()
1059 sock = &peer_device->connection->meta; in drbd_send_sr_reply()
1067 void conn_send_sr_reply(struct drbd_connection *connection, enum drbd_state_rv retcode) in conn_send_sr_reply() argument
1071 …enum drbd_packet cmd = connection->agreed_pro_version < 100 ? P_STATE_CHG_REPLY : P_CONN_ST_CHG_RE… in conn_send_sr_reply()
1073 sock = &connection->meta; in conn_send_sr_reply()
1074 p = conn_prepare_command(connection, sock); in conn_send_sr_reply()
1077 conn_send_command(connection, sock, cmd, sizeof(*p), NULL, 0); in conn_send_sr_reply()
1113 use_rle = rcu_dereference(first_peer_device(device)->connection->net_conf)->use_rle; in fill_bitmap_rle_bits()
1115 if (!use_rle || first_peer_device(device)->connection->agreed_pro_version < 90) in fill_bitmap_rle_bits()
1204 struct drbd_socket *sock = &first_peer_device(device)->connection->data; in send_bitmap_rle_or_plain()
1205 unsigned int header_size = drbd_header_size(first_peer_device(device)->connection); in send_bitmap_rle_or_plain()
1216 err = __send_command(first_peer_device(device)->connection, device->vnr, sock, in send_bitmap_rle_or_plain()
1237 …err = __send_command(first_peer_device(device)->connection, device->vnr, sock, P_BITMAP, len, NULL… in send_bitmap_rle_or_plain()
1297 struct drbd_socket *sock = &first_peer_device(device)->connection->data; in drbd_send_bitmap()
1307 void drbd_send_b_ack(struct drbd_connection *connection, u32 barrier_nr, u32 set_size) in drbd_send_b_ack() argument
1312 if (connection->cstate < C_WF_REPORT_PARAMS) in drbd_send_b_ack()
1315 sock = &connection->meta; in drbd_send_b_ack()
1316 p = conn_prepare_command(connection, sock); in drbd_send_b_ack()
1321 conn_send_command(connection, sock, P_BARRIER_ACK, sizeof(*p), NULL, 0); in drbd_send_b_ack()
1341 sock = &peer_device->connection->meta; in _drbd_send_ack()
1358 if (peer_device->connection->peer_integrity_tfm) in drbd_send_ack_dp()
1359 data_size -= crypto_shash_digestsize(peer_device->connection->peer_integrity_tfm); in drbd_send_ack_dp()
1402 sock = &peer_device->connection->data; in drbd_send_rs_deallocated()
1418 sock = &peer_device->connection->data; in drbd_send_drequest()
1436 sock = &peer_device->connection->data; in drbd_send_drequest_csum()
1451 sock = &peer_device->connection->data; in drbd_send_ov_request()
1463 * true if we think connection is dead
1465 static int we_should_drop_the_connection(struct drbd_connection *connection, struct socket *sock) in we_should_drop_the_connection() argument
1470 drop_it = connection->meta.socket == sock in we_should_drop_the_connection()
1471 || !connection->ack_receiver.task in we_should_drop_the_connection()
1472 || get_t_state(&connection->ack_receiver) != RUNNING in we_should_drop_the_connection()
1473 || connection->cstate < C_WF_REPORT_PARAMS; in we_should_drop_the_connection()
1478 drop_it = !--connection->ko_count; in we_should_drop_the_connection()
1480 drbd_err(connection, "[%s/%d] sock_sendmsg time expired, ko = %u\n", in we_should_drop_the_connection()
1481 current->comm, current->pid, connection->ko_count); in we_should_drop_the_connection()
1482 request_ping(connection); in we_should_drop_the_connection()
1488 static void drbd_update_congested(struct drbd_connection *connection) in drbd_update_congested() argument
1490 struct sock *sk = connection->data.socket->sk; in drbd_update_congested()
1492 set_bit(NET_CONGESTED, &connection->flags); in drbd_update_congested()
1523 socket = peer_device->connection->data.socket; in _drbd_no_send_page()
1525 err = drbd_send_all(peer_device->connection, socket, addr, size, msg_flags); in _drbd_no_send_page()
1535 struct socket *socket = peer_device->connection->data.socket; in _drbd_send_page()
1549 drbd_update_congested(peer_device->connection); in _drbd_send_page()
1556 if (we_should_drop_the_connection(peer_device->connection, socket)) in _drbd_send_page()
1569 clear_bit(NET_CONGESTED, &peer_device->connection->flags); in _drbd_send_page()
1641 static u32 bio_flags_to_wire(struct drbd_connection *connection, in bio_flags_to_wire() argument
1644 if (connection->agreed_pro_version >= 95) in bio_flags_to_wire()
1651 ((connection->agreed_features & DRBD_FF_WZEROES) ? in bio_flags_to_wire()
1673 sock = &peer_device->connection->data; in drbd_send_dblock()
1675 digest_size = peer_device->connection->integrity_tfm ? in drbd_send_dblock()
1676 crypto_shash_digestsize(peer_device->connection->integrity_tfm) : 0; in drbd_send_dblock()
1683 dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio); in drbd_send_dblock()
1687 if (peer_device->connection->agreed_pro_version >= 100) { in drbd_send_dblock()
1702 err = __send_command(peer_device->connection, device->vnr, sock, cmd, sizeof(*t), NULL, 0); in drbd_send_dblock()
1718 drbd_csum_bio(peer_device->connection->integrity_tfm, req->master_bio, digest_out); in drbd_send_dblock()
1721 __send_command(peer_device->connection, device->vnr, sock, P_WSAME, in drbd_send_dblock()
1726 __send_command(peer_device->connection, device->vnr, sock, P_DATA, in drbd_send_dblock()
1750 drbd_csum_bio(peer_device->connection->integrity_tfm, req->master_bio, digest); in drbd_send_dblock()
1779 sock = &peer_device->connection->data; in drbd_send_block()
1782 digest_size = peer_device->connection->integrity_tfm ? in drbd_send_block()
1783 crypto_shash_digestsize(peer_device->connection->integrity_tfm) : 0; in drbd_send_block()
1792 drbd_csum_ee(peer_device->connection->integrity_tfm, peer_req, p + 1); in drbd_send_block()
1793 …err = __send_command(peer_device->connection, device->vnr, sock, cmd, sizeof(*p) + digest_size, NU… in drbd_send_block()
1806 sock = &peer_device->connection->data; in drbd_send_out_of_sync()
1831 int drbd_send(struct drbd_connection *connection, struct socket *sock, in drbd_send() argument
1845 if (sock == connection->data.socket) { in drbd_send()
1847 connection->ko_count = rcu_dereference(connection->net_conf)->ko_count; in drbd_send()
1849 drbd_update_congested(connection); in drbd_send()
1854 if (we_should_drop_the_connection(connection, sock)) in drbd_send()
1868 if (sock == connection->data.socket) in drbd_send()
1869 clear_bit(NET_CONGESTED, &connection->flags); in drbd_send()
1873 drbd_err(connection, "%s_sendmsg returned %d\n", in drbd_send()
1874 sock == connection->meta.socket ? "msock" : "sock", in drbd_send()
1876 conn_request_state(connection, NS(conn, C_BROKEN_PIPE), CS_HARD); in drbd_send()
1878 conn_request_state(connection, NS(conn, C_TIMEOUT), CS_HARD); in drbd_send()
1889 int drbd_send_all(struct drbd_connection *connection, struct socket *sock, void *buffer, in drbd_send_all() argument
1894 err = drbd_send(connection, sock, buffer, size, msg_flags); in drbd_send_all()
1943 &first_peer_device(device)->connection->sender_work, in drbd_queue_unplug()
2034 if (first_peer_device(device)->connection->receiver.t_state != NONE) in drbd_device_cleanup()
2036 first_peer_device(device)->connection->receiver.t_state); in drbd_device_cleanup()
2054 D_ASSERT(device, first_peer_device(device)->connection->net_conf == NULL); in drbd_device_cleanup()
2074 D_ASSERT(device, list_empty(&first_peer_device(device)->connection->sender_work.q)); in drbd_device_cleanup()
2237 /* not for_each_connection(connection, resource): in drbd_destroy_device()
2241 kref_put(&peer_device->connection->kref, drbd_destroy_connection); in drbd_destroy_device()
2342 struct drbd_connection *connection, *tmp; in drbd_free_resource() local
2344 for_each_connection_safe(connection, tmp, resource) { in drbd_free_resource()
2345 list_del(&connection->connections); in drbd_free_resource()
2346 drbd_debugfs_connection_cleanup(connection); in drbd_free_resource()
2347 kref_put(&connection->kref, drbd_destroy_connection); in drbd_free_resource()
2449 struct drbd_connection *connection; in conn_get_by_addrs() local
2453 for_each_connection_rcu(connection, resource) { in conn_get_by_addrs()
2454 if (connection->my_addr_len == my_addr_len && in conn_get_by_addrs()
2455 connection->peer_addr_len == peer_addr_len && in conn_get_by_addrs()
2456 !memcmp(&connection->my_addr, my_addr, my_addr_len) && in conn_get_by_addrs()
2457 !memcmp(&connection->peer_addr, peer_addr, peer_addr_len)) { in conn_get_by_addrs()
2458 kref_get(&connection->kref); in conn_get_by_addrs()
2463 connection = NULL; in conn_get_by_addrs()
2466 return connection; in conn_get_by_addrs()
2486 void conn_free_crypto(struct drbd_connection *connection) in conn_free_crypto() argument
2488 drbd_free_sock(connection); in conn_free_crypto()
2490 crypto_free_shash(connection->csums_tfm); in conn_free_crypto()
2491 crypto_free_shash(connection->verify_tfm); in conn_free_crypto()
2492 crypto_free_shash(connection->cram_hmac_tfm); in conn_free_crypto()
2493 crypto_free_shash(connection->integrity_tfm); in conn_free_crypto()
2494 crypto_free_shash(connection->peer_integrity_tfm); in conn_free_crypto()
2495 kfree(connection->int_dig_in); in conn_free_crypto()
2496 kfree(connection->int_dig_vv); in conn_free_crypto()
2498 connection->csums_tfm = NULL; in conn_free_crypto()
2499 connection->verify_tfm = NULL; in conn_free_crypto()
2500 connection->cram_hmac_tfm = NULL; in conn_free_crypto()
2501 connection->integrity_tfm = NULL; in conn_free_crypto()
2502 connection->peer_integrity_tfm = NULL; in conn_free_crypto()
2503 connection->int_dig_in = NULL; in conn_free_crypto()
2504 connection->int_dig_vv = NULL; in conn_free_crypto()
2509 struct drbd_connection *connection; in set_resource_options() local
2545 for_each_connection_rcu(connection, resource) { in set_resource_options()
2546 connection->receiver.reset_cpu_mask = 1; in set_resource_options()
2547 connection->ack_receiver.reset_cpu_mask = 1; in set_resource_options()
2548 connection->worker.reset_cpu_mask = 1; in set_resource_options()
2594 struct drbd_connection *connection; in conn_create() local
2596 connection = kzalloc(sizeof(struct drbd_connection), GFP_KERNEL); in conn_create()
2597 if (!connection) in conn_create()
2600 if (drbd_alloc_socket(&connection->data)) in conn_create()
2602 if (drbd_alloc_socket(&connection->meta)) in conn_create()
2605 connection->current_epoch = kzalloc(sizeof(struct drbd_epoch), GFP_KERNEL); in conn_create()
2606 if (!connection->current_epoch) in conn_create()
2609 INIT_LIST_HEAD(&connection->transfer_log); in conn_create()
2611 INIT_LIST_HEAD(&connection->current_epoch->list); in conn_create()
2612 connection->epochs = 1; in conn_create()
2613 spin_lock_init(&connection->epoch_lock); in conn_create()
2615 connection->send.seen_any_write_yet = false; in conn_create()
2616 connection->send.current_epoch_nr = 0; in conn_create()
2617 connection->send.current_epoch_writes = 0; in conn_create()
2623 connection->cstate = C_STANDALONE; in conn_create()
2624 mutex_init(&connection->cstate_mutex); in conn_create()
2625 init_waitqueue_head(&connection->ping_wait); in conn_create()
2626 idr_init(&connection->peer_devices); in conn_create()
2628 drbd_init_workqueue(&connection->sender_work); in conn_create()
2629 mutex_init(&connection->data.mutex); in conn_create()
2630 mutex_init(&connection->meta.mutex); in conn_create()
2632 drbd_thread_init(resource, &connection->receiver, drbd_receiver, "receiver"); in conn_create()
2633 connection->receiver.connection = connection; in conn_create()
2634 drbd_thread_init(resource, &connection->worker, drbd_worker, "worker"); in conn_create()
2635 connection->worker.connection = connection; in conn_create()
2636 drbd_thread_init(resource, &connection->ack_receiver, drbd_ack_receiver, "ack_recv"); in conn_create()
2637 connection->ack_receiver.connection = connection; in conn_create()
2639 kref_init(&connection->kref); in conn_create()
2641 connection->resource = resource; in conn_create()
2647 list_add_tail_rcu(&connection->connections, &resource->connections); in conn_create()
2648 drbd_debugfs_connection_add(connection); in conn_create()
2649 return connection; in conn_create()
2655 kfree(connection->current_epoch); in conn_create()
2656 drbd_free_socket(&connection->meta); in conn_create()
2657 drbd_free_socket(&connection->data); in conn_create()
2658 kfree(connection); in conn_create()
2664 struct drbd_connection *connection = container_of(kref, struct drbd_connection, kref); in drbd_destroy_connection() local
2665 struct drbd_resource *resource = connection->resource; in drbd_destroy_connection()
2667 if (atomic_read(&connection->current_epoch->epoch_size) != 0) in drbd_destroy_connection()
2668 drbd_err(connection, "epoch_size:%d\n", atomic_read(&connection->current_epoch->epoch_size)); in drbd_destroy_connection()
2669 kfree(connection->current_epoch); in drbd_destroy_connection()
2671 idr_destroy(&connection->peer_devices); in drbd_destroy_connection()
2673 drbd_free_socket(&connection->meta); in drbd_destroy_connection()
2674 drbd_free_socket(&connection->data); in drbd_destroy_connection()
2675 kfree(connection->int_dig_in); in drbd_destroy_connection()
2676 kfree(connection->int_dig_vv); in drbd_destroy_connection()
2677 memset(connection, 0xfc, sizeof(*connection)); in drbd_destroy_connection()
2678 kfree(connection); in drbd_destroy_connection()
2699 struct drbd_connection *connection; in drbd_create_device() local
2772 for_each_connection(connection, resource) { in drbd_create_device()
2776 peer_device->connection = connection; in drbd_create_device()
2782 id = idr_alloc(&connection->peer_devices, peer_device, vnr, vnr + 1, GFP_KERNEL); in drbd_create_device()
2788 kref_get(&connection->kref); in drbd_create_device()
2799 /* inherit the connection state */ in drbd_create_device()
2812 idr_remove(&connection->peer_devices, vnr); in drbd_create_device()
2814 for_each_connection(connection, resource) { in drbd_create_device()
2815 peer_device = idr_remove(&connection->peer_devices, vnr); in drbd_create_device()
2817 kref_put(&connection->kref, drbd_destroy_connection); in drbd_create_device()
2842 struct drbd_connection *connection; in drbd_delete_device() local
2849 for_each_connection(connection, resource) { in drbd_delete_device()
2850 idr_remove(&connection->peer_devices, device->vnr); in drbd_delete_device()
2952 void drbd_free_sock(struct drbd_connection *connection) in drbd_free_sock() argument
2954 if (connection->data.socket) in drbd_free_sock()
2955 drbd_free_one_sock(&connection->data); in drbd_free_sock()
2956 if (connection->meta.socket) in drbd_free_sock()
2957 drbd_free_one_sock(&connection->meta); in drbd_free_sock()
2962 void conn_md_sync(struct drbd_connection *connection) in conn_md_sync() argument
2968 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { in conn_md_sync()
3516 D_ASSERT(device, current == first_peer_device(device)->connection->worker.task); in drbd_queue_bitmap_io()
3536 drbd_queue_work(&first_peer_device(device)->connection->sender_work, in drbd_queue_bitmap_io()
3559 D_ASSERT(device, current != first_peer_device(device)->connection->worker.task); in drbd_bitmap_io()
3686 nc = rcu_dereference(first_peer_device(device)->connection->net_conf); in drbd_wait_misc()