Commit 17047580 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] sparse: beginning of iovec cleanups - infrastructure

Beginning of iovec cleanups - added two helpers (kernel_{send,recv}msg)
that do sock_sendmsg/sock_recvmsg with kvec instead of iovec; basically,
they were abstracted from earlier afs patch.  They take kvec/length of
kvec as separate arguments, do set_fs(), stick kvec into msghdr and call
sock_...msg(). 

The next group of patches will switch network filesystems to use of kvec
for kernel data + use of these helpers.  Basically, the same thing we'd
done for afs.
parent 333306d0
...@@ -142,6 +142,7 @@ struct net_proto_family { ...@@ -142,6 +142,7 @@ struct net_proto_family {
}; };
struct iovec; struct iovec;
struct kvec;
extern int sock_wake_async(struct socket *sk, int how, int band); extern int sock_wake_async(struct socket *sk, int how, int band);
extern int sock_register(struct net_proto_family *fam); extern int sock_register(struct net_proto_family *fam);
...@@ -169,6 +170,12 @@ extern int net_ratelimit(void); ...@@ -169,6 +170,12 @@ extern int net_ratelimit(void);
extern unsigned long net_random(void); extern unsigned long net_random(void);
extern void net_srandom(unsigned long); extern void net_srandom(unsigned long);
extern int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t len);
extern int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num,
size_t len, int flags);
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
#define SOCKOPS_WRAPPED(name) name #define SOCKOPS_WRAPPED(name) name
#define SOCKOPS_WRAP(name, fam) #define SOCKOPS_WRAP(name, fam)
......
...@@ -559,6 +559,23 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) ...@@ -559,6 +559,23 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
return ret; return ret;
} }
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t size)
{
mm_segment_t oldfs = get_fs();
int result;
set_fs(KERNEL_DS);
/*
* the following is safe, since for compiler definitions of kvec and
* iovec are identical, yielding the same in-core layout and alignment
*/
msg->msg_iov = (struct iovec *)vec,
msg->msg_iovlen = num;
result = sock_sendmsg(sock, msg, size);
set_fs(oldfs);
return result;
}
static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock,
struct msghdr *msg, size_t size, int flags) struct msghdr *msg, size_t size, int flags)
...@@ -594,6 +611,25 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg, ...@@ -594,6 +611,25 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg,
return ret; return ret;
} }
int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num,
size_t size, int flags)
{
mm_segment_t oldfs = get_fs();
int result;
set_fs(KERNEL_DS);
/*
* the following is safe, since for compiler definitions of kvec and
* iovec are identical, yielding the same in-core layout and alignment
*/
msg->msg_iov = (struct iovec *)vec,
msg->msg_iovlen = num;
result = sock_recvmsg(sock, msg, size, flags);
set_fs(oldfs);
return result;
}
static void sock_aio_dtor(struct kiocb *iocb) static void sock_aio_dtor(struct kiocb *iocb)
{ {
kfree(iocb->private); kfree(iocb->private);
...@@ -2069,3 +2105,5 @@ EXPORT_SYMBOL(sock_sendmsg); ...@@ -2069,3 +2105,5 @@ EXPORT_SYMBOL(sock_sendmsg);
EXPORT_SYMBOL(sock_unregister); EXPORT_SYMBOL(sock_unregister);
EXPORT_SYMBOL(sock_wake_async); EXPORT_SYMBOL(sock_wake_async);
EXPORT_SYMBOL(sockfd_lookup); EXPORT_SYMBOL(sockfd_lookup);
EXPORT_SYMBOL(kernel_sendmsg);
EXPORT_SYMBOL(kernel_recvmsg);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment