aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortadeusz.struk@intel.com <tadeusz.struk@intel.com>2015-03-19 15:31:25 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-23 16:41:36 -0400
commit0345f93138b2224e0d7ce91fcffdb3dd23f364d7 (patch)
tree7cd37a309382dfc7dd6b028c2b1a88a181692a1c
parent8f2ddaac302a8ca364cb04efb19cd3b5cd058910 (diff)
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>
-rw-r--r--include/linux/socket.h1
-rw-r--r--net/compat.c2
-rw-r--r--net/socket.c8
3 files changed, 9 insertions, 2 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h
index fab4d0ddf4ed..c9852ef7e317 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -51,6 +51,7 @@ struct msghdr {
51 void *msg_control; /* ancillary data */ 51 void *msg_control; /* ancillary data */
52 __kernel_size_t msg_controllen; /* ancillary data buffer length */ 52 __kernel_size_t msg_controllen; /* ancillary data buffer length */
53 unsigned int msg_flags; /* flags on received message */ 53 unsigned int msg_flags; /* flags on received message */
54 struct kiocb *msg_iocb; /* ptr to iocb for async requests */
54}; 55};
55 56
56struct user_msghdr { 57struct user_msghdr {
diff --git a/net/compat.c b/net/compat.c
index 13c0c9a25cd9..c4b6b0f43d5d 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -79,6 +79,8 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
79 if (nr_segs > UIO_MAXIOV) 79 if (nr_segs > UIO_MAXIOV)
80 return -EMSGSIZE; 80 return -EMSGSIZE;
81 81
82 kmsg->msg_iocb = NULL;
83
82 err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE, 84 err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE,
83 compat_ptr(uiov), nr_segs, 85 compat_ptr(uiov), nr_segs,
84 UIO_FASTIOV, *iov, iov); 86 UIO_FASTIOV, *iov, iov);
diff --git a/net/socket.c b/net/socket.c
index 3e776776f42c..073809f4125f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -798,7 +798,8 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
798{ 798{
799 struct file *file = iocb->ki_filp; 799 struct file *file = iocb->ki_filp;
800 struct socket *sock = file->private_data; 800 struct socket *sock = file->private_data;
801 struct msghdr msg = {.msg_iter = *to}; 801 struct msghdr msg = {.msg_iter = *to,
802 .msg_iocb = iocb};
802 ssize_t res; 803 ssize_t res;
803 804
804 if (file->f_flags & O_NONBLOCK) 805 if (file->f_flags & O_NONBLOCK)
@@ -819,7 +820,8 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from)
819{ 820{
820 struct file *file = iocb->ki_filp; 821 struct file *file = iocb->ki_filp;
821 struct socket *sock = file->private_data; 822 struct socket *sock = file->private_data;
822 struct msghdr msg = {.msg_iter = *from}; 823 struct msghdr msg = {.msg_iter = *from,
824 .msg_iocb = iocb};
823 ssize_t res; 825 ssize_t res;
824 826
825 if (iocb->ki_pos != 0) 827 if (iocb->ki_pos != 0)
@@ -1894,6 +1896,8 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
1894 if (nr_segs > UIO_MAXIOV) 1896 if (nr_segs > UIO_MAXIOV)
1895 return -EMSGSIZE; 1897 return -EMSGSIZE;
1896 1898
1899 kmsg->msg_iocb = NULL;
1900
1897 err = rw_copy_check_uvector(save_addr ? READ : WRITE, 1901 err = rw_copy_check_uvector(save_addr ? READ : WRITE,
1898 uiov, nr_segs, 1902 uiov, nr_segs,
1899 UIO_FASTIOV, *iov, iov); 1903 UIO_FASTIOV, *iov, iov);