forked from mirrors/linux
		
	 421ab1be43
			
		
	
	
		421ab1be43
		
	
	
	
	
		
			
			Do not cast the struct xprt to a sock_xprt unless we know it is a UDP or
TCP transport. Otherwise the call to lock the mutex will scribble over
whatever structure is actually there. This has been seen to cause hard
system lockups when the underlying transport was RDMA.
Fixes: b49ea673e1 ("SUNRPC: lock against ->sock changing during sysfs read")
Cc: stable@vger.kernel.org
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
		
	
			
		
			
				
	
	
		
			94 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  *  linux/include/linux/sunrpc/xprtsock.h
 | |
|  *
 | |
|  *  Declarations for the RPC transport socket provider.
 | |
|  */
 | |
| 
 | |
| #ifndef _LINUX_SUNRPC_XPRTSOCK_H
 | |
| #define _LINUX_SUNRPC_XPRTSOCK_H
 | |
| 
 | |
| int		init_socket_xprt(void);
 | |
| void		cleanup_socket_xprt(void);
 | |
| 
 | |
| #define RPC_MIN_RESVPORT	(1U)
 | |
| #define RPC_MAX_RESVPORT	(65535U)
 | |
| #define RPC_DEF_MIN_RESVPORT	(665U)
 | |
| #define RPC_DEF_MAX_RESVPORT	(1023U)
 | |
| 
 | |
| struct sock_xprt {
 | |
| 	struct rpc_xprt		xprt;
 | |
| 
 | |
| 	/*
 | |
| 	 * Network layer
 | |
| 	 */
 | |
| 	struct socket *		sock;
 | |
| 	struct sock *		inet;
 | |
| 	struct file *		file;
 | |
| 
 | |
| 	/*
 | |
| 	 * State of TCP reply receive
 | |
| 	 */
 | |
| 	struct {
 | |
| 		struct {
 | |
| 			__be32	fraghdr,
 | |
| 				xid,
 | |
| 				calldir;
 | |
| 		} __attribute__((packed));
 | |
| 
 | |
| 		u32		offset,
 | |
| 				len;
 | |
| 
 | |
| 		unsigned long	copied;
 | |
| 	} recv;
 | |
| 
 | |
| 	/*
 | |
| 	 * State of TCP transmit queue
 | |
| 	 */
 | |
| 	struct {
 | |
| 		u32		offset;
 | |
| 	} xmit;
 | |
| 
 | |
| 	/*
 | |
| 	 * Connection of transports
 | |
| 	 */
 | |
| 	unsigned long		sock_state;
 | |
| 	struct delayed_work	connect_worker;
 | |
| 	struct work_struct	error_worker;
 | |
| 	struct work_struct	recv_worker;
 | |
| 	struct mutex		recv_mutex;
 | |
| 	struct sockaddr_storage	srcaddr;
 | |
| 	unsigned short		srcport;
 | |
| 	int			xprt_err;
 | |
| 
 | |
| 	/*
 | |
| 	 * UDP socket buffer size parameters
 | |
| 	 */
 | |
| 	size_t			rcvsize,
 | |
| 				sndsize;
 | |
| 
 | |
| 	struct rpc_timeout	tcp_timeout;
 | |
| 
 | |
| 	/*
 | |
| 	 * Saved socket callback addresses
 | |
| 	 */
 | |
| 	void			(*old_data_ready)(struct sock *);
 | |
| 	void			(*old_state_change)(struct sock *);
 | |
| 	void			(*old_write_space)(struct sock *);
 | |
| 	void			(*old_error_report)(struct sock *);
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * TCP RPC flags
 | |
|  */
 | |
| #define XPRT_SOCK_CONNECTING	1U
 | |
| #define XPRT_SOCK_DATA_READY	(2)
 | |
| #define XPRT_SOCK_UPD_TIMEOUT	(3)
 | |
| #define XPRT_SOCK_WAKE_ERROR	(4)
 | |
| #define XPRT_SOCK_WAKE_WRITE	(5)
 | |
| #define XPRT_SOCK_WAKE_PENDING	(6)
 | |
| #define XPRT_SOCK_WAKE_DISCONNECT	(7)
 | |
| #define XPRT_SOCK_CONNECT_SENT	(8)
 | |
| #define XPRT_SOCK_NOSPACE	(9)
 | |
| 
 | |
| #endif /* _LINUX_SUNRPC_XPRTSOCK_H */
 |