]> git.hungrycats.org Git - linux/commitdiff
[PATCH] sparse: beginning of iovec cleanups - infrastructure
authorAlexander Viro <viro@www.linux.org.uk>
Fri, 16 Jul 2004 05:04:13 +0000 (22:04 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 16 Jul 2004 05:04:13 +0000 (22:04 -0700)
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.

include/linux/net.h
net/socket.c

index a4684166dc0c991ff160aaa52e4084dfc4f8c113..cec1482f28e23cc9fd08f8db877dfab1cea18790 100644 (file)
@@ -142,6 +142,7 @@ struct net_proto_family {
 };
 
 struct iovec;
+struct kvec;
 
 extern int          sock_wake_async(struct socket *sk, int how, int band);
 extern int          sock_register(struct net_proto_family *fam);
@@ -169,6 +170,12 @@ extern int      net_ratelimit(void);
 extern unsigned long net_random(void);
 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
 #define SOCKOPS_WRAPPED(name) name
 #define SOCKOPS_WRAP(name, fam)
index d9e33663773909a23e2777c6114592666d38ddb2..5bb81ec300e2078d10bccd2c05b49375bbb9cea4 100644 (file)
@@ -559,6 +559,23 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
        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, 
                                 struct msghdr *msg, size_t size, int flags)
@@ -594,6 +611,25 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg,
        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)
 {
        kfree(iocb->private);
@@ -2069,3 +2105,5 @@ EXPORT_SYMBOL(sock_sendmsg);
 EXPORT_SYMBOL(sock_unregister);
 EXPORT_SYMBOL(sock_wake_async);
 EXPORT_SYMBOL(sockfd_lookup);
+EXPORT_SYMBOL(kernel_sendmsg);
+EXPORT_SYMBOL(kernel_recvmsg);