mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 18:20:25 +02:00 
			
		
		
		
	net: socket: add support for async operations
Add support for async operations. Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									8f2ddaac30
								
							
						
					
					
						commit
						0345f93138
					
				
					 3 changed files with 9 additions and 2 deletions
				
			
		| 
						 | 
					@ -51,6 +51,7 @@ struct msghdr {
 | 
				
			||||||
	void		*msg_control;	/* ancillary data */
 | 
						void		*msg_control;	/* ancillary data */
 | 
				
			||||||
	__kernel_size_t	msg_controllen;	/* ancillary data buffer length */
 | 
						__kernel_size_t	msg_controllen;	/* ancillary data buffer length */
 | 
				
			||||||
	unsigned int	msg_flags;	/* flags on received message */
 | 
						unsigned int	msg_flags;	/* flags on received message */
 | 
				
			||||||
 | 
						struct kiocb	*msg_iocb;	/* ptr to iocb for async requests */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
struct user_msghdr {
 | 
					struct user_msghdr {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,6 +79,8 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
 | 
				
			||||||
	if (nr_segs > UIO_MAXIOV)
 | 
						if (nr_segs > UIO_MAXIOV)
 | 
				
			||||||
		return -EMSGSIZE;
 | 
							return -EMSGSIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						kmsg->msg_iocb = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE,
 | 
						err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE,
 | 
				
			||||||
					   compat_ptr(uiov), nr_segs,
 | 
										   compat_ptr(uiov), nr_segs,
 | 
				
			||||||
					   UIO_FASTIOV, *iov, iov);
 | 
										   UIO_FASTIOV, *iov, iov);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -798,7 +798,8 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct file *file = iocb->ki_filp;
 | 
						struct file *file = iocb->ki_filp;
 | 
				
			||||||
	struct socket *sock = file->private_data;
 | 
						struct socket *sock = file->private_data;
 | 
				
			||||||
	struct msghdr msg = {.msg_iter = *to};
 | 
						struct msghdr msg = {.msg_iter = *to,
 | 
				
			||||||
 | 
								     .msg_iocb = iocb};
 | 
				
			||||||
	ssize_t res;
 | 
						ssize_t res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (file->f_flags & O_NONBLOCK)
 | 
						if (file->f_flags & O_NONBLOCK)
 | 
				
			||||||
| 
						 | 
					@ -819,7 +820,8 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct file *file = iocb->ki_filp;
 | 
						struct file *file = iocb->ki_filp;
 | 
				
			||||||
	struct socket *sock = file->private_data;
 | 
						struct socket *sock = file->private_data;
 | 
				
			||||||
	struct msghdr msg = {.msg_iter = *from};
 | 
						struct msghdr msg = {.msg_iter = *from,
 | 
				
			||||||
 | 
								     .msg_iocb = iocb};
 | 
				
			||||||
	ssize_t res;
 | 
						ssize_t res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (iocb->ki_pos != 0)
 | 
						if (iocb->ki_pos != 0)
 | 
				
			||||||
| 
						 | 
					@ -1894,6 +1896,8 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
 | 
				
			||||||
	if (nr_segs > UIO_MAXIOV)
 | 
						if (nr_segs > UIO_MAXIOV)
 | 
				
			||||||
		return -EMSGSIZE;
 | 
							return -EMSGSIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						kmsg->msg_iocb = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = rw_copy_check_uvector(save_addr ? READ : WRITE,
 | 
						err = rw_copy_check_uvector(save_addr ? READ : WRITE,
 | 
				
			||||||
				    uiov, nr_segs,
 | 
									    uiov, nr_segs,
 | 
				
			||||||
				    UIO_FASTIOV, *iov, iov);
 | 
									    UIO_FASTIOV, *iov, iov);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue