Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);