^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <linux/ceph/ceph_debug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/crc32c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/inet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kthread.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/net.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/nsproxy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/sched/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/socket.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #ifdef CONFIG_BLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/bio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #endif /* CONFIG_BLOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/dns_resolver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <net/tcp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/ceph/ceph_features.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/ceph/libceph.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/ceph/messenger.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/ceph/decode.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/ceph/pagelist.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * Ceph uses the messenger to exchange ceph_msg messages with other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * hosts in the system. The messenger provides ordered and reliable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * delivery. We tolerate TCP disconnects by reconnecting (with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * exponential backoff) in the case of a fault (disconnection, bad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * crc, protocol error). Acks allow sent messages to be discarded by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * the sender.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * We track the state of the socket on a given connection using
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * values defined below. The transition to a new socket state is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * handled by a function which verifies we aren't coming from an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * unexpected state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * --------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * | NEW* | transient initial state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * --------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * | con_sock_state_init()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * v
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * ----------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * | CLOSED | initialized, but no socket (and no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * ---------- TCP connection)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * ^ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * | \ con_sock_state_connecting()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * | ----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * + con_sock_state_closed() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * |+--------------------------- \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * | \ \ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * | ----------- \ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * | | CLOSING | socket event; \ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * | ----------- await close \ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * | ^ \ |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * | | \ |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * | + con_sock_state_closing() \ |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * | / \ | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * | / --------------- | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * | / \ v v
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * | / --------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * | / -----------------| CONNECTING | socket created, TCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * | | / -------------- connect initiated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * | | | con_sock_state_connected()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * | | v
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * -------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * | CONNECTED | TCP connection established
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * -------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * State values for ceph_connection->sock_state; NEW is assumed to be 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define CON_SOCK_STATE_NEW 0 /* -> CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define CON_SOCK_STATE_CLOSED 1 /* -> CONNECTING */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define CON_SOCK_STATE_CONNECTING 2 /* -> CONNECTED or -> CLOSING */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define CON_SOCK_STATE_CONNECTED 3 /* -> CLOSING or -> CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define CON_SOCK_STATE_CLOSING 4 /* -> CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * connection states
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define CON_STATE_CLOSED 1 /* -> PREOPEN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define CON_STATE_PREOPEN 2 /* -> CONNECTING, CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define CON_STATE_CONNECTING 3 /* -> NEGOTIATING, CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define CON_STATE_NEGOTIATING 4 /* -> OPEN, CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define CON_STATE_OPEN 5 /* -> STANDBY, CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define CON_STATE_STANDBY 6 /* -> PREOPEN, CLOSED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * ceph_connection flag bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define CON_FLAG_LOSSYTX 0 /* we can close channel or drop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * messages on errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define CON_FLAG_KEEPALIVE_PENDING 1 /* we need to send a keepalive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define CON_FLAG_WRITE_PENDING 2 /* we have data ready to send */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define CON_FLAG_SOCK_CLOSED 3 /* socket state changed to closed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define CON_FLAG_BACKOFF 4 /* need to retry queuing delayed work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static bool con_flag_valid(unsigned long con_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) switch (con_flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) case CON_FLAG_LOSSYTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) case CON_FLAG_KEEPALIVE_PENDING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) case CON_FLAG_WRITE_PENDING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) case CON_FLAG_SOCK_CLOSED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) case CON_FLAG_BACKOFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static void con_flag_clear(struct ceph_connection *con, unsigned long con_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) BUG_ON(!con_flag_valid(con_flag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) clear_bit(con_flag, &con->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) static void con_flag_set(struct ceph_connection *con, unsigned long con_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) BUG_ON(!con_flag_valid(con_flag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) set_bit(con_flag, &con->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) static bool con_flag_test(struct ceph_connection *con, unsigned long con_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) BUG_ON(!con_flag_valid(con_flag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return test_bit(con_flag, &con->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static bool con_flag_test_and_clear(struct ceph_connection *con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) unsigned long con_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) BUG_ON(!con_flag_valid(con_flag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) return test_and_clear_bit(con_flag, &con->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static bool con_flag_test_and_set(struct ceph_connection *con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) unsigned long con_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) BUG_ON(!con_flag_valid(con_flag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) return test_and_set_bit(con_flag, &con->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* Slab caches for frequently-allocated structures */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static struct kmem_cache *ceph_msg_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* static tag bytes (protocol control messages) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static char tag_msg = CEPH_MSGR_TAG_MSG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static char tag_ack = CEPH_MSGR_TAG_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) static char tag_keepalive = CEPH_MSGR_TAG_KEEPALIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static char tag_keepalive2 = CEPH_MSGR_TAG_KEEPALIVE2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #ifdef CONFIG_LOCKDEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) static struct lock_class_key socket_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static void queue_con(struct ceph_connection *con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) static void cancel_con(struct ceph_connection *con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) static void ceph_con_workfn(struct work_struct *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) static void con_fault(struct ceph_connection *con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * Nicely render a sockaddr as a string. An array of formatted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * strings is used, to approximate reentrancy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define ADDR_STR_COUNT_LOG 5 /* log2(# address strings in array) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define ADDR_STR_COUNT (1 << ADDR_STR_COUNT_LOG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define ADDR_STR_COUNT_MASK (ADDR_STR_COUNT - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define MAX_ADDR_STR_LEN 64 /* 54 is enough */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) static char addr_str[ADDR_STR_COUNT][MAX_ADDR_STR_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) static atomic_t addr_str_seq = ATOMIC_INIT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) static struct page *zero_page; /* used in certain error cases */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) const char *ceph_pr_addr(const struct ceph_entity_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) char *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct sockaddr_storage ss = addr->in_addr; /* align */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) struct sockaddr_in *in4 = (struct sockaddr_in *)&ss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)&ss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) i = atomic_inc_return(&addr_str_seq) & ADDR_STR_COUNT_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) s = addr_str[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) switch (ss.ss_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) case AF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) snprintf(s, MAX_ADDR_STR_LEN, "(%d)%pI4:%hu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) le32_to_cpu(addr->type), &in4->sin_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) ntohs(in4->sin_port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) case AF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) snprintf(s, MAX_ADDR_STR_LEN, "(%d)[%pI6c]:%hu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) le32_to_cpu(addr->type), &in6->sin6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) ntohs(in6->sin6_port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) snprintf(s, MAX_ADDR_STR_LEN, "(unknown sockaddr family %hu)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) ss.ss_family);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) EXPORT_SYMBOL(ceph_pr_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static void encode_my_addr(struct ceph_messenger *msgr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) memcpy(&msgr->my_enc_addr, &msgr->inst.addr, sizeof(msgr->my_enc_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) ceph_encode_banner_addr(&msgr->my_enc_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * work queue for all reading and writing to/from the socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) static struct workqueue_struct *ceph_msgr_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) static int ceph_msgr_slab_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) BUG_ON(ceph_msg_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) ceph_msg_cache = KMEM_CACHE(ceph_msg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (!ceph_msg_cache)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static void ceph_msgr_slab_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) BUG_ON(!ceph_msg_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) kmem_cache_destroy(ceph_msg_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) ceph_msg_cache = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) static void _ceph_msgr_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (ceph_msgr_wq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) destroy_workqueue(ceph_msgr_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) ceph_msgr_wq = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) BUG_ON(zero_page == NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) put_page(zero_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) zero_page = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) ceph_msgr_slab_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) int __init ceph_msgr_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (ceph_msgr_slab_init())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) BUG_ON(zero_page != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) zero_page = ZERO_PAGE(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) get_page(zero_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * The number of active work items is limited by the number of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * connections, so leave @max_active at default.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) ceph_msgr_wq = alloc_workqueue("ceph-msgr", WQ_MEM_RECLAIM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (ceph_msgr_wq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) pr_err("msgr_init failed to create workqueue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) _ceph_msgr_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) void ceph_msgr_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) BUG_ON(ceph_msgr_wq == NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) _ceph_msgr_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) void ceph_msgr_flush(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) flush_workqueue(ceph_msgr_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) EXPORT_SYMBOL(ceph_msgr_flush);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* Connection socket state transition functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) static void con_sock_state_init(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) int old_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) old_state = atomic_xchg(&con->sock_state, CON_SOCK_STATE_CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (WARN_ON(old_state != CON_SOCK_STATE_NEW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) printk("%s: unexpected old state %d\n", __func__, old_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) dout("%s con %p sock %d -> %d\n", __func__, con, old_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) CON_SOCK_STATE_CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) static void con_sock_state_connecting(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) int old_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) old_state = atomic_xchg(&con->sock_state, CON_SOCK_STATE_CONNECTING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) if (WARN_ON(old_state != CON_SOCK_STATE_CLOSED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) printk("%s: unexpected old state %d\n", __func__, old_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) dout("%s con %p sock %d -> %d\n", __func__, con, old_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) CON_SOCK_STATE_CONNECTING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) static void con_sock_state_connected(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) int old_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) old_state = atomic_xchg(&con->sock_state, CON_SOCK_STATE_CONNECTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) if (WARN_ON(old_state != CON_SOCK_STATE_CONNECTING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) printk("%s: unexpected old state %d\n", __func__, old_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) dout("%s con %p sock %d -> %d\n", __func__, con, old_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) CON_SOCK_STATE_CONNECTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) static void con_sock_state_closing(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) int old_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) old_state = atomic_xchg(&con->sock_state, CON_SOCK_STATE_CLOSING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (WARN_ON(old_state != CON_SOCK_STATE_CONNECTING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) old_state != CON_SOCK_STATE_CONNECTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) old_state != CON_SOCK_STATE_CLOSING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) printk("%s: unexpected old state %d\n", __func__, old_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) dout("%s con %p sock %d -> %d\n", __func__, con, old_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) CON_SOCK_STATE_CLOSING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) static void con_sock_state_closed(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) int old_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) old_state = atomic_xchg(&con->sock_state, CON_SOCK_STATE_CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (WARN_ON(old_state != CON_SOCK_STATE_CONNECTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) old_state != CON_SOCK_STATE_CLOSING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) old_state != CON_SOCK_STATE_CONNECTING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) old_state != CON_SOCK_STATE_CLOSED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) printk("%s: unexpected old state %d\n", __func__, old_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) dout("%s con %p sock %d -> %d\n", __func__, con, old_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) CON_SOCK_STATE_CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * socket callback functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /* data available on socket, or listen socket received a connect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) static void ceph_sock_data_ready(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct ceph_connection *con = sk->sk_user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) if (atomic_read(&con->msgr->stopping)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (sk->sk_state != TCP_CLOSE_WAIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) dout("%s on %p state = %lu, queueing work\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) con, con->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /* socket has buffer space for writing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) static void ceph_sock_write_space(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct ceph_connection *con = sk->sk_user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) /* only queue to workqueue if there is data we want to write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) * and there is sufficient space in the socket buffer to accept
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) * more data. clear SOCK_NOSPACE so that ceph_sock_write_space()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) * doesn't get called again until try_write() fills the socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) * buffer. See net/ipv4/tcp_input.c:tcp_check_space()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) * and net/core/stream.c:sk_stream_write_space().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (con_flag_test(con, CON_FLAG_WRITE_PENDING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) if (sk_stream_is_writeable(sk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) dout("%s %p queueing write work\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) dout("%s %p nothing to write\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) /* socket's state has changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) static void ceph_sock_state_change(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct ceph_connection *con = sk->sk_user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) dout("%s %p state = %lu sk_state = %u\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) con, con->state, sk->sk_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) switch (sk->sk_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) case TCP_CLOSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) dout("%s TCP_CLOSE\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) case TCP_CLOSE_WAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) dout("%s TCP_CLOSE_WAIT\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) con_sock_state_closing(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) con_flag_set(con, CON_FLAG_SOCK_CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) case TCP_ESTABLISHED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) dout("%s TCP_ESTABLISHED\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) con_sock_state_connected(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) default: /* Everything else is uninteresting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * set up socket callbacks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) static void set_sock_callbacks(struct socket *sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) sk->sk_user_data = con;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) sk->sk_data_ready = ceph_sock_data_ready;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) sk->sk_write_space = ceph_sock_write_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) sk->sk_state_change = ceph_sock_state_change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) * socket helpers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) * initiate connection to a remote socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) static int ceph_tcp_connect(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) struct sockaddr_storage ss = con->peer_addr.in_addr; /* align */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) struct socket *sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) unsigned int noio_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) BUG_ON(con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) /* sock_create_kern() allocates with GFP_KERNEL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) noio_flag = memalloc_noio_save();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) ret = sock_create_kern(read_pnet(&con->msgr->net), ss.ss_family,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) SOCK_STREAM, IPPROTO_TCP, &sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) memalloc_noio_restore(noio_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) sock->sk->sk_allocation = GFP_NOFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) #ifdef CONFIG_LOCKDEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) lockdep_set_class(&sock->sk->sk_lock, &socket_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) set_sock_callbacks(sock, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) dout("connect %s\n", ceph_pr_addr(&con->peer_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) con_sock_state_connecting(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) ret = sock->ops->connect(sock, (struct sockaddr *)&ss, sizeof(ss),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) O_NONBLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) if (ret == -EINPROGRESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) dout("connect %s EINPROGRESS sk_state = %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) ceph_pr_addr(&con->peer_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) sock->sk->sk_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) } else if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) pr_err("connect %s error %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) ceph_pr_addr(&con->peer_addr), ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) sock_release(sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (ceph_test_opt(from_msgr(con->msgr), TCP_NODELAY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) tcp_sock_set_nodelay(sock->sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) con->sock = sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) * If @buf is NULL, discard up to @len bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) static int ceph_tcp_recvmsg(struct socket *sock, void *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) struct kvec iov = {buf, len};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) msg.msg_flags |= MSG_TRUNC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) iov_iter_kvec(&msg.msg_iter, READ, &iov, 1, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) r = sock_recvmsg(sock, &msg, msg.msg_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) if (r == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) static int ceph_tcp_recvpage(struct socket *sock, struct page *page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) int page_offset, size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) struct bio_vec bvec = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) .bv_page = page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) .bv_offset = page_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) .bv_len = length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) BUG_ON(page_offset + length > PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) iov_iter_bvec(&msg.msg_iter, READ, &bvec, 1, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) r = sock_recvmsg(sock, &msg, msg.msg_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (r == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) * write something. @more is true if caller will be sending more data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) * shortly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) static int ceph_tcp_sendmsg(struct socket *sock, struct kvec *iov,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) size_t kvlen, size_t len, bool more)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) if (more)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) msg.msg_flags |= MSG_MORE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) msg.msg_flags |= MSG_EOR; /* superfluous, but what the hell */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) r = kernel_sendmsg(sock, &msg, iov, kvlen, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) if (r == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * @more: either or both of MSG_MORE and MSG_SENDPAGE_NOTLAST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) int offset, size_t size, int more)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) ssize_t (*sendpage)(struct socket *sock, struct page *page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) int offset, size_t size, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) int flags = MSG_DONTWAIT | MSG_NOSIGNAL | more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) * sendpage cannot properly handle pages with page_count == 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * we need to fall back to sendmsg if that's the case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) * Same goes for slab pages: skb_can_coalesce() allows
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) * coalescing neighboring slab objects into a single frag which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) * triggers one of hardened usercopy checks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) if (sendpage_ok(page))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) sendpage = sock->ops->sendpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) sendpage = sock_no_sendpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) ret = sendpage(sock, page, offset, size, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) if (ret == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) * Shutdown/close the socket for the given connection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) static int con_close_socket(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) dout("con_close_socket on %p sock %p\n", con, con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) if (con->sock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) rc = con->sock->ops->shutdown(con->sock, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) sock_release(con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) con->sock = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) * Forcibly clear the SOCK_CLOSED flag. It gets set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * independent of the connection mutex, and we could have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) * received a socket close event before we had the chance to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) * shut the socket down.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) con_flag_clear(con, CON_FLAG_SOCK_CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) con_sock_state_closed(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) * Reset a connection. Discard all incoming and outgoing messages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) * and clear *_seq state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) static void ceph_msg_remove(struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) list_del_init(&msg->list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) ceph_msg_put(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) static void ceph_msg_remove_list(struct list_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) while (!list_empty(head)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) struct ceph_msg *msg = list_first_entry(head, struct ceph_msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) ceph_msg_remove(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) static void reset_connection(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) /* reset connection, out_queue, msg_ and connect_seq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /* discard existing out_queue and msg_seq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) dout("reset_connection %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) ceph_msg_remove_list(&con->out_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) ceph_msg_remove_list(&con->out_sent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (con->in_msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) BUG_ON(con->in_msg->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) ceph_msg_put(con->in_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) con->in_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) con->connect_seq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) con->out_seq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) if (con->out_msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) BUG_ON(con->out_msg->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) ceph_msg_put(con->out_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) con->out_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) con->in_seq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) con->in_seq_acked = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) con->out_skip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) * mark a peer down. drop any open connections.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) void ceph_con_close(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) dout("con_close %p peer %s\n", con, ceph_pr_addr(&con->peer_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) con->state = CON_STATE_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) con_flag_clear(con, CON_FLAG_LOSSYTX); /* so we retry next connect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) con_flag_clear(con, CON_FLAG_KEEPALIVE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) con_flag_clear(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) con_flag_clear(con, CON_FLAG_BACKOFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) reset_connection(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) con->peer_global_seq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) cancel_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) con_close_socket(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) EXPORT_SYMBOL(ceph_con_close);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) * Reopen a closed connection, with a new peer address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) void ceph_con_open(struct ceph_connection *con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) __u8 entity_type, __u64 entity_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) struct ceph_entity_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) dout("con_open %p %s\n", con, ceph_pr_addr(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) WARN_ON(con->state != CON_STATE_CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) con->state = CON_STATE_PREOPEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) con->peer_name.type = (__u8) entity_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) con->peer_name.num = cpu_to_le64(entity_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) memcpy(&con->peer_addr, addr, sizeof(*addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) con->delay = 0; /* reset backoff memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) EXPORT_SYMBOL(ceph_con_open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) * return true if this connection ever successfully opened
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) bool ceph_con_opened(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) return con->connect_seq > 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) * initialize a new connection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) void ceph_con_init(struct ceph_connection *con, void *private,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) const struct ceph_connection_operations *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) struct ceph_messenger *msgr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) dout("con_init %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) memset(con, 0, sizeof(*con));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) con->private = private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) con->ops = ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) con->msgr = msgr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) con_sock_state_init(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) mutex_init(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) INIT_LIST_HEAD(&con->out_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) INIT_LIST_HEAD(&con->out_sent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) INIT_DELAYED_WORK(&con->work, ceph_con_workfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) con->state = CON_STATE_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) EXPORT_SYMBOL(ceph_con_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * We maintain a global counter to order connection attempts. Get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * a unique seq greater than @gt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) static u32 get_global_seq(struct ceph_messenger *msgr, u32 gt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) spin_lock(&msgr->global_seq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) if (msgr->global_seq < gt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) msgr->global_seq = gt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) ret = ++msgr->global_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) spin_unlock(&msgr->global_seq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) static void con_out_kvec_reset(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) BUG_ON(con->out_skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) con->out_kvec_left = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) con->out_kvec_bytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) con->out_kvec_cur = &con->out_kvec[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) static void con_out_kvec_add(struct ceph_connection *con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) size_t size, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) int index = con->out_kvec_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) BUG_ON(con->out_skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) BUG_ON(index >= ARRAY_SIZE(con->out_kvec));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) con->out_kvec[index].iov_len = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) con->out_kvec[index].iov_base = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) con->out_kvec_left++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) con->out_kvec_bytes += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) * Chop off a kvec from the end. Return residual number of bytes for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) * that kvec, i.e. how many bytes would have been written if the kvec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) * hadn't been nuked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) static int con_out_kvec_skip(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) int off = con->out_kvec_cur - con->out_kvec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) int skip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) if (con->out_kvec_bytes > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) skip = con->out_kvec[off + con->out_kvec_left - 1].iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) BUG_ON(con->out_kvec_bytes < skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) BUG_ON(!con->out_kvec_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) con->out_kvec_bytes -= skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) con->out_kvec_left--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) return skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) #ifdef CONFIG_BLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) * For a bio data item, a piece is whatever remains of the next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) * entry in the current bio iovec, or the first entry in the next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) * bio in the list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) static void ceph_msg_data_bio_cursor_init(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) struct ceph_msg_data *data = cursor->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) struct ceph_bio_iter *it = &cursor->bio_iter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) cursor->resid = min_t(size_t, length, data->bio_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) *it = data->bio_pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) if (cursor->resid < it->iter.bi_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) it->iter.bi_size = cursor->resid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) BUG_ON(cursor->resid < bio_iter_len(it->bio, it->iter));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) cursor->last_piece = cursor->resid == bio_iter_len(it->bio, it->iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) static struct page *ceph_msg_data_bio_next(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) size_t *page_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) size_t *length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) struct bio_vec bv = bio_iter_iovec(cursor->bio_iter.bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) cursor->bio_iter.iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) *page_offset = bv.bv_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) *length = bv.bv_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) return bv.bv_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) static bool ceph_msg_data_bio_advance(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) struct ceph_bio_iter *it = &cursor->bio_iter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) struct page *page = bio_iter_page(it->bio, it->iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) BUG_ON(bytes > cursor->resid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) BUG_ON(bytes > bio_iter_len(it->bio, it->iter));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) cursor->resid -= bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) bio_advance_iter(it->bio, &it->iter, bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) if (!cursor->resid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) BUG_ON(!cursor->last_piece);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) return false; /* no more data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) if (!bytes || (it->iter.bi_size && it->iter.bi_bvec_done &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) page == bio_iter_page(it->bio, it->iter)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) return false; /* more bytes to process in this segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) if (!it->iter.bi_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) it->bio = it->bio->bi_next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) it->iter = it->bio->bi_iter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) if (cursor->resid < it->iter.bi_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) it->iter.bi_size = cursor->resid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) BUG_ON(cursor->last_piece);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) BUG_ON(cursor->resid < bio_iter_len(it->bio, it->iter));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) cursor->last_piece = cursor->resid == bio_iter_len(it->bio, it->iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) #endif /* CONFIG_BLOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) static void ceph_msg_data_bvecs_cursor_init(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) struct ceph_msg_data *data = cursor->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) struct bio_vec *bvecs = data->bvec_pos.bvecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) cursor->resid = min_t(size_t, length, data->bvec_pos.iter.bi_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) cursor->bvec_iter = data->bvec_pos.iter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) cursor->bvec_iter.bi_size = cursor->resid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) BUG_ON(cursor->resid < bvec_iter_len(bvecs, cursor->bvec_iter));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) cursor->last_piece =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) cursor->resid == bvec_iter_len(bvecs, cursor->bvec_iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) static struct page *ceph_msg_data_bvecs_next(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) size_t *page_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) size_t *length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) struct bio_vec bv = bvec_iter_bvec(cursor->data->bvec_pos.bvecs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) cursor->bvec_iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) *page_offset = bv.bv_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) *length = bv.bv_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return bv.bv_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) static bool ceph_msg_data_bvecs_advance(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct bio_vec *bvecs = cursor->data->bvec_pos.bvecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) struct page *page = bvec_iter_page(bvecs, cursor->bvec_iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) BUG_ON(bytes > cursor->resid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) BUG_ON(bytes > bvec_iter_len(bvecs, cursor->bvec_iter));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) cursor->resid -= bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) bvec_iter_advance(bvecs, &cursor->bvec_iter, bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) if (!cursor->resid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) BUG_ON(!cursor->last_piece);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) return false; /* no more data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) if (!bytes || (cursor->bvec_iter.bi_bvec_done &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) page == bvec_iter_page(bvecs, cursor->bvec_iter)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) return false; /* more bytes to process in this segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) BUG_ON(cursor->last_piece);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) BUG_ON(cursor->resid < bvec_iter_len(bvecs, cursor->bvec_iter));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) cursor->last_piece =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) cursor->resid == bvec_iter_len(bvecs, cursor->bvec_iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) * For a page array, a piece comes from the first page in the array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) * that has not already been fully consumed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) static void ceph_msg_data_pages_cursor_init(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) struct ceph_msg_data *data = cursor->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) int page_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) BUG_ON(data->type != CEPH_MSG_DATA_PAGES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) BUG_ON(!data->pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) BUG_ON(!data->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) cursor->resid = min(length, data->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) page_count = calc_pages_for(data->alignment, (u64)data->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) cursor->page_offset = data->alignment & ~PAGE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) cursor->page_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) BUG_ON(page_count > (int)USHRT_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) cursor->page_count = (unsigned short)page_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) BUG_ON(length > SIZE_MAX - cursor->page_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) cursor->last_piece = cursor->page_offset + cursor->resid <= PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) static struct page *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) ceph_msg_data_pages_next(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) size_t *page_offset, size_t *length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) struct ceph_msg_data *data = cursor->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) BUG_ON(data->type != CEPH_MSG_DATA_PAGES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) BUG_ON(cursor->page_index >= cursor->page_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) BUG_ON(cursor->page_offset >= PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) *page_offset = cursor->page_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) if (cursor->last_piece)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) *length = cursor->resid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) *length = PAGE_SIZE - *page_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return data->pages[cursor->page_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) static bool ceph_msg_data_pages_advance(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) BUG_ON(cursor->data->type != CEPH_MSG_DATA_PAGES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) BUG_ON(cursor->page_offset + bytes > PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) /* Advance the cursor page offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) cursor->resid -= bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) cursor->page_offset = (cursor->page_offset + bytes) & ~PAGE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) if (!bytes || cursor->page_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) return false; /* more bytes to process in the current page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) if (!cursor->resid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) return false; /* no more data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) /* Move on to the next page; offset is already at 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) BUG_ON(cursor->page_index >= cursor->page_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) cursor->page_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) cursor->last_piece = cursor->resid <= PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) * For a pagelist, a piece is whatever remains to be consumed in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) * first page in the list, or the front of the next page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) ceph_msg_data_pagelist_cursor_init(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) struct ceph_msg_data *data = cursor->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) struct ceph_pagelist *pagelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) BUG_ON(data->type != CEPH_MSG_DATA_PAGELIST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) pagelist = data->pagelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) BUG_ON(!pagelist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) if (!length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) return; /* pagelist can be assigned but empty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) BUG_ON(list_empty(&pagelist->head));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) page = list_first_entry(&pagelist->head, struct page, lru);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) cursor->resid = min(length, pagelist->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) cursor->page = page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) cursor->offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) cursor->last_piece = cursor->resid <= PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) static struct page *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) ceph_msg_data_pagelist_next(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) size_t *page_offset, size_t *length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) struct ceph_msg_data *data = cursor->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) struct ceph_pagelist *pagelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) BUG_ON(data->type != CEPH_MSG_DATA_PAGELIST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) pagelist = data->pagelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) BUG_ON(!pagelist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) BUG_ON(!cursor->page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) BUG_ON(cursor->offset + cursor->resid != pagelist->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) /* offset of first page in pagelist is always 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) *page_offset = cursor->offset & ~PAGE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) if (cursor->last_piece)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) *length = cursor->resid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) *length = PAGE_SIZE - *page_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) return cursor->page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) static bool ceph_msg_data_pagelist_advance(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) struct ceph_msg_data *data = cursor->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) struct ceph_pagelist *pagelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) BUG_ON(data->type != CEPH_MSG_DATA_PAGELIST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) pagelist = data->pagelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) BUG_ON(!pagelist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) BUG_ON(cursor->offset + cursor->resid != pagelist->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) BUG_ON((cursor->offset & ~PAGE_MASK) + bytes > PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) /* Advance the cursor offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) cursor->resid -= bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) cursor->offset += bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) /* offset of first page in pagelist is always 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) if (!bytes || cursor->offset & ~PAGE_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) return false; /* more bytes to process in the current page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) if (!cursor->resid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) return false; /* no more data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /* Move on to the next page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) BUG_ON(list_is_last(&cursor->page->lru, &pagelist->head));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) cursor->page = list_next_entry(cursor->page, lru);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) cursor->last_piece = cursor->resid <= PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) * Message data is handled (sent or received) in pieces, where each
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) * piece resides on a single page. The network layer might not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) * consume an entire piece at once. A data item's cursor keeps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) * track of which piece is next to process and how much remains to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) * be processed in that piece. It also tracks whether the current
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) * piece is the last one in the data item.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) static void __ceph_msg_data_cursor_init(struct ceph_msg_data_cursor *cursor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) size_t length = cursor->total_resid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) switch (cursor->data->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) case CEPH_MSG_DATA_PAGELIST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) ceph_msg_data_pagelist_cursor_init(cursor, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) case CEPH_MSG_DATA_PAGES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) ceph_msg_data_pages_cursor_init(cursor, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) #ifdef CONFIG_BLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) case CEPH_MSG_DATA_BIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) ceph_msg_data_bio_cursor_init(cursor, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) #endif /* CONFIG_BLOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) case CEPH_MSG_DATA_BVECS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) ceph_msg_data_bvecs_cursor_init(cursor, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) case CEPH_MSG_DATA_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) /* BUG(); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) cursor->need_crc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) static void ceph_msg_data_cursor_init(struct ceph_msg *msg, size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) struct ceph_msg_data_cursor *cursor = &msg->cursor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) BUG_ON(!length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) BUG_ON(length > msg->data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) BUG_ON(!msg->num_data_items);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) cursor->total_resid = length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) cursor->data = msg->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) __ceph_msg_data_cursor_init(cursor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) * Return the page containing the next piece to process for a given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) * data item, and supply the page offset and length of that piece.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) * Indicate whether this is the last piece in this data item.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) static struct page *ceph_msg_data_next(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) size_t *page_offset, size_t *length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) bool *last_piece)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) switch (cursor->data->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) case CEPH_MSG_DATA_PAGELIST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) page = ceph_msg_data_pagelist_next(cursor, page_offset, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) case CEPH_MSG_DATA_PAGES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) page = ceph_msg_data_pages_next(cursor, page_offset, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) #ifdef CONFIG_BLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) case CEPH_MSG_DATA_BIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) page = ceph_msg_data_bio_next(cursor, page_offset, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) #endif /* CONFIG_BLOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) case CEPH_MSG_DATA_BVECS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) page = ceph_msg_data_bvecs_next(cursor, page_offset, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) case CEPH_MSG_DATA_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) page = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) BUG_ON(!page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) BUG_ON(*page_offset + *length > PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) BUG_ON(!*length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) BUG_ON(*length > cursor->resid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) if (last_piece)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) *last_piece = cursor->last_piece;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) return page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) * Returns true if the result moves the cursor on to the next piece
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) * of the data item.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) static void ceph_msg_data_advance(struct ceph_msg_data_cursor *cursor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) bool new_piece;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) BUG_ON(bytes > cursor->resid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) switch (cursor->data->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) case CEPH_MSG_DATA_PAGELIST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) new_piece = ceph_msg_data_pagelist_advance(cursor, bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) case CEPH_MSG_DATA_PAGES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) new_piece = ceph_msg_data_pages_advance(cursor, bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) #ifdef CONFIG_BLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) case CEPH_MSG_DATA_BIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) new_piece = ceph_msg_data_bio_advance(cursor, bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) #endif /* CONFIG_BLOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) case CEPH_MSG_DATA_BVECS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) new_piece = ceph_msg_data_bvecs_advance(cursor, bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) case CEPH_MSG_DATA_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) cursor->total_resid -= bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) if (!cursor->resid && cursor->total_resid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) WARN_ON(!cursor->last_piece);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) cursor->data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) __ceph_msg_data_cursor_init(cursor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) new_piece = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) cursor->need_crc = new_piece;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) static size_t sizeof_footer(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) return (con->peer_features & CEPH_FEATURE_MSG_AUTH) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) sizeof(struct ceph_msg_footer) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) sizeof(struct ceph_msg_footer_old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) static void prepare_message_data(struct ceph_msg *msg, u32 data_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) /* Initialize data cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) ceph_msg_data_cursor_init(msg, (size_t)data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) * Prepare footer for currently outgoing message, and finish things
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * off. Assumes out_kvec* are already valid.. we just add on to the end.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) static void prepare_write_message_footer(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) struct ceph_msg *m = con->out_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) m->footer.flags |= CEPH_MSG_FOOTER_COMPLETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) dout("prepare_write_message_footer %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) con_out_kvec_add(con, sizeof_footer(con), &m->footer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) if (con->peer_features & CEPH_FEATURE_MSG_AUTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (con->ops->sign_message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) con->ops->sign_message(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) m->footer.sig = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) m->old_footer.flags = m->footer.flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) con->out_more = m->more_to_follow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) con->out_msg_done = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) * Prepare headers for the next outgoing message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) static void prepare_write_message(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) struct ceph_msg *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) u32 crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) con->out_msg_done = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) /* Sneak an ack in there first? If we can get it into the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) * TCP packet that's a good thing. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) if (con->in_seq > con->in_seq_acked) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) con->in_seq_acked = con->in_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) con_out_kvec_add(con, sizeof (tag_ack), &tag_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) con->out_temp_ack = cpu_to_le64(con->in_seq_acked);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) con_out_kvec_add(con, sizeof (con->out_temp_ack),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) &con->out_temp_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) BUG_ON(list_empty(&con->out_queue));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) m = list_first_entry(&con->out_queue, struct ceph_msg, list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) con->out_msg = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) BUG_ON(m->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) /* put message on sent list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) ceph_msg_get(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) list_move_tail(&m->list_head, &con->out_sent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) * only assign outgoing seq # if we haven't sent this message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) * yet. if it is requeued, resend with it's original seq.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) if (m->needs_out_seq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) m->hdr.seq = cpu_to_le64(++con->out_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) m->needs_out_seq = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) if (con->ops->reencode_message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) con->ops->reencode_message(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) dout("prepare_write_message %p seq %lld type %d len %d+%d+%zd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) m, con->out_seq, le16_to_cpu(m->hdr.type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) le32_to_cpu(m->hdr.front_len), le32_to_cpu(m->hdr.middle_len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) m->data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) WARN_ON(m->front.iov_len != le32_to_cpu(m->hdr.front_len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) WARN_ON(m->data_length != le32_to_cpu(m->hdr.data_len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) /* tag + hdr + front + middle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) con_out_kvec_add(con, sizeof (tag_msg), &tag_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) con_out_kvec_add(con, sizeof(con->out_hdr), &con->out_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) con_out_kvec_add(con, m->front.iov_len, m->front.iov_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) if (m->middle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) con_out_kvec_add(con, m->middle->vec.iov_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) m->middle->vec.iov_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) /* fill in hdr crc and finalize hdr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) crc = crc32c(0, &m->hdr, offsetof(struct ceph_msg_header, crc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) con->out_msg->hdr.crc = cpu_to_le32(crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) memcpy(&con->out_hdr, &con->out_msg->hdr, sizeof(con->out_hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) /* fill in front and middle crc, footer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) crc = crc32c(0, m->front.iov_base, m->front.iov_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) con->out_msg->footer.front_crc = cpu_to_le32(crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) if (m->middle) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) crc = crc32c(0, m->middle->vec.iov_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) m->middle->vec.iov_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) con->out_msg->footer.middle_crc = cpu_to_le32(crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) con->out_msg->footer.middle_crc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) dout("%s front_crc %u middle_crc %u\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) le32_to_cpu(con->out_msg->footer.front_crc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) le32_to_cpu(con->out_msg->footer.middle_crc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) con->out_msg->footer.flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) /* is there a data payload? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) con->out_msg->footer.data_crc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) if (m->data_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) prepare_message_data(con->out_msg, m->data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) con->out_more = 1; /* data + footer will follow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) /* no, queue up footer too and be done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) prepare_write_message_footer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) con_flag_set(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) * Prepare an ack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) static void prepare_write_ack(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) dout("prepare_write_ack %p %llu -> %llu\n", con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) con->in_seq_acked, con->in_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) con->in_seq_acked = con->in_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) con_out_kvec_add(con, sizeof (tag_ack), &tag_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) con->out_temp_ack = cpu_to_le64(con->in_seq_acked);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) con_out_kvec_add(con, sizeof (con->out_temp_ack),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) &con->out_temp_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) con->out_more = 1; /* more will follow.. eventually.. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) con_flag_set(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) * Prepare to share the seq during handshake
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) static void prepare_write_seq(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) dout("prepare_write_seq %p %llu -> %llu\n", con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) con->in_seq_acked, con->in_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) con->in_seq_acked = con->in_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) con->out_temp_ack = cpu_to_le64(con->in_seq_acked);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) con_out_kvec_add(con, sizeof (con->out_temp_ack),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) &con->out_temp_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) con_flag_set(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) * Prepare to write keepalive byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) static void prepare_write_keepalive(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) dout("prepare_write_keepalive %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) if (con->peer_features & CEPH_FEATURE_MSGR_KEEPALIVE2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) struct timespec64 now;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) ktime_get_real_ts64(&now);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) con_out_kvec_add(con, sizeof(tag_keepalive2), &tag_keepalive2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) ceph_encode_timespec64(&con->out_temp_keepalive2, &now);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) con_out_kvec_add(con, sizeof(con->out_temp_keepalive2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) &con->out_temp_keepalive2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) con_out_kvec_add(con, sizeof(tag_keepalive), &tag_keepalive);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) con_flag_set(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) * Connection negotiation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) static int get_connect_authorizer(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) struct ceph_auth_handshake *auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) int auth_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) if (!con->ops->get_authorizer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) con->auth = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) con->out_connect.authorizer_protocol = CEPH_AUTH_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) con->out_connect.authorizer_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) auth = con->ops->get_authorizer(con, &auth_proto, con->auth_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) if (IS_ERR(auth))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) return PTR_ERR(auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) con->auth = auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) con->out_connect.authorizer_protocol = cpu_to_le32(auth_proto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) con->out_connect.authorizer_len = cpu_to_le32(auth->authorizer_buf_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) * We connected to a peer and are saying hello.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) static void prepare_write_banner(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) con_out_kvec_add(con, strlen(CEPH_BANNER), CEPH_BANNER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) con_out_kvec_add(con, sizeof (con->msgr->my_enc_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) &con->msgr->my_enc_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) con->out_more = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) con_flag_set(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) static void __prepare_write_connect(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) con_out_kvec_add(con, sizeof(con->out_connect), &con->out_connect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) if (con->auth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) con_out_kvec_add(con, con->auth->authorizer_buf_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) con->auth->authorizer_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) con->out_more = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) con_flag_set(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) static int prepare_write_connect(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) unsigned int global_seq = get_global_seq(con->msgr, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) int proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) switch (con->peer_name.type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) case CEPH_ENTITY_TYPE_MON:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) proto = CEPH_MONC_PROTOCOL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) case CEPH_ENTITY_TYPE_OSD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) proto = CEPH_OSDC_PROTOCOL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) case CEPH_ENTITY_TYPE_MDS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) proto = CEPH_MDSC_PROTOCOL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) dout("prepare_write_connect %p cseq=%d gseq=%d proto=%d\n", con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) con->connect_seq, global_seq, proto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) con->out_connect.features =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) cpu_to_le64(from_msgr(con->msgr)->supported_features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) con->out_connect.host_type = cpu_to_le32(CEPH_ENTITY_TYPE_CLIENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) con->out_connect.connect_seq = cpu_to_le32(con->connect_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) con->out_connect.global_seq = cpu_to_le32(global_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) con->out_connect.protocol_version = cpu_to_le32(proto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) con->out_connect.flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) ret = get_connect_authorizer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) __prepare_write_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) * write as much of pending kvecs to the socket as we can.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) * 1 -> done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) * 0 -> socket full, but more to do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) * <0 -> error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) static int write_partial_kvec(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) dout("write_partial_kvec %p %d left\n", con, con->out_kvec_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) while (con->out_kvec_bytes > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) ret = ceph_tcp_sendmsg(con->sock, con->out_kvec_cur,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) con->out_kvec_left, con->out_kvec_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) con->out_more);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) con->out_kvec_bytes -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) if (con->out_kvec_bytes == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) break; /* done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) /* account for full iov entries consumed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) while (ret >= con->out_kvec_cur->iov_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) BUG_ON(!con->out_kvec_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) ret -= con->out_kvec_cur->iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) con->out_kvec_cur++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) con->out_kvec_left--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) /* and for a partially-consumed entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) con->out_kvec_cur->iov_len -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) con->out_kvec_cur->iov_base += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) con->out_kvec_left = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) dout("write_partial_kvec %p %d left in %d kvecs ret = %d\n", con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) con->out_kvec_bytes, con->out_kvec_left, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) return ret; /* done! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) static u32 ceph_crc32c_page(u32 crc, struct page *page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) unsigned int page_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) unsigned int length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) char *kaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) kaddr = kmap(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) BUG_ON(kaddr == NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) crc = crc32c(crc, kaddr + page_offset, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) kunmap(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) return crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) * Write as much message data payload as we can. If we finish, queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) * up the footer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) * 1 -> done, footer is now queued in out_kvec[].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) * 0 -> socket full, but more to do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) * <0 -> error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static int write_partial_message_data(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) struct ceph_msg *msg = con->out_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) struct ceph_msg_data_cursor *cursor = &msg->cursor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) bool do_datacrc = !ceph_test_opt(from_msgr(con->msgr), NOCRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) int more = MSG_MORE | MSG_SENDPAGE_NOTLAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) u32 crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) dout("%s %p msg %p\n", __func__, con, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) if (!msg->num_data_items)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) * Iterate through each page that contains data to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) * written, and send as much as possible for each.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) * If we are calculating the data crc (the default), we will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) * need to map the page. If we have no pages, they have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) * been revoked, so use the zero page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) crc = do_datacrc ? le32_to_cpu(msg->footer.data_crc) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) while (cursor->total_resid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) size_t page_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) size_t length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) if (!cursor->resid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) ceph_msg_data_advance(cursor, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) page = ceph_msg_data_next(cursor, &page_offset, &length, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) if (length == cursor->total_resid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) more = MSG_MORE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) ret = ceph_tcp_sendpage(con->sock, page, page_offset, length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) more);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) if (ret <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) if (do_datacrc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) msg->footer.data_crc = cpu_to_le32(crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) if (do_datacrc && cursor->need_crc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) crc = ceph_crc32c_page(crc, page, page_offset, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) ceph_msg_data_advance(cursor, (size_t)ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) dout("%s %p msg %p done\n", __func__, con, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) /* prepare and queue up footer, too */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) if (do_datacrc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) msg->footer.data_crc = cpu_to_le32(crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) msg->footer.flags |= CEPH_MSG_FOOTER_NOCRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) prepare_write_message_footer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) return 1; /* must return > 0 to indicate success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) * write some zeros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) static int write_partial_skip(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) int more = MSG_MORE | MSG_SENDPAGE_NOTLAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) dout("%s %p %d left\n", __func__, con, con->out_skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) while (con->out_skip > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) size_t size = min(con->out_skip, (int) PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) if (size == con->out_skip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) more = MSG_MORE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) ret = ceph_tcp_sendpage(con->sock, zero_page, 0, size, more);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) con->out_skip -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) * Prepare to read connection handshake, or an ack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) static void prepare_read_banner(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) dout("prepare_read_banner %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) con->in_base_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) static void prepare_read_connect(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) dout("prepare_read_connect %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) con->in_base_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) static void prepare_read_ack(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) dout("prepare_read_ack %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) con->in_base_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) static void prepare_read_seq(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) dout("prepare_read_seq %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) con->in_base_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) con->in_tag = CEPH_MSGR_TAG_SEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) static void prepare_read_tag(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) dout("prepare_read_tag %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) con->in_base_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) con->in_tag = CEPH_MSGR_TAG_READY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) static void prepare_read_keepalive_ack(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) dout("prepare_read_keepalive_ack %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) con->in_base_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) * Prepare to read a message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) static int prepare_read_message(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) dout("prepare_read_message %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) BUG_ON(con->in_msg != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) con->in_base_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) con->in_front_crc = con->in_middle_crc = con->in_data_crc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) static int read_partial(struct ceph_connection *con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) int end, int size, void *object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) while (con->in_base_pos < end) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) int left = end - con->in_base_pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) int have = size - left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) int ret = ceph_tcp_recvmsg(con->sock, object + have, left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) con->in_base_pos += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) * Read all or part of the connect-side handshake on a new connection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) static int read_partial_banner(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) int end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) dout("read_partial_banner %p at %d\n", con, con->in_base_pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) /* peer's banner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) size = strlen(CEPH_BANNER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) end = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) ret = read_partial(con, end, size, con->in_banner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) size = sizeof (con->actual_peer_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) end += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) ret = read_partial(con, end, size, &con->actual_peer_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) ceph_decode_banner_addr(&con->actual_peer_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) size = sizeof (con->peer_addr_for_me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) end += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) ret = read_partial(con, end, size, &con->peer_addr_for_me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) ceph_decode_banner_addr(&con->peer_addr_for_me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) static int read_partial_connect(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) int end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) dout("read_partial_connect %p at %d\n", con, con->in_base_pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) size = sizeof (con->in_reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) end = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) ret = read_partial(con, end, size, &con->in_reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) if (con->auth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) size = le32_to_cpu(con->in_reply.authorizer_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) if (size > con->auth->authorizer_reply_buf_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) pr_err("authorizer reply too big: %d > %zu\n", size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) con->auth->authorizer_reply_buf_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) end += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) ret = read_partial(con, end, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) con->auth->authorizer_reply_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) dout("read_partial_connect %p tag %d, con_seq = %u, g_seq = %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) con, (int)con->in_reply.tag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) le32_to_cpu(con->in_reply.connect_seq),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) le32_to_cpu(con->in_reply.global_seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) * Verify the hello banner looks okay.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) static int verify_hello(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) if (memcmp(con->in_banner, CEPH_BANNER, strlen(CEPH_BANNER))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) pr_err("connect to %s got bad banner\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) ceph_pr_addr(&con->peer_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) con->error_msg = "protocol error, bad banner";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) static bool addr_is_blank(struct ceph_entity_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) struct sockaddr_storage ss = addr->in_addr; /* align */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) struct in_addr *addr4 = &((struct sockaddr_in *)&ss)->sin_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) struct in6_addr *addr6 = &((struct sockaddr_in6 *)&ss)->sin6_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) switch (ss.ss_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) case AF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) return addr4->s_addr == htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) case AF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) return ipv6_addr_any(addr6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) static int addr_port(struct ceph_entity_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) switch (get_unaligned(&addr->in_addr.ss_family)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) case AF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) return ntohs(get_unaligned(&((struct sockaddr_in *)&addr->in_addr)->sin_port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) case AF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) return ntohs(get_unaligned(&((struct sockaddr_in6 *)&addr->in_addr)->sin6_port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) static void addr_set_port(struct ceph_entity_addr *addr, int p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) switch (get_unaligned(&addr->in_addr.ss_family)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) case AF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) put_unaligned(htons(p), &((struct sockaddr_in *)&addr->in_addr)->sin_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) case AF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) put_unaligned(htons(p), &((struct sockaddr_in6 *)&addr->in_addr)->sin6_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) * Unlike other *_pton function semantics, zero indicates success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) static int ceph_pton(const char *str, size_t len, struct ceph_entity_addr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) char delim, const char **ipend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) memset(&addr->in_addr, 0, sizeof(addr->in_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) if (in4_pton(str, len, (u8 *)&((struct sockaddr_in *)&addr->in_addr)->sin_addr.s_addr, delim, ipend)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) put_unaligned(AF_INET, &addr->in_addr.ss_family);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) if (in6_pton(str, len, (u8 *)&((struct sockaddr_in6 *)&addr->in_addr)->sin6_addr.s6_addr, delim, ipend)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) put_unaligned(AF_INET6, &addr->in_addr.ss_family);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) * Extract hostname string and resolve using kernel DNS facility.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) #ifdef CONFIG_CEPH_LIB_USE_DNS_RESOLVER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) static int ceph_dns_resolve_name(const char *name, size_t namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) struct ceph_entity_addr *addr, char delim, const char **ipend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) const char *end, *delim_p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) char *colon_p, *ip_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) int ip_len, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) * The end of the hostname occurs immediately preceding the delimiter or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) * the port marker (':') where the delimiter takes precedence.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) delim_p = memchr(name, delim, namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) colon_p = memchr(name, ':', namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) if (delim_p && colon_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) end = delim_p < colon_p ? delim_p : colon_p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) else if (!delim_p && colon_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) end = colon_p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) end = delim_p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) if (!end) /* case: hostname:/ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) end = name + namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) if (end <= name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) /* do dns_resolve upcall */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) ip_len = dns_query(current->nsproxy->net_ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) NULL, name, end - name, NULL, &ip_addr, NULL, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) if (ip_len > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) ret = ceph_pton(ip_addr, ip_len, addr, -1, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) ret = -ESRCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) kfree(ip_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) *ipend = end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) pr_info("resolve '%.*s' (ret=%d): %s\n", (int)(end - name), name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) ret, ret ? "failed" : ceph_pr_addr(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) static inline int ceph_dns_resolve_name(const char *name, size_t namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) struct ceph_entity_addr *addr, char delim, const char **ipend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) * Parse a server name (IP or hostname). If a valid IP address is not found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) * then try to extract a hostname to resolve using userspace DNS upcall.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) static int ceph_parse_server_name(const char *name, size_t namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) struct ceph_entity_addr *addr, char delim, const char **ipend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) ret = ceph_pton(name, namelen, addr, delim, ipend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) ret = ceph_dns_resolve_name(name, namelen, addr, delim, ipend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) * Parse an ip[:port] list into an addr array. Use the default
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) * monitor port if a port isn't specified.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) int ceph_parse_ips(const char *c, const char *end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) struct ceph_entity_addr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) int max_count, int *count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) int i, ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) const char *p = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) dout("parse_ips on '%.*s'\n", (int)(end-c), c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) for (i = 0; i < max_count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) const char *ipend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) int port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) char delim = ',';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) if (*p == '[') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) delim = ']';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) ret = ceph_parse_server_name(p, end - p, &addr[i], delim, &ipend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) goto bad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) p = ipend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) if (delim == ']') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) if (*p != ']') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) dout("missing matching ']'\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) goto bad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) /* port? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) if (p < end && *p == ':') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) while (p < end && *p >= '0' && *p <= '9') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) port = (port * 10) + (*p - '0');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) if (port == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) port = CEPH_MON_PORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) else if (port > 65535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) goto bad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) port = CEPH_MON_PORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) addr_set_port(&addr[i], port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) addr[i].type = CEPH_ENTITY_ADDR_TYPE_LEGACY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) dout("parse_ips got %s\n", ceph_pr_addr(&addr[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) if (p == end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) if (*p != ',')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) goto bad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) if (p != end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) goto bad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) if (count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) *count = i + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) bad:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) static int process_banner(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) dout("process_banner on %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) if (verify_hello(con) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) * Make sure the other end is who we wanted. note that the other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) * end may not yet know their ip address, so if it's 0.0.0.0, give
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) * them the benefit of the doubt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) if (memcmp(&con->peer_addr, &con->actual_peer_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) sizeof(con->peer_addr)) != 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) !(addr_is_blank(&con->actual_peer_addr) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) con->actual_peer_addr.nonce == con->peer_addr.nonce)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) pr_warn("wrong peer, want %s/%u, got %s/%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) ceph_pr_addr(&con->peer_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) le32_to_cpu(con->peer_addr.nonce),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) ceph_pr_addr(&con->actual_peer_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) le32_to_cpu(con->actual_peer_addr.nonce));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) con->error_msg = "wrong peer at address";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) * did we learn our address?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) if (addr_is_blank(&con->msgr->inst.addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) int port = addr_port(&con->msgr->inst.addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) memcpy(&con->msgr->inst.addr.in_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) &con->peer_addr_for_me.in_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) sizeof(con->peer_addr_for_me.in_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) addr_set_port(&con->msgr->inst.addr, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) encode_my_addr(con->msgr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) dout("process_banner learned my addr is %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) ceph_pr_addr(&con->msgr->inst.addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) static int process_connect(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) u64 sup_feat = from_msgr(con->msgr)->supported_features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) u64 req_feat = from_msgr(con->msgr)->required_features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) u64 server_feat = le64_to_cpu(con->in_reply.features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) dout("process_connect on %p tag %d\n", con, (int)con->in_tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) if (con->auth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) int len = le32_to_cpu(con->in_reply.authorizer_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) * Any connection that defines ->get_authorizer()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) * should also define ->add_authorizer_challenge() and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) * ->verify_authorizer_reply().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) * See get_connect_authorizer().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) if (con->in_reply.tag == CEPH_MSGR_TAG_CHALLENGE_AUTHORIZER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) ret = con->ops->add_authorizer_challenge(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) con, con->auth->authorizer_reply_buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) __prepare_write_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) prepare_read_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) if (len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) ret = con->ops->verify_authorizer_reply(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) con->error_msg = "bad authorize reply";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) switch (con->in_reply.tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) case CEPH_MSGR_TAG_FEATURES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) pr_err("%s%lld %s feature set mismatch,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) " my %llx < server's %llx, missing %llx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) ENTITY_NAME(con->peer_name),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) ceph_pr_addr(&con->peer_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) sup_feat, server_feat, server_feat & ~sup_feat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) con->error_msg = "missing required protocol features";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) reset_connection(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) case CEPH_MSGR_TAG_BADPROTOVER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) pr_err("%s%lld %s protocol version mismatch,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) " my %d != server's %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) ENTITY_NAME(con->peer_name),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) ceph_pr_addr(&con->peer_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) le32_to_cpu(con->out_connect.protocol_version),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) le32_to_cpu(con->in_reply.protocol_version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) con->error_msg = "protocol version mismatch";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) reset_connection(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) case CEPH_MSGR_TAG_BADAUTHORIZER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) con->auth_retry++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) dout("process_connect %p got BADAUTHORIZER attempt %d\n", con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) con->auth_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) if (con->auth_retry == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) con->error_msg = "connect authorization failure";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) ret = prepare_write_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) prepare_read_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) case CEPH_MSGR_TAG_RESETSESSION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) * If we connected with a large connect_seq but the peer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) * has no record of a session with us (no connection, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) * connect_seq == 0), they will send RESETSESION to indicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) * that they must have reset their session, and may have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) * dropped messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) dout("process_connect got RESET peer seq %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) le32_to_cpu(con->in_reply.connect_seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) pr_err("%s%lld %s connection reset\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) ENTITY_NAME(con->peer_name),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) ceph_pr_addr(&con->peer_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) reset_connection(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) ret = prepare_write_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) prepare_read_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) /* Tell ceph about it. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) pr_info("reset on %s%lld\n", ENTITY_NAME(con->peer_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) if (con->ops->peer_reset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) con->ops->peer_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) if (con->state != CON_STATE_NEGOTIATING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) case CEPH_MSGR_TAG_RETRY_SESSION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) * If we sent a smaller connect_seq than the peer has, try
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) * again with a larger value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) dout("process_connect got RETRY_SESSION my seq %u, peer %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) le32_to_cpu(con->out_connect.connect_seq),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) le32_to_cpu(con->in_reply.connect_seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) con->connect_seq = le32_to_cpu(con->in_reply.connect_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) ret = prepare_write_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) prepare_read_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) case CEPH_MSGR_TAG_RETRY_GLOBAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) * If we sent a smaller global_seq than the peer has, try
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) * again with a larger value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) dout("process_connect got RETRY_GLOBAL my %u peer_gseq %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) con->peer_global_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) le32_to_cpu(con->in_reply.global_seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) get_global_seq(con->msgr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) le32_to_cpu(con->in_reply.global_seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) ret = prepare_write_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) prepare_read_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) case CEPH_MSGR_TAG_SEQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) case CEPH_MSGR_TAG_READY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) if (req_feat & ~server_feat) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) pr_err("%s%lld %s protocol feature mismatch,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) " my required %llx > server's %llx, need %llx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) ENTITY_NAME(con->peer_name),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) ceph_pr_addr(&con->peer_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) req_feat, server_feat, req_feat & ~server_feat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) con->error_msg = "missing required protocol features";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) reset_connection(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) WARN_ON(con->state != CON_STATE_NEGOTIATING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) con->state = CON_STATE_OPEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) con->auth_retry = 0; /* we authenticated; clear flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) con->connect_seq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) con->peer_features = server_feat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) dout("process_connect got READY gseq %d cseq %d (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) con->peer_global_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) le32_to_cpu(con->in_reply.connect_seq),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) con->connect_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) WARN_ON(con->connect_seq !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) le32_to_cpu(con->in_reply.connect_seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) if (con->in_reply.flags & CEPH_MSG_CONNECT_LOSSY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) con_flag_set(con, CON_FLAG_LOSSYTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) con->delay = 0; /* reset backoff memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) if (con->in_reply.tag == CEPH_MSGR_TAG_SEQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) prepare_write_seq(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) prepare_read_seq(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) prepare_read_tag(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) case CEPH_MSGR_TAG_WAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) * If there is a connection race (we are opening
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) * connections to each other), one of us may just have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) * to WAIT. This shouldn't happen if we are the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) * client.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) con->error_msg = "protocol error, got WAIT as client";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) con->error_msg = "protocol error, garbage tag during connect";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) * read (part of) an ack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) static int read_partial_ack(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) int size = sizeof (con->in_temp_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) int end = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) return read_partial(con, end, size, &con->in_temp_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) * We can finally discard anything that's been acked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) static void process_ack(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) struct ceph_msg *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) u64 ack = le64_to_cpu(con->in_temp_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) u64 seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) bool reconnect = (con->in_tag == CEPH_MSGR_TAG_SEQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) struct list_head *list = reconnect ? &con->out_queue : &con->out_sent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) * In the reconnect case, con_fault() has requeued messages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) * in out_sent. We should cleanup old messages according to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) * the reconnect seq.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) while (!list_empty(list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) m = list_first_entry(list, struct ceph_msg, list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) if (reconnect && m->needs_out_seq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) seq = le64_to_cpu(m->hdr.seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) if (seq > ack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) dout("got ack for seq %llu type %d at %p\n", seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) le16_to_cpu(m->hdr.type), m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) m->ack_stamp = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) ceph_msg_remove(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) prepare_read_tag(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) static int read_partial_message_section(struct ceph_connection *con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) struct kvec *section,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) unsigned int sec_len, u32 *crc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) int ret, left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) BUG_ON(!section);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) while (section->iov_len < sec_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) BUG_ON(section->iov_base == NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) left = sec_len - section->iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) ret = ceph_tcp_recvmsg(con->sock, (char *)section->iov_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) section->iov_len, left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) section->iov_len += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) if (section->iov_len == sec_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) *crc = crc32c(0, section->iov_base, section->iov_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) static int read_partial_msg_data(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) struct ceph_msg *msg = con->in_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) struct ceph_msg_data_cursor *cursor = &msg->cursor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) bool do_datacrc = !ceph_test_opt(from_msgr(con->msgr), NOCRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) size_t page_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) size_t length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) u32 crc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) if (!msg->num_data_items)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) if (do_datacrc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) crc = con->in_data_crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) while (cursor->total_resid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) if (!cursor->resid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) ceph_msg_data_advance(cursor, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) page = ceph_msg_data_next(cursor, &page_offset, &length, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) ret = ceph_tcp_recvpage(con->sock, page, page_offset, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) if (ret <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) if (do_datacrc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) con->in_data_crc = crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) if (do_datacrc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) crc = ceph_crc32c_page(crc, page, page_offset, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) ceph_msg_data_advance(cursor, (size_t)ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) if (do_datacrc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) con->in_data_crc = crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) return 1; /* must return > 0 to indicate success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) * read (part of) a message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) static int read_partial_message(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) struct ceph_msg *m = con->in_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) int end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) unsigned int front_len, middle_len, data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) bool do_datacrc = !ceph_test_opt(from_msgr(con->msgr), NOCRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) bool need_sign = (con->peer_features & CEPH_FEATURE_MSG_AUTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) u64 seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) u32 crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) dout("read_partial_message con %p msg %p\n", con, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) /* header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) size = sizeof (con->in_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) end = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) ret = read_partial(con, end, size, &con->in_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) crc = crc32c(0, &con->in_hdr, offsetof(struct ceph_msg_header, crc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) if (cpu_to_le32(crc) != con->in_hdr.crc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) pr_err("read_partial_message bad hdr crc %u != expected %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) crc, con->in_hdr.crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) return -EBADMSG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) front_len = le32_to_cpu(con->in_hdr.front_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) if (front_len > CEPH_MSG_MAX_FRONT_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) middle_len = le32_to_cpu(con->in_hdr.middle_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) if (middle_len > CEPH_MSG_MAX_MIDDLE_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) data_len = le32_to_cpu(con->in_hdr.data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) if (data_len > CEPH_MSG_MAX_DATA_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) /* verify seq# */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) seq = le64_to_cpu(con->in_hdr.seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) if ((s64)seq - (s64)con->in_seq < 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) pr_info("skipping %s%lld %s seq %lld expected %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) ENTITY_NAME(con->peer_name),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) ceph_pr_addr(&con->peer_addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) seq, con->in_seq + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) con->in_base_pos = -front_len - middle_len - data_len -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) sizeof_footer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) con->in_tag = CEPH_MSGR_TAG_READY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) } else if ((s64)seq - (s64)con->in_seq > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) pr_err("read_partial_message bad seq %lld expected %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) seq, con->in_seq + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) con->error_msg = "bad message sequence # for incoming message";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) return -EBADE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) /* allocate message? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) if (!con->in_msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) int skip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) dout("got hdr type %d front %d data %d\n", con->in_hdr.type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) front_len, data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) ret = ceph_con_in_msg_alloc(con, &skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) BUG_ON(!con->in_msg ^ skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) if (skip) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) /* skip this message */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) dout("alloc_msg said skip message\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) con->in_base_pos = -front_len - middle_len - data_len -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) sizeof_footer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) con->in_tag = CEPH_MSGR_TAG_READY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) con->in_seq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) BUG_ON(!con->in_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) BUG_ON(con->in_msg->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) m = con->in_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) m->front.iov_len = 0; /* haven't read it yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) if (m->middle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) m->middle->vec.iov_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) /* prepare for data payload, if any */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) if (data_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) prepare_message_data(con->in_msg, data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) /* front */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) ret = read_partial_message_section(con, &m->front, front_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) &con->in_front_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) /* middle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) if (m->middle) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) ret = read_partial_message_section(con, &m->middle->vec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) middle_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) &con->in_middle_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) /* (page) data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) if (data_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) ret = read_partial_msg_data(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) /* footer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) size = sizeof_footer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) end += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) ret = read_partial(con, end, size, &m->footer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) if (!need_sign) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) m->footer.flags = m->old_footer.flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) m->footer.sig = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) dout("read_partial_message got msg %p %d (%u) + %d (%u) + %d (%u)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) m, front_len, m->footer.front_crc, middle_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) m->footer.middle_crc, data_len, m->footer.data_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) /* crc ok? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) if (con->in_front_crc != le32_to_cpu(m->footer.front_crc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) pr_err("read_partial_message %p front crc %u != exp. %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) m, con->in_front_crc, m->footer.front_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) return -EBADMSG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) if (con->in_middle_crc != le32_to_cpu(m->footer.middle_crc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) pr_err("read_partial_message %p middle crc %u != exp %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) m, con->in_middle_crc, m->footer.middle_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) return -EBADMSG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) if (do_datacrc &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) (m->footer.flags & CEPH_MSG_FOOTER_NOCRC) == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) con->in_data_crc != le32_to_cpu(m->footer.data_crc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) pr_err("read_partial_message %p data crc %u != exp. %u\n", m,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) con->in_data_crc, le32_to_cpu(m->footer.data_crc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) return -EBADMSG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) if (need_sign && con->ops->check_message_signature &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) con->ops->check_message_signature(m)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) pr_err("read_partial_message %p signature check failed\n", m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) return -EBADMSG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) return 1; /* done! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) * Process message. This happens in the worker thread. The callback should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) * be careful not to do anything that waits on other incoming messages or it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) * may deadlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) static void process_message(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) struct ceph_msg *msg = con->in_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) BUG_ON(con->in_msg->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) con->in_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) /* if first message, set peer_name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) if (con->peer_name.type == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) con->peer_name = msg->hdr.src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) con->in_seq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) dout("===== %p %llu from %s%lld %d=%s len %d+%d (%u %u %u) =====\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) msg, le64_to_cpu(msg->hdr.seq),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) ENTITY_NAME(msg->hdr.src),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) le16_to_cpu(msg->hdr.type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) ceph_msg_type_name(le16_to_cpu(msg->hdr.type)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) le32_to_cpu(msg->hdr.front_len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) le32_to_cpu(msg->hdr.data_len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) con->in_front_crc, con->in_middle_crc, con->in_data_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) con->ops->dispatch(con, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) static int read_keepalive_ack(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) struct ceph_timespec ceph_ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) size_t size = sizeof(ceph_ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) int ret = read_partial(con, size, size, &ceph_ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) ceph_decode_timespec64(&con->last_keepalive_ack, &ceph_ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) prepare_read_tag(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) * Write something to the socket. Called in a worker thread when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) * socket appears to be writeable and we have something ready to send.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) static int try_write(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) int ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) dout("try_write start %p state %lu\n", con, con->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) if (con->state != CON_STATE_PREOPEN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) con->state != CON_STATE_CONNECTING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) con->state != CON_STATE_NEGOTIATING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) con->state != CON_STATE_OPEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) /* open the socket first? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) if (con->state == CON_STATE_PREOPEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) BUG_ON(con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) con->state = CON_STATE_CONNECTING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) con_out_kvec_reset(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) prepare_write_banner(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) prepare_read_banner(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) BUG_ON(con->in_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) con->in_tag = CEPH_MSGR_TAG_READY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) dout("try_write initiating connect on %p new state %lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) con, con->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) ret = ceph_tcp_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) con->error_msg = "connect error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) more:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) dout("try_write out_kvec_bytes %d\n", con->out_kvec_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) BUG_ON(!con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) /* kvec data queued? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) if (con->out_kvec_left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) ret = write_partial_kvec(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) if (con->out_skip) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) ret = write_partial_skip(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) /* msg pages? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) if (con->out_msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) if (con->out_msg_done) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) ceph_msg_put(con->out_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) con->out_msg = NULL; /* we're done with this one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) goto do_next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) ret = write_partial_message_data(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) if (ret == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) goto more; /* we need to send the footer, too! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) dout("try_write write_partial_message_data err %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) do_next:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) if (con->state == CON_STATE_OPEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) if (con_flag_test_and_clear(con, CON_FLAG_KEEPALIVE_PENDING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) prepare_write_keepalive(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) /* is anything else pending? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) if (!list_empty(&con->out_queue)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) prepare_write_message(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) if (con->in_seq > con->in_seq_acked) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) prepare_write_ack(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) /* Nothing to do! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) con_flag_clear(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) dout("try_write nothing else to write.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) dout("try_write done on %p ret %d\n", con, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) * Read what we can from the socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) static int try_read(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) int ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) more:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) dout("try_read start on %p state %lu\n", con, con->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) if (con->state != CON_STATE_CONNECTING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) con->state != CON_STATE_NEGOTIATING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) con->state != CON_STATE_OPEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) BUG_ON(!con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) dout("try_read tag %d in_base_pos %d\n", (int)con->in_tag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) con->in_base_pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) if (con->state == CON_STATE_CONNECTING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) dout("try_read connecting\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) ret = read_partial_banner(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) ret = process_banner(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) con->state = CON_STATE_NEGOTIATING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) * Received banner is good, exchange connection info.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) * Do not reset out_kvec, as sending our banner raced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) * with receiving peer banner after connect completed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) ret = prepare_write_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) prepare_read_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) /* Send connection info before awaiting response */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) if (con->state == CON_STATE_NEGOTIATING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) dout("try_read negotiating\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) ret = read_partial_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) ret = process_connect(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) WARN_ON(con->state != CON_STATE_OPEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) if (con->in_base_pos < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) * skipping + discarding content.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) ret = ceph_tcp_recvmsg(con->sock, NULL, -con->in_base_pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) dout("skipped %d / %d bytes\n", ret, -con->in_base_pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) con->in_base_pos += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) if (con->in_base_pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) if (con->in_tag == CEPH_MSGR_TAG_READY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) * what's next?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) ret = ceph_tcp_recvmsg(con->sock, &con->in_tag, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) dout("try_read got tag %d\n", (int)con->in_tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) switch (con->in_tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) case CEPH_MSGR_TAG_MSG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) prepare_read_message(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) case CEPH_MSGR_TAG_ACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) prepare_read_ack(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) case CEPH_MSGR_TAG_KEEPALIVE2_ACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) prepare_read_keepalive_ack(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) case CEPH_MSGR_TAG_CLOSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) con_close_socket(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) con->state = CON_STATE_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) goto bad_tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) if (con->in_tag == CEPH_MSGR_TAG_MSG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) ret = read_partial_message(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) if (ret <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) switch (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) case -EBADMSG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) con->error_msg = "bad crc/signature";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) case -EBADE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) case -EIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) con->error_msg = "io error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) if (con->in_tag == CEPH_MSGR_TAG_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) process_message(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) if (con->state == CON_STATE_OPEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) prepare_read_tag(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) if (con->in_tag == CEPH_MSGR_TAG_ACK ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) con->in_tag == CEPH_MSGR_TAG_SEQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) * the final handshake seq exchange is semantically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) * equivalent to an ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) ret = read_partial_ack(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) process_ack(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) if (con->in_tag == CEPH_MSGR_TAG_KEEPALIVE2_ACK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) ret = read_keepalive_ack(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) goto more;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) dout("try_read done on %p ret %d\n", con, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) bad_tag:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) pr_err("try_read bad con->in_tag = %d\n", (int)con->in_tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) con->error_msg = "protocol error, garbage tag";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) * Atomically queue work on a connection after the specified delay.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) * Bump @con reference to avoid races with connection teardown.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) * Returns 0 if work was queued, or an error code otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) static int queue_con_delay(struct ceph_connection *con, unsigned long delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) if (!con->ops->get(con)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) dout("%s %p ref count 0\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) dout("%s %p %lu\n", __func__, con, delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) if (!queue_delayed_work(ceph_msgr_wq, &con->work, delay)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) dout("%s %p - already queued\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) con->ops->put(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) static void queue_con(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) (void) queue_con_delay(con, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) static void cancel_con(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) if (cancel_delayed_work(&con->work)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) dout("%s %p\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) con->ops->put(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) static bool con_sock_closed(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) if (!con_flag_test_and_clear(con, CON_FLAG_SOCK_CLOSED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) #define CASE(x) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) case CON_STATE_ ## x: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) con->error_msg = "socket closed (con state " #x ")"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) switch (con->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) CASE(CLOSED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) CASE(PREOPEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) CASE(CONNECTING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) CASE(NEGOTIATING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) CASE(OPEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) CASE(STANDBY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) pr_warn("%s con %p unrecognized state %lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) __func__, con, con->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) con->error_msg = "unrecognized con state";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) #undef CASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) static bool con_backoff(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) if (!con_flag_test_and_clear(con, CON_FLAG_BACKOFF))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) ret = queue_con_delay(con, round_jiffies_relative(con->delay));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) dout("%s: con %p FAILED to back off %lu\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) con, con->delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) BUG_ON(ret == -ENOENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) con_flag_set(con, CON_FLAG_BACKOFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) /* Finish fault handling; con->mutex must *not* be held here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) static void con_fault_finish(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) dout("%s %p\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) * in case we faulted due to authentication, invalidate our
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) * current tickets so that we can get new ones.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) if (con->auth_retry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) dout("auth_retry %d, invalidating\n", con->auth_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) if (con->ops->invalidate_authorizer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) con->ops->invalidate_authorizer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) con->auth_retry = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) if (con->ops->fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) con->ops->fault(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) * Do some work on a connection. Drop a connection ref when we're done.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) static void ceph_con_workfn(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) struct ceph_connection *con = container_of(work, struct ceph_connection,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) bool fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) while (true) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) if ((fault = con_sock_closed(con))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) dout("%s: con %p SOCK_CLOSED\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) if (con_backoff(con)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) dout("%s: con %p BACKOFF\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) if (con->state == CON_STATE_STANDBY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) dout("%s: con %p STANDBY\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) if (con->state == CON_STATE_CLOSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) dout("%s: con %p CLOSED\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) BUG_ON(con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) if (con->state == CON_STATE_PREOPEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) dout("%s: con %p PREOPEN\n", __func__, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) BUG_ON(con->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) ret = try_read(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) if (ret == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) if (!con->error_msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) con->error_msg = "socket error on read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) ret = try_write(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) if (ret == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) if (!con->error_msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) con->error_msg = "socket error on write";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) fault = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) break; /* If we make it to here, we're done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) if (fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) con_fault(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) if (fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) con_fault_finish(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) con->ops->put(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) * Generic error/fault handler. A retry mechanism is used with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) * exponential backoff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) static void con_fault(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) dout("fault %p state %lu to peer %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) con, con->state, ceph_pr_addr(&con->peer_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) pr_warn("%s%lld %s %s\n", ENTITY_NAME(con->peer_name),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) ceph_pr_addr(&con->peer_addr), con->error_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) con->error_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) WARN_ON(con->state != CON_STATE_CONNECTING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) con->state != CON_STATE_NEGOTIATING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) con->state != CON_STATE_OPEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) con_close_socket(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) if (con_flag_test(con, CON_FLAG_LOSSYTX)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) dout("fault on LOSSYTX channel, marking CLOSED\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) con->state = CON_STATE_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) if (con->in_msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) BUG_ON(con->in_msg->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) ceph_msg_put(con->in_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) con->in_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) if (con->out_msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) BUG_ON(con->out_msg->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) ceph_msg_put(con->out_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) con->out_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) /* Requeue anything that hasn't been acked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) list_splice_init(&con->out_sent, &con->out_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) /* If there are no messages queued or keepalive pending, place
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) * the connection in a STANDBY state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) if (list_empty(&con->out_queue) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) !con_flag_test(con, CON_FLAG_KEEPALIVE_PENDING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) dout("fault %p setting STANDBY clearing WRITE_PENDING\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) con_flag_clear(con, CON_FLAG_WRITE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) con->state = CON_STATE_STANDBY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) /* retry after a delay. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) con->state = CON_STATE_PREOPEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) if (con->delay == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) con->delay = BASE_DELAY_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) else if (con->delay < MAX_DELAY_INTERVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) con->delay *= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) con_flag_set(con, CON_FLAG_BACKOFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) void ceph_messenger_reset_nonce(struct ceph_messenger *msgr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) u32 nonce = le32_to_cpu(msgr->inst.addr.nonce) + 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) msgr->inst.addr.nonce = cpu_to_le32(nonce);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) encode_my_addr(msgr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) * initialize a new messenger instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) void ceph_messenger_init(struct ceph_messenger *msgr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) struct ceph_entity_addr *myaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) spin_lock_init(&msgr->global_seq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) if (myaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) msgr->inst.addr = *myaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) /* select a random nonce */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) msgr->inst.addr.type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) get_random_bytes(&msgr->inst.addr.nonce, sizeof(msgr->inst.addr.nonce));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) encode_my_addr(msgr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) atomic_set(&msgr->stopping, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) write_pnet(&msgr->net, get_net(current->nsproxy->net_ns));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) dout("%s %p\n", __func__, msgr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) EXPORT_SYMBOL(ceph_messenger_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) void ceph_messenger_fini(struct ceph_messenger *msgr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) put_net(read_pnet(&msgr->net));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) EXPORT_SYMBOL(ceph_messenger_fini);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) static void msg_con_set(struct ceph_msg *msg, struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) if (msg->con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) msg->con->ops->put(msg->con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) msg->con = con ? con->ops->get(con) : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) BUG_ON(msg->con != con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) static void clear_standby(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) /* come back from STANDBY? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) if (con->state == CON_STATE_STANDBY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) dout("clear_standby %p and ++connect_seq\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) con->state = CON_STATE_PREOPEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) con->connect_seq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) WARN_ON(con_flag_test(con, CON_FLAG_WRITE_PENDING));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) WARN_ON(con_flag_test(con, CON_FLAG_KEEPALIVE_PENDING));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) * Queue up an outgoing message on the given connection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) /* set src+dst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) msg->hdr.src = con->msgr->inst.name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) BUG_ON(msg->front.iov_len != le32_to_cpu(msg->hdr.front_len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) msg->needs_out_seq = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) if (con->state == CON_STATE_CLOSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) dout("con_send %p closed, dropping %p\n", con, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) ceph_msg_put(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) msg_con_set(msg, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) BUG_ON(!list_empty(&msg->list_head));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) list_add_tail(&msg->list_head, &con->out_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) dout("----- %p to %s%lld %d=%s len %d+%d+%d -----\n", msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) ENTITY_NAME(con->peer_name), le16_to_cpu(msg->hdr.type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) ceph_msg_type_name(le16_to_cpu(msg->hdr.type)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) le32_to_cpu(msg->hdr.front_len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) le32_to_cpu(msg->hdr.middle_len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) le32_to_cpu(msg->hdr.data_len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) clear_standby(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) /* if there wasn't anything waiting to send before, queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) * new work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) if (con_flag_test_and_set(con, CON_FLAG_WRITE_PENDING) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) EXPORT_SYMBOL(ceph_con_send);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) * Revoke a message that was previously queued for send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) void ceph_msg_revoke(struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) struct ceph_connection *con = msg->con;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) if (!con) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) dout("%s msg %p null con\n", __func__, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) return; /* Message not in our possession */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) if (!list_empty(&msg->list_head)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) dout("%s %p msg %p - was on queue\n", __func__, con, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) list_del_init(&msg->list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) msg->hdr.seq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) ceph_msg_put(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) if (con->out_msg == msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) BUG_ON(con->out_skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) /* footer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) if (con->out_msg_done) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) con->out_skip += con_out_kvec_skip(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) BUG_ON(!msg->data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) con->out_skip += sizeof_footer(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) /* data, middle, front */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) if (msg->data_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) con->out_skip += msg->cursor.total_resid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) if (msg->middle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) con->out_skip += con_out_kvec_skip(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) con->out_skip += con_out_kvec_skip(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) dout("%s %p msg %p - was sending, will write %d skip %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) __func__, con, msg, con->out_kvec_bytes, con->out_skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) msg->hdr.seq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) con->out_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) ceph_msg_put(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) * Revoke a message that we may be reading data into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) void ceph_msg_revoke_incoming(struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) struct ceph_connection *con = msg->con;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) if (!con) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) dout("%s msg %p null con\n", __func__, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) return; /* Message not in our possession */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) if (con->in_msg == msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) unsigned int front_len = le32_to_cpu(con->in_hdr.front_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) unsigned int middle_len = le32_to_cpu(con->in_hdr.middle_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) unsigned int data_len = le32_to_cpu(con->in_hdr.data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) /* skip rest of message */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) dout("%s %p msg %p revoked\n", __func__, con, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) con->in_base_pos = con->in_base_pos -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) sizeof(struct ceph_msg_header) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) front_len -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) middle_len -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) data_len -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) sizeof(struct ceph_msg_footer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) ceph_msg_put(con->in_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) con->in_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) con->in_tag = CEPH_MSGR_TAG_READY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) con->in_seq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) dout("%s %p in_msg %p msg %p no-op\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) __func__, con, con->in_msg, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) * Queue a keepalive byte to ensure the tcp connection is alive.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) void ceph_con_keepalive(struct ceph_connection *con)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) dout("con_keepalive %p\n", con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) clear_standby(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) con_flag_set(con, CON_FLAG_KEEPALIVE_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) if (con_flag_test_and_set(con, CON_FLAG_WRITE_PENDING) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) queue_con(con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) EXPORT_SYMBOL(ceph_con_keepalive);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) bool ceph_con_keepalive_expired(struct ceph_connection *con,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) unsigned long interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) if (interval > 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) (con->peer_features & CEPH_FEATURE_MSGR_KEEPALIVE2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) struct timespec64 now;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) struct timespec64 ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) ktime_get_real_ts64(&now);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) jiffies_to_timespec64(interval, &ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) ts = timespec64_add(con->last_keepalive_ack, ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) return timespec64_compare(&now, &ts) >= 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) static struct ceph_msg_data *ceph_msg_data_add(struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) BUG_ON(msg->num_data_items >= msg->max_data_items);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) return &msg->data[msg->num_data_items++];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) static void ceph_msg_data_destroy(struct ceph_msg_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) if (data->type == CEPH_MSG_DATA_PAGES && data->own_pages) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) int num_pages = calc_pages_for(data->alignment, data->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) ceph_release_page_vector(data->pages, num_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) } else if (data->type == CEPH_MSG_DATA_PAGELIST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) ceph_pagelist_release(data->pagelist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) void ceph_msg_data_add_pages(struct ceph_msg *msg, struct page **pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) size_t length, size_t alignment, bool own_pages)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) struct ceph_msg_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) BUG_ON(!pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) BUG_ON(!length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) data = ceph_msg_data_add(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) data->type = CEPH_MSG_DATA_PAGES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) data->pages = pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) data->length = length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) data->alignment = alignment & ~PAGE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) data->own_pages = own_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) msg->data_length += length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) EXPORT_SYMBOL(ceph_msg_data_add_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) void ceph_msg_data_add_pagelist(struct ceph_msg *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) struct ceph_pagelist *pagelist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) struct ceph_msg_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) BUG_ON(!pagelist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) BUG_ON(!pagelist->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) data = ceph_msg_data_add(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) data->type = CEPH_MSG_DATA_PAGELIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) refcount_inc(&pagelist->refcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) data->pagelist = pagelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) msg->data_length += pagelist->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) EXPORT_SYMBOL(ceph_msg_data_add_pagelist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) #ifdef CONFIG_BLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) void ceph_msg_data_add_bio(struct ceph_msg *msg, struct ceph_bio_iter *bio_pos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) u32 length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) struct ceph_msg_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) data = ceph_msg_data_add(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) data->type = CEPH_MSG_DATA_BIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) data->bio_pos = *bio_pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) data->bio_length = length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) msg->data_length += length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) EXPORT_SYMBOL(ceph_msg_data_add_bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) #endif /* CONFIG_BLOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) void ceph_msg_data_add_bvecs(struct ceph_msg *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) struct ceph_bvec_iter *bvec_pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) struct ceph_msg_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) data = ceph_msg_data_add(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) data->type = CEPH_MSG_DATA_BVECS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) data->bvec_pos = *bvec_pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) msg->data_length += bvec_pos->iter.bi_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) EXPORT_SYMBOL(ceph_msg_data_add_bvecs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) * construct a new message with given type, size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) * the new msg has a ref count of 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) struct ceph_msg *ceph_msg_new2(int type, int front_len, int max_data_items,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) gfp_t flags, bool can_fail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) struct ceph_msg *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) m = kmem_cache_zalloc(ceph_msg_cache, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) if (m == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) m->hdr.type = cpu_to_le16(type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) m->hdr.priority = cpu_to_le16(CEPH_MSG_PRIO_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) m->hdr.front_len = cpu_to_le32(front_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) INIT_LIST_HEAD(&m->list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) kref_init(&m->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) /* front */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) if (front_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) m->front.iov_base = ceph_kvmalloc(front_len, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) if (m->front.iov_base == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) dout("ceph_msg_new can't allocate %d bytes\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) front_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) goto out2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) m->front.iov_base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) m->front_alloc_len = m->front.iov_len = front_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) if (max_data_items) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) m->data = kmalloc_array(max_data_items, sizeof(*m->data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) if (!m->data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) goto out2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) m->max_data_items = max_data_items;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) dout("ceph_msg_new %p front %d\n", m, front_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) return m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) out2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) ceph_msg_put(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) if (!can_fail) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) pr_err("msg_new can't create type %d front %d\n", type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) front_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) dout("msg_new can't create type %d front %d\n", type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) front_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) EXPORT_SYMBOL(ceph_msg_new2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) bool can_fail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) return ceph_msg_new2(type, front_len, 0, flags, can_fail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) EXPORT_SYMBOL(ceph_msg_new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) * Allocate "middle" portion of a message, if it is needed and wasn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) * allocated by alloc_msg. This allows us to read a small fixed-size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) * per-type header in the front and then gracefully fail (i.e.,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) * propagate the error to the caller based on info in the front) when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) * the middle is too large.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) static int ceph_alloc_middle(struct ceph_connection *con, struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) int type = le16_to_cpu(msg->hdr.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) int middle_len = le32_to_cpu(msg->hdr.middle_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) dout("alloc_middle %p type %d %s middle_len %d\n", msg, type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) ceph_msg_type_name(type), middle_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) BUG_ON(!middle_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) BUG_ON(msg->middle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) msg->middle = ceph_buffer_new(middle_len, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) if (!msg->middle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) * Allocate a message for receiving an incoming message on a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) * connection, and save the result in con->in_msg. Uses the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) * connection's private alloc_msg op if available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) * Returns 0 on success, or a negative error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) * On success, if we set *skip = 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) * - the next message should be skipped and ignored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) * - con->in_msg == NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) * or if we set *skip = 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) * - con->in_msg is non-null.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) * On error (ENOMEM, EAGAIN, ...),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) * - con->in_msg == NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) struct ceph_msg_header *hdr = &con->in_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) int middle_len = le32_to_cpu(hdr->middle_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) struct ceph_msg *msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) BUG_ON(con->in_msg != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) BUG_ON(!con->ops->alloc_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) mutex_unlock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) msg = con->ops->alloc_msg(con, hdr, skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) mutex_lock(&con->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) if (con->state != CON_STATE_OPEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) if (msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) ceph_msg_put(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) if (msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) BUG_ON(*skip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) msg_con_set(msg, con);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) con->in_msg = msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) * Null message pointer means either we should skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) * this message or we couldn't allocate memory. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) * former is not an error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) if (*skip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) con->error_msg = "error allocating memory for incoming message";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) memcpy(&con->in_msg->hdr, &con->in_hdr, sizeof(con->in_hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) if (middle_len && !con->in_msg->middle) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) ret = ceph_alloc_middle(con, con->in_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) ceph_msg_put(con->in_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) con->in_msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) * Free a generically kmalloc'd message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) static void ceph_msg_free(struct ceph_msg *m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) dout("%s %p\n", __func__, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) kvfree(m->front.iov_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) kfree(m->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) kmem_cache_free(ceph_msg_cache, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) static void ceph_msg_release(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) struct ceph_msg *m = container_of(kref, struct ceph_msg, kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) dout("%s %p\n", __func__, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) WARN_ON(!list_empty(&m->list_head));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) msg_con_set(m, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) /* drop middle, data, if any */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) if (m->middle) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) ceph_buffer_put(m->middle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) m->middle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) for (i = 0; i < m->num_data_items; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) ceph_msg_data_destroy(&m->data[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) if (m->pool)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) ceph_msgpool_put(m->pool, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) ceph_msg_free(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) struct ceph_msg *ceph_msg_get(struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) dout("%s %p (was %d)\n", __func__, msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) kref_read(&msg->kref));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) kref_get(&msg->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) return msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) EXPORT_SYMBOL(ceph_msg_get);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) void ceph_msg_put(struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) dout("%s %p (was %d)\n", __func__, msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) kref_read(&msg->kref));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) kref_put(&msg->kref, ceph_msg_release);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) EXPORT_SYMBOL(ceph_msg_put);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) void ceph_msg_dump(struct ceph_msg *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) pr_debug("msg_dump %p (front_alloc_len %d length %zd)\n", msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) msg->front_alloc_len, msg->data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) print_hex_dump(KERN_DEBUG, "header: ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) DUMP_PREFIX_OFFSET, 16, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) &msg->hdr, sizeof(msg->hdr), true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) print_hex_dump(KERN_DEBUG, " front: ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) DUMP_PREFIX_OFFSET, 16, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) msg->front.iov_base, msg->front.iov_len, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) if (msg->middle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) print_hex_dump(KERN_DEBUG, "middle: ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) DUMP_PREFIX_OFFSET, 16, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) msg->middle->vec.iov_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) msg->middle->vec.iov_len, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) print_hex_dump(KERN_DEBUG, "footer: ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) DUMP_PREFIX_OFFSET, 16, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) &msg->footer, sizeof(msg->footer), true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) EXPORT_SYMBOL(ceph_msg_dump);