netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch/bk] remove scm_cookie parameter to send/recvmsg
@ 2003-01-20 21:17 Benjamin LaHaise
  2003-01-21  5:14 ` David S. Miller
  0 siblings, 1 reply; 2+ messages in thread
From: Benjamin LaHaise @ 2003-01-20 21:17 UTC (permalink / raw)
  To: davem; +Cc: netdev

Hey Dave, please do a

	bk pull kernel.bkbits.net:/bcrl/net-2.5

The changeset removes the struct scm_cookie * from the esnd/recvmsg ops, 
as well as removing the struct from the sock_iocb.  This helps speed up 
tcp_bw in LMbench by elimnating the excess memset and credentials setup 
and teardown.  Cheers,

		-ben

This will update the following files:

 arch/ia64/ia32/sys_ia32.c         |    5 +-
 arch/parisc/kernel/sys_parisc32.c |    6 ++-
 arch/ppc64/kernel/sys_ppc32.c     |    6 ++-
 arch/s390x/kernel/linux32.c       |   11 +++--
 arch/sparc64/kernel/sys_sparc32.c |    5 +-
 arch/x86_64/ia32/socket32.c       |    5 +-
 drivers/net/pppoe.c               |    7 ++-
 fs/smbfs/sock.c                   |   72 ++----------------------------------
 include/linux/net.h               |   15 +++----
 include/net/bluetooth/bluetooth.h |    2 -
 include/net/inet_common.h         |    4 +-
 include/net/sock.h                |    9 +---
 net/appletalk/ddp.c               |    4 +-
 net/atm/common.c                  |    4 +-
 net/atm/common.h                  |    4 +-
 net/ax25/af_ax25.c                |    5 +-
 net/bluetooth/af_bluetooth.c      |    2 -
 net/bluetooth/bnep/core.c         |   29 +-------------
 net/bluetooth/hci_sock.c          |    5 +-
 net/bluetooth/l2cap.c             |    2 -
 net/bluetooth/rfcomm/core.c       |   31 +--------------
 net/bluetooth/rfcomm/sock.c       |    5 +-
 net/bluetooth/sco.c               |    2 -
 net/core/sock.c                   |    4 +-
 net/decnet/af_decnet.c            |    4 +-
 net/econet/af_econet.c            |    5 +-
 net/ipv4/af_inet.c                |    4 +-
 net/ipx/af_ipx.c                  |    4 +-
 net/irda/af_irda.c                |   22 +++++------
 net/key/af_key.c                  |    5 +-
 net/llc/af_llc.c                  |    7 +--
 net/netlink/af_netlink.c          |   29 +++++++++++---
 net/netrom/af_netrom.c            |    5 +-
 net/packet/af_packet.c            |    8 +---
 net/rose/af_rose.c                |    5 +-
 net/socket.c                      |   27 +++----------
 net/unix/af_unix.c                |   74 ++++++++++++++++++++++++++------------
 net/wanrouter/af_wanpipe.c        |    5 +-
 net/x25/af_x25.c                  |    4 +-
 39 files changed, 178 insertions(+), 274 deletions(-)

through these ChangeSets:

<bcrl@redhat.com> (03/01/20 1.946.1.1)
   Remove struct scm_cookie * from socket send/recvmsg() ops.  Credentials 
   are only used by af_unix and af_netlink anyways, so by only using them 
   in those paths we eliminate overhead from all other network protocols' 
   fastpaths.


through these patches:

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.946   -> 1.946.1.1
#	    net/llc/af_llc.c	1.32    -> 1.33   
#	net/bluetooth/rfcomm/core.c	1.8     -> 1.9    
#	arch/x86_64/ia32/socket32.c	1.3     -> 1.4    
#	  net/ipv4/af_inet.c	1.37    -> 1.38   
#	    net/ipx/af_ipx.c	1.22    -> 1.23   
#	net/bluetooth/af_bluetooth.c	1.11    -> 1.12   
#	 net/bluetooth/sco.c	1.8     -> 1.9    
#	    net/key/af_key.c	1.12    -> 1.13   
#	  net/irda/af_irda.c	1.35    -> 1.36   
#	arch/parisc/kernel/sys_parisc32.c	1.5     -> 1.6    
#	        net/socket.c	1.41    -> 1.42   
#	     fs/smbfs/sock.c	1.13    -> 1.14   
#	 include/linux/net.h	1.7     -> 1.8    
#	include/net/bluetooth/bluetooth.h	1.10    -> 1.11   
#	net/econet/af_econet.c	1.12    -> 1.13   
#	net/netrom/af_netrom.c	1.21    -> 1.22   
#	  net/rose/af_rose.c	1.18    -> 1.19   
#	net/netlink/af_netlink.c	1.15    -> 1.16   
#	net/decnet/af_decnet.c	1.20    -> 1.21   
#	net/bluetooth/hci_sock.c	1.14    -> 1.15   
#	arch/ia64/ia32/sys_ia32.c	1.36    -> 1.37   
#	  net/unix/af_unix.c	1.34    -> 1.35   
#	arch/sparc64/kernel/sys_sparc32.c	1.59    -> 1.60   
#	 drivers/net/pppoe.c	1.20    -> 1.21   
#	net/bluetooth/rfcomm/sock.c	1.9     -> 1.10   
#	net/packet/af_packet.c	1.18    -> 1.19   
#	net/bluetooth/bnep/core.c	1.9     -> 1.10   
#	net/bluetooth/l2cap.c	1.13    -> 1.14   
#	arch/ppc64/kernel/sys_ppc32.c	1.44    -> 1.45   
#	arch/s390x/kernel/linux32.c	1.33    -> 1.34   
#	  include/net/sock.h	1.29    -> 1.30   
#	     net/core/sock.c	1.14    -> 1.15   
#	include/net/inet_common.h	1.4     -> 1.5    
#	    net/atm/common.h	1.2     -> 1.3    
#	  net/ax25/af_ax25.c	1.17    -> 1.18   
#	    net/x25/af_x25.c	1.21    -> 1.22   
#	net/wanrouter/af_wanpipe.c	1.13    -> 1.14   
#	 net/appletalk/ddp.c	1.16    -> 1.17   
#	    net/atm/common.c	1.11    -> 1.12   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/01/16	ink@jurassic.park.msu.ru	1.944.1.1
# [PATCH] alpha PCI setup update
# 
# Until now, we were configuring all PCI resources from scratch.
# This patch allows to use unchanged PCI setup on platforms
# where the firmware does it reasonably well (titan and marvel).
# 
# [The patch to setup-bus.c that removes "FIXME" from here (ie makes
# pci_assign_unassigned_resources to match its name) exists at least
# for two months, but I've yet to convince Linus that it does the
# right thing...]
# 
# Ivan.
# --------------------------------------------
# 03/01/16	ink@jurassic.park.msu.ru	1.944.1.2
# [PATCH] alpha_remap_area_pages
# From Jeff.Wiedemeier@hp.com:
# 
# Add arch/alpha/mm/remap.c (__alpha_remap_area_pages).
# --------------------------------------------
# 03/01/16	ink@jurassic.park.msu.ru	1.944.1.3
# [PATCH] alpha titan update
# From Jeff.Wiedemeier@hp.com:
# 
# Update titan system support include AlphaServer DS25, AGP,
# enhanced machine check handling.
# --------------------------------------------
# 03/01/16	torvalds@home.transmeta.com	1.947
# Merge http://linux-voyager.bkbits.net/eisa-sysfs-2.5
# into home.transmeta.com:/home/torvalds/v2.5/linux
# --------------------------------------------
# 03/01/16	rth@kanga.twiddle.net	1.944.1.4
# [ALPHA] Use direct calls to titan_ioremap/unmap when building
# a titan specific kernel.
# --------------------------------------------
# 03/01/16	ink@jurassic.park.msu.ru	1.944.1.5
# [PATCH] alpha irq proc update
# From Jeff.Wiedemeier@hp.com:
# 
# - Only create smp_affinity /proc nodes if a set_affinity handler
#   is provided.
# - Limit the number of irq nodes that will be created in /proc
#   to avoid overfilling the /proc inode space.
# --------------------------------------------
# 03/01/16	ink@jurassic.park.msu.ru	1.944.1.6
# [PATCH] alpha smp callin
# From Jeff.Wiedemeier@hp.com:
# 
# Add platform-specific callin for SMP.
# --------------------------------------------
# 03/01/16	ak@muc.de	1.948
# [PATCH] x86_64 update
# 
# x86-64 updates for 2.5.58. Changes only x86-64 specific files.
# 
#  - Rewrote module allocation. Lots of bugs fixed. Module loading
#    should work now again.
#  - Kconfig help fixes from Randy Dunlap
#  - Makefile cleanups from Pavel Machek and Sam Ravnborg
#  - Assembly cleanups from Pavel
#  - defconfig update
#  - Better strlen_user/strnlen_user
#  - Merge with i386: new ptrace commands, 32bit vsyscall signal trampolines
# 		new deactivate_mm, add asm/bug.h
#  - Make sure initramfs is freed after booting (thanks to Kai for the hint)
#  - User per cpu data for profile counters (Ravikiran Thirumalai)
#  - 32bit compat_* updates from Stephen Rothwell
#  - Fix race in context switch. The exception handler for bogus segment
#    loads in __switch_to needs to keep interrupts disabled, otherwise an
#    interrupt can deadlock on scheduler locks.  Also make sure they don't
#    printk or set oops_in_progress during printk because printk does a
#    wake_up too.
#  - Disable 64bit GS base changes for processes.  I cannot get it to work
#    reliably.
#  - Clear IOPL on kernel entry
# --------------------------------------------
# 03/01/16	hch@sgi.com	1.949
# [PATCH] remove MOD_IN_USE
# 
# Another left-over from ancient module code, it was supposed to return
# non-zero if the module has a use count, but currently it always
# evaluates to 0.
# 
# There are a few users of different types:
# (1)  ioctl that perform a while(MOD_IN_USE) MOD_DEC_USE_COUNT loop.
#      Just rip them out, we now have forced module unloading.
# (2)  printk's that moan if the use-count in not zero in the exitfunc.
#      Just rip them out, this can't happen.
# (3)  if(MOD_IN_USE) MOD_DEC_USE_COUNT constructs in ->close of a few
#      serial drivers.  Just remove the conditional, we did a
#      MOD_INC_USE_COUNT in ->open.
# (4)  This one is interesting:  drivers/sbus/char/display7seg.c uses
#      the module use count to track openers.  Replace this with an
#      atomic_t.
# 
# In addition remove tons of stale comments in network driver that aren't
# understandable for anyone who doesn't know ancient Linux module semantics.
# --------------------------------------------
# 03/01/16	mbligh@aracnet.com	1.950
# [PATCH] (1/3) Minimal NUMA scheduler
# 
# Patch from Martin J. Bligh
# 
# This adds a small hook to the find_busiest_queue routine to allow us to
# specify a mask of which CPUs to search over. In the NUMA case, it will
# only balance inside the node (much cheaper to search, and stops tasks
# from bouncing across nodes, which is very costly). The cpus_to_balance
# routine is conditionally defined to ensure no impact to non-NUMA machines.
# 
# This is a tiny NUMA scheduler, but it needs the assistance of the second
# and third patches in order to spread tasks across nodes.
# --------------------------------------------
# 03/01/16	mbligh@aracnet.com	1.951
# [PATCH] (2/3) Initial load balancing
# 
# Patch from Michael Hohnbaum
# 
# This adds a hook, sched_balance_exec(), to the exec code, to make it
# place the exec'ed task on the least loaded queue. We have less state
# to move at exec time than fork time, so this is the cheapest point
# to cross-node migrate. Experience in Dynix/PTX and testing on Linux
# has confirmed that this is the cheapest time to move tasks between nodes.
# 
# It also macro-wraps changes to nr_running, to allow us to keep track of
# per-node nr_running as well. Again, no impact on non-NUMA machines.
# --------------------------------------------
# 03/01/16	mbligh@aracnet.com	1.952
# [PATCH] (3/3) NUMA rebalancer
# 
# Patch from Erich Focht
# 
# This adds a hook to rebalance globally across nodes every NODE_BALANCE_RATE
# iterations of the rebalancer. This allows us to easily tune on an architecture
# specific basis how often we wish to rebalance - machines with higher NUMA
# ratios (more expensive off-node access) will want to do this less often.
# It's currently set to 100 for NUMA-Q and 10 for other machines. If the
# imbalance between nodes is > 125%, we'll rebalance them. The hook for this
# is added to the NUMA definition of cpus_to_balance, so again, no impact
# on non-NUMA machines.
# --------------------------------------------
# 03/01/16	rth@kanga.twiddle.net	1.944.1.7
# [ALPHA] AGP infrastructure for AGP implemented in Alpha corelogic
# (Titan / Marvel), Kconfig and headers.
# 
# From Jeff Wiedemeier.
# --------------------------------------------
# 03/01/16	rth@kanga.twiddle.net	1.944.1.8
# [ALPHA] Marvel (AlphaServer ES47, ES80, GS1280) support.
# From Jeff.Wiedemeier@hp.com.
# --------------------------------------------
# 03/01/16	rth@kanga.twiddle.net	1.944.1.9
# [ALPHA] Fixups to Marvel and Titan for incomplete merging
# of AGP and SRMCONS patches.
# --------------------------------------------
# 03/01/16	rth@kanga.twiddle.net	1.944.1.10
# [ALPHA] Formatting cleanup, warning removal, move declarations
# to header files where they belong.
# --------------------------------------------
# 03/01/16	rth@kanga.twiddle.net	1.944.1.11
# [ALPHA] Correct io.h exports and inlining for marvel and titan.
# --------------------------------------------
# 03/01/16	rth@kanga.twiddle.net	1.953
# Merge kanga.twiddle.net:/home/rth/linux/linus-2.5
# into kanga.twiddle.net:/home/rth/linux/axp-2.5
# --------------------------------------------
# 03/01/16	Jeff.Wiedemeier@hp.com	1.954
# [PATCH] Fix marvel irq count computation.
# 
# Found a buglet in the marvel code -- doesn't change the number of IRQS
# just the logic to get there.. This applies on top of the other marvel
# code.
# 
# /jeff
# --------------------------------------------
# 03/01/16	torvalds@home.transmeta.com	1.955
# Merge bk://bk.arm.linux.org.uk
# into home.transmeta.com:/home/torvalds/v2.5/linux
# --------------------------------------------
# 03/01/16	torvalds@penguin.transmeta.com	1.956
# Linux v2.5.59
# --------------------------------------------
# 03/01/20	bcrl@redhat.com	1.946.1.1
# Remove struct scm_cookie * from socket send/recvmsg() ops.  Credentials 
# are only used by af_unix and af_netlink anyways, so by only using them 
# in those paths we eliminate overhead from all other network protocols' 
# fastpaths.
# --------------------------------------------
#
diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
--- a/arch/ia64/ia32/sys_ia32.c	Mon Jan 20 16:00:08 2003
+++ b/arch/ia64/ia32/sys_ia32.c	Mon Jan 20 16:00:08 2003
@@ -1649,20 +1649,21 @@
 	/* XXX This code needs massive updating... -DaveM */
 	lock_kernel();
 	{
+		struct scm_cookie scm;
 		struct sock_iocb *si;
 		struct kiocb iocb;
 
 		init_sync_kiocb(&iocb, NULL);
 		si = kiocb_to_siocb(&iocb);
 		si->sock = sock;
-		si->scm = &si->async_scm;
+		si->scm = &scm;
 		si->msg = &msg_sys;
 		si->size = total_len;
 		si->flags = flags;
 		memset(si->scm, 0, sizeof(*si->scm));
 
 		err = sock->ops->recvmsg(&iocb, sock, &msg_sys, total_len,
-					 flags, si->scm);
+					 flags);
 		if (-EIOCBQUEUED == err)
 			err = wait_on_sync_kiocb(&iocb);
 
diff -Nru a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c
--- a/arch/parisc/kernel/sys_parisc32.c	Mon Jan 20 16:00:07 2003
+++ b/arch/parisc/kernel/sys_parisc32.c	Mon Jan 20 16:00:07 2003
@@ -1600,21 +1600,23 @@
 	if (sock != NULL) {
 		struct sock_iocb *si;
 		struct kiocb iocb;
+		struct scm_cookie scm;
 
 		if (sock->file->f_flags & O_NONBLOCK)
 			user_flags |= MSG_DONTWAIT;
 
+		memset(&scm, 0, sizeof(scm));
 		init_sync_kiocb(&iocb, NULL);
 		si = kiocb_to_siocb(&iocb);
 		si->sock = sock;
-		si->scm = &si->async_scm;
+		si->scm = &scm;
 		si->msg = &kern_msg;
 		si->size = total_len;
 		si->flags = user_flags;
 		memset(si->scm, 0, sizeof(*si->scm));
 
 		err = sock->ops->recvmsg(&iocb, sock, &kern_msg, total_len,
-					 user_flags, si->scm);
+					 user_flags);
 		if (-EIOCBQUEUED == err)
 			err = wait_on_sync_kiocb(&iocb);
 
diff -Nru a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c
--- a/arch/ppc64/kernel/sys_ppc32.c	Mon Jan 20 16:00:08 2003
+++ b/arch/ppc64/kernel/sys_ppc32.c	Mon Jan 20 16:00:08 2003
@@ -2833,21 +2833,23 @@
 	if (sock != NULL) {
 		struct sock_iocb *si;
 		struct kiocb iocb;
+		struct scm_cookie scm;
 
 		if (sock->file->f_flags & O_NONBLOCK)
 			user_flags |= MSG_DONTWAIT;
 
+		memset(&scm, 0, sizeof(scm));
 		init_sync_kiocb(&iocb, NULL);
 		si = kiocb_to_siocb(&iocb);
 		si->sock = sock;
-		si->scm = &si->async_scm;
+		si->scm = &scm;
 		si->msg = &kern_msg;
 		si->size = total_len;
 		si->flags = user_flags;
 		memset(si->scm, 0, sizeof(*si->scm));
 
 		err = sock->ops->recvmsg(&iocb, sock, &kern_msg, total_len,
-					 user_flags, si->scm);
+					 user_flags);
 		if (-EIOCBQUEUED == err)
 			err = wait_on_sync_kiocb(&iocb);
 
diff -Nru a/arch/s390x/kernel/linux32.c b/arch/s390x/kernel/linux32.c
--- a/arch/s390x/kernel/linux32.c	Mon Jan 20 16:00:08 2003
+++ b/arch/s390x/kernel/linux32.c	Mon Jan 20 16:00:08 2003
@@ -2390,24 +2390,25 @@
 {
 	struct sock_iocb *si;
 	struct kiocb iocb;
+	struct scm_cookie scm;
 
 	init_sync_kiocb(&iocb, NULL);
 
 	si = kiocb_to_siocb(&iocb);
 	si->sock = sock;
-	si->scm = &si->async_scm;
+	si->scm = &scm;
 	si->msg = msg;
 	si->size = size;
 	si->flags = flags;
 
 	memset(si->scm, 0, sizeof(*si->scm));
 
-	size = sock->ops->recvmsg(&iocb, sock, msg, size, flags, si->scm);
-	if (size >= 0)
-		scm_recv32(sock, msg, si->scm, flags, cmsg_ptr);
-
+	size = sock->ops->recvmsg(&iocb, sock, msg, size, flags);
 	if (-EIOCBQUEUED == size)
 		size = wait_on_sync_kiocb(&iocb);
+
+	if (size >= 0)
+		scm_recv32(sock, msg, si->scm, flags, cmsg_ptr);
 
 	return size;
 }
diff -Nru a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c
--- a/arch/sparc64/kernel/sys_sparc32.c	Mon Jan 20 16:00:08 2003
+++ b/arch/sparc64/kernel/sys_sparc32.c	Mon Jan 20 16:00:08 2003
@@ -2421,6 +2421,7 @@
 	if (sock != NULL) {
 		struct sock_iocb *si;
 		struct kiocb iocb;
+		struct scm_cookie scm;
 
 		if (sock->file->f_flags & O_NONBLOCK)
 			user_flags |= MSG_DONTWAIT;
@@ -2428,14 +2429,14 @@
 		init_sync_kiocb(&iocb, NULL);
 		si = kiocb_to_siocb(&iocb);
 		si->sock = sock;
-		si->scm = &si->async_scm;
+		si->scm = &scm;
 		si->msg = &kern_msg;
 		si->size = total_len;
 		si->flags = user_flags;
 		memset(si->scm, 0, sizeof(*si->scm));
 
 		err = sock->ops->recvmsg(&iocb, sock, &kern_msg, total_len,
-					 user_flags, si->scm);
+					 user_flags);
 		if (-EIOCBQUEUED == err)
 			err = wait_on_sync_kiocb(&iocb);
 
diff -Nru a/arch/x86_64/ia32/socket32.c b/arch/x86_64/ia32/socket32.c
--- a/arch/x86_64/ia32/socket32.c	Mon Jan 20 16:00:07 2003
+++ b/arch/x86_64/ia32/socket32.c	Mon Jan 20 16:00:07 2003
@@ -442,6 +442,7 @@
 	if (sock != NULL) {
 		struct sock_iocb *si;
 		struct kiocb iocb;
+		struct scm_cookie scm;
 
 		if (sock->file->f_flags & O_NONBLOCK)
 			user_flags |= MSG_DONTWAIT;
@@ -449,14 +450,14 @@
 		init_sync_kiocb(&iocb, NULL);
 		si = kiocb_to_siocb(&iocb);
 		si->sock = sock;
-		si->scm = &si->async_scm;
+		si->scm = &scm;
 		si->msg = &kern_msg;
 		si->size = total_len;
 		si->flags = user_flags;
 		memset(si->scm, 0, sizeof(*si->scm));
 
 		err = sock->ops->recvmsg(&iocb, sock, &kern_msg, total_len,
-					 user_flags, si->scm);
+					 user_flags);
 		if (-EIOCBQUEUED == err)
 			err = wait_on_sync_kiocb(&iocb);
 
diff -Nru a/drivers/net/pppoe.c b/drivers/net/pppoe.c
--- a/drivers/net/pppoe.c	Mon Jan 20 16:00:08 2003
+++ b/drivers/net/pppoe.c	Mon Jan 20 16:00:08 2003
@@ -777,7 +777,7 @@
 
 
 int pppoe_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
-		  int total_len, struct scm_cookie *scm)
+		  int total_len)
 {
 	struct sk_buff *skb = NULL;
 	struct sock *sk = sock->sk;
@@ -937,7 +937,8 @@
 
 struct ppp_channel_ops pppoe_chan_ops = { pppoe_xmit , NULL };
 
-int pppoe_rcvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, int total_len, int flags, struct scm_cookie *scm)
+int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock,
+		  struct msghdr *m, int total_len, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb = NULL;
@@ -1089,7 +1090,7 @@
     .setsockopt		= sock_no_setsockopt,
     .getsockopt		= sock_no_getsockopt,
     .sendmsg		= pppoe_sendmsg,
-    .recvmsg		= pppoe_rcvmsg,
+    .recvmsg		= pppoe_recvmsg,
     .mmap		= sock_no_mmap
 };
 
diff -Nru a/fs/smbfs/sock.c b/fs/smbfs/sock.c
--- a/fs/smbfs/sock.c	Mon Jan 20 16:00:07 2003
+++ b/fs/smbfs/sock.c	Mon Jan 20 16:00:07 2003
@@ -41,8 +41,6 @@
 {
 	struct iovec iov;
 	struct msghdr msg;
-	struct kiocb iocb;
-	struct sock_iocb *si;
 	mm_segment_t fs;
 
 	fs = get_fs();
@@ -58,21 +56,7 @@
 	iov.iov_base = ubuf;
 	iov.iov_len = size;
 
-	init_sync_kiocb(&iocb, NULL);
-	si = kiocb_to_siocb(&iocb);
-	si->sock = socket;
-	si->scm = &si->async_scm;
-	si->msg = &msg;
-	si->size = size;
-	si->flags = flags;
-
-	memset(si->scm, 0, sizeof(*si->scm));
-
-	size = socket->ops->recvmsg(&iocb, socket, &msg, size, flags, si->scm);
-	if (size >= 0)
-		scm_recv(socket, &msg, si->scm, flags);
-	if (-EIOCBQUEUED == size)
-		size = wait_on_sync_kiocb(&iocb);
+	size = sock_recvmsg(socket, &msg, size, flags);
 
 	set_fs(fs);
 	return size;
@@ -299,8 +283,6 @@
 	unsigned int flags;
 	struct iovec iov;
 	struct msghdr msg;
-	struct kiocb iocb;
-	struct sock_iocb *si;
 	mm_segment_t fs;
 	int rlen = smb_len(server->header) - server->smb_read + 4;
 	int result = -EIO;
@@ -327,21 +309,7 @@
 	if (rlen > PAGE_SIZE)
 		rlen = PAGE_SIZE;
 
-	init_sync_kiocb(&iocb, NULL);
-	si = kiocb_to_siocb(&iocb);
-	si->sock = sock;
-	si->scm = &si->async_scm;
-	si->msg = &msg;
-	si->size = rlen;
-	si->flags = flags;
-
-	memset(si->scm, 0, sizeof(*si->scm));
-
-	result = sock->ops->recvmsg(&iocb, sock, &msg, rlen, flags, si->scm);
-	if (result >= 0)
-		scm_recv(sock, &msg, si->scm, flags);
-	if (-EIOCBQUEUED == result)
-		result = wait_on_sync_kiocb(&iocb);
+	result = sock_recvmsg(sock, &msg, rlen, flags);
 
 	set_fs(fs);
 
@@ -370,8 +338,6 @@
 	unsigned int flags;
 	struct iovec iov[4];
 	struct msghdr msg;
-	struct kiocb iocb;
-	struct sock_iocb *si;
 	mm_segment_t fs;
 	int rlen;
 	int result = -EIO;
@@ -398,21 +364,7 @@
 	if (req->rq_rlen < rlen)
 		rlen = req->rq_rlen;
 
-	init_sync_kiocb(&iocb, NULL);
-	si = kiocb_to_siocb(&iocb);
-	si->sock = sock;
-	si->scm = &si->async_scm;
-	si->msg = &msg;
-	si->size = rlen;
-	si->flags = flags;
-
-	memset(si->scm, 0, sizeof(*si->scm));
-
-	result = sock->ops->recvmsg(&iocb, sock, &msg, rlen, flags, si->scm);
-	if (result >= 0)
-		scm_recv(sock, &msg, si->scm, flags);
-	if (-EIOCBQUEUED == result)
-		result = wait_on_sync_kiocb(&iocb);
+	result = sock_recvmsg(sock, &msg, rlen, flags);
 
 	set_fs(fs);
 
@@ -440,8 +392,6 @@
 	mm_segment_t fs;
 	struct smb_sb_info *server = req->rq_server;
 	struct socket *sock;
-	struct kiocb iocb;
-	struct sock_iocb *si;
 	struct msghdr msg;
         int slen = req->rq_slen - req->rq_bytes_sent;
 	int result = -EIO;
@@ -465,23 +415,9 @@
 	if (req->rq_bytes_sent)
 		smb_move_iov(&msg, iov, req->rq_bytes_sent);
 
-	init_sync_kiocb(&iocb, NULL);
-	si = kiocb_to_siocb(&iocb);
-	si->scm = &si->async_scm;
-	si->sock = sock;
-	si->msg = &msg;
-	si->size = slen;
-
 	fs = get_fs();
 	set_fs(get_ds());
-	result = scm_send(sock, &msg, si->scm);
-	if (result >= 0) {
-		result = sock->ops->sendmsg(&iocb, sock, &msg, slen, si->scm);
-		if (-EIOCBQUEUED != result)
-			scm_destroy(si->scm);
-	}
-	if (-EIOCBQUEUED == result)
-		result = wait_on_sync_kiocb(&iocb);
+	result = sock_sendmsg(sock, &msg, slen);
 	set_fs(fs);
 
 	if (result >= 0) {
diff -Nru a/include/linux/net.h b/include/linux/net.h
--- a/include/linux/net.h	Mon Jan 20 16:00:07 2003
+++ b/include/linux/net.h	Mon Jan 20 16:00:07 2003
@@ -78,7 +78,6 @@
 	unsigned char		passcred;
 };
 
-struct scm_cookie;
 struct vm_area_struct;
 struct page;
 struct kiocb;
@@ -106,11 +105,9 @@
   int	(*getsockopt)	(struct socket *sock, int level, int optname,
 			 char *optval, int *optlen);
   int   (*sendmsg)	(struct kiocb *iocb, struct socket *sock,
-			 struct msghdr *m, int total_len,
-			 struct scm_cookie *scm);
+			 struct msghdr *m, int total_len);
   int   (*recvmsg)	(struct kiocb *iocb, struct socket *sock,
-			 struct msghdr *m, int total_len, int flags,
-			 struct scm_cookie *scm);
+			 struct msghdr *m, int total_len, int flags);
   int	(*mmap)		(struct file *file, struct socket *sock, struct vm_area_struct * vma);
   ssize_t (*sendpage)	(struct socket *sock, struct page *page, int offset, size_t size, int flags);
 };
@@ -202,10 +199,10 @@
 			 char *optval, int optlen), (sock, level, optname, optval, optlen)) \
 SOCKCALL_WRAP(name, getsockopt, (struct socket *sock, int level, int optname, \
 			 char *optval, int *optlen), (sock, level, optname, optval, optlen)) \
-SOCKCALL_WRAP(name, sendmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, int len, struct scm_cookie *scm), \
-	      (iocb, sock, m, len, scm)) \
-SOCKCALL_WRAP(name, recvmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, int len, int flags, struct scm_cookie *scm), \
-	      (iocb, sock, m, len, flags, scm)) \
+SOCKCALL_WRAP(name, sendmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, int len), \
+	      (iocb, sock, m, len)) \
+SOCKCALL_WRAP(name, recvmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, int len, int flags), \
+	      (iocb, sock, m, len, flags)) \
 SOCKCALL_WRAP(name, mmap, (struct file *file, struct socket *sock, struct vm_area_struct *vma), \
 	      (file, sock, vma)) \
 	      \
diff -Nru a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
--- a/include/net/bluetooth/bluetooth.h	Mon Jan 20 16:00:07 2003
+++ b/include/net/bluetooth/bluetooth.h	Mon Jan 20 16:00:07 2003
@@ -128,7 +128,7 @@
 struct sock *bt_sock_alloc(struct socket *sock, int proto, int pi_size, int prio);
 void bt_sock_link(struct bt_sock_list *l, struct sock *s);
 void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
-int  bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len, int flags, struct scm_cookie *scm);
+int  bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len, int flags);
 uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait);
 int  bt_sock_w4_connect(struct sock *sk, int flags);
 
diff -Nru a/include/net/inet_common.h b/include/net/inet_common.h
--- a/include/net/inet_common.h	Mon Jan 20 16:00:08 2003
+++ b/include/net/inet_common.h	Mon Jan 20 16:00:08 2003
@@ -23,11 +23,11 @@
 extern int			inet_recvmsg(struct kiocb *iocb,
 					     struct socket *sock, 
 					     struct msghdr *ubuf, 
-					     int size, int flags, struct scm_cookie *scm);
+					     int size, int flags);
 extern int			inet_sendmsg(struct kiocb *iocb,
 					     struct socket *sock, 
 					     struct msghdr *msg, 
-					     int size, struct scm_cookie *scm);
+					     int size);
 extern int			inet_shutdown(struct socket *sock, int how);
 extern unsigned int		inet_poll(struct file * file, struct socket *sock, struct poll_table_struct *wait);
 extern int			inet_setsockopt(struct socket *sock, int level,
diff -Nru a/include/net/sock.h b/include/net/sock.h
--- a/include/net/sock.h	Mon Jan 20 16:00:08 2003
+++ b/include/net/sock.h	Mon Jan 20 16:00:08 2003
@@ -51,7 +51,6 @@
 
 #include <asm/atomic.h>
 #include <net/dst.h>
-#include <net/scm.h>
 
 /*
  * This structure really needs to be cleaned up.
@@ -305,9 +304,9 @@
 	int			size;
 	struct socket		*sock;
 	struct sock		*sk;
+	struct scm_cookie	*scm;
 	struct msghdr		*msg, async_msg;
 	struct iovec		async_iov;
-	struct scm_cookie	*scm, async_scm;
 };
 
 static inline struct sock_iocb *kiocb_to_siocb(struct kiocb *iocb)
@@ -433,11 +432,9 @@
 extern int			sock_no_setsockopt(struct socket *, int, int,
 						   char *, int);
 extern int                      sock_no_sendmsg(struct kiocb *, struct socket *,
-						struct msghdr *, int,
-						struct scm_cookie *);
+						struct msghdr *, int);
 extern int                      sock_no_recvmsg(struct kiocb *, struct socket *,
-						struct msghdr *, int, int,
-						struct scm_cookie *);
+						struct msghdr *, int, int);
 extern int			sock_no_mmap(struct file *file,
 					     struct socket *sock,
 					     struct vm_area_struct *vma);
diff -Nru a/net/appletalk/ddp.c b/net/appletalk/ddp.c
--- a/net/appletalk/ddp.c	Mon Jan 20 16:00:08 2003
+++ b/net/appletalk/ddp.c	Mon Jan 20 16:00:08 2003
@@ -1492,7 +1492,7 @@
 }
 
 static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
-			 int len, struct scm_cookie *scm)
+			 int len)
 {
 	struct sock *sk = sock->sk;
 	struct atalk_sock *at = at_sk(sk);
@@ -1651,7 +1651,7 @@
 }
 
 static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
-			 int size, int flags, struct scm_cookie *scm)
+			 int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sockaddr_at *sat = (struct sockaddr_at *)msg->msg_name;
diff -Nru a/net/atm/common.c b/net/atm/common.c
--- a/net/atm/common.c	Mon Jan 20 16:00:08 2003
+++ b/net/atm/common.c	Mon Jan 20 16:00:08 2003
@@ -337,7 +337,7 @@
 
 
 int atm_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
-		int total_len, int flags, struct scm_cookie *scm)
+		int total_len, int flags)
 {
 	DECLARE_WAITQUEUE(wait,current);
 	struct atm_vcc *vcc;
@@ -418,7 +418,7 @@
 
 
 int atm_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
-		int total_len, struct scm_cookie *scm)
+		int total_len)
 {
 	DECLARE_WAITQUEUE(wait,current);
 	struct atm_vcc *vcc;
diff -Nru a/net/atm/common.h b/net/atm/common.h
--- a/net/atm/common.h	Mon Jan 20 16:00:08 2003
+++ b/net/atm/common.h	Mon Jan 20 16:00:08 2003
@@ -14,9 +14,9 @@
 int atm_release(struct socket *sock);
 int atm_connect(struct socket *sock,int itf,short vpi,int vci);
 int atm_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
-		int total_len, int flags, struct scm_cookie *scm);
+		int total_len, int flags);
 int atm_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
-		int total_len, struct scm_cookie *scm);
+		int total_len);
 unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait);
 int atm_ioctl(struct socket *sock,unsigned int cmd,unsigned long arg);
 int atm_setsockopt(struct socket *sock,int level,int optname,char *optval,
diff -Nru a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
--- a/net/ax25/af_ax25.c	Mon Jan 20 16:00:08 2003
+++ b/net/ax25/af_ax25.c	Mon Jan 20 16:00:08 2003
@@ -1411,8 +1411,7 @@
 }
 
 static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
-			struct msghdr *msg, int len,
-	struct scm_cookie *scm)
+			struct msghdr *msg, int len)
 {
 	struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
 	struct sock *sk = sock->sk;
@@ -1590,7 +1589,7 @@
 }
 
 static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
-	struct msghdr *msg, int size, int flags, struct scm_cookie *scm)
+	struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb;
diff -Nru a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
--- a/net/bluetooth/af_bluetooth.c	Mon Jan 20 16:00:07 2003
+++ b/net/bluetooth/af_bluetooth.c	Mon Jan 20 16:00:07 2003
@@ -212,7 +212,7 @@
 }
 
 int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
-	struct msghdr *msg, int len, int flags, struct scm_cookie *scm)
+	struct msghdr *msg, int len, int flags)
 {
 	int noblock = flags & MSG_DONTWAIT;
 	struct sock *sk = sock->sk;
diff -Nru a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c
--- a/net/bluetooth/bnep/core.c	Mon Jan 20 16:00:08 2003
+++ b/net/bluetooth/bnep/core.c	Mon Jan 20 16:00:08 2003
@@ -97,26 +97,12 @@
 
 static int bnep_send(struct bnep_session *s, void *data, size_t len)
 {
-	struct kiocb iocb;
-	struct sock_iocb *si;
 	struct socket *sock = s->sock;
 	struct iovec iv = { data, len };
-	int err;
 
 	s->msg.msg_iov    = &iv;
 	s->msg.msg_iovlen = 1;
-	init_sync_kiocb(&iocb, NULL);
-	si = kiocb_to_siocb(&iocb);
-	si->scm = NULL;
-	si->sock = sock;
-	si->msg = &s->msg;
-	si->size = len;
-
-	err = sock->ops->sendmsg(&iocb, sock, &s->msg, len, NULL);
-	if (-EIOCBQUEUED == err)
-		err = wait_on_sync_kiocb(&iocb);
-
-	return err;
+	return sock_sendmsg(sock, &s->msg, len);
 }
 
 static int bnep_send_rsp(struct bnep_session *s, u8 ctrl, u16 resp)
@@ -442,20 +428,9 @@
 	
 	/* FIXME: linearize skb */
 	{
-		struct kiocb iocb;
-		struct sock_iocb *si;
-	
 		s->msg.msg_iov    = iv;
 		s->msg.msg_iovlen = il;
-		init_sync_kiocb(&iocb, NULL);
-		si = kiocb_to_siocb(&iocb);
-		si->scm = NULL;
-		si->sock = sock;
-		si->msg = &s->msg;
-		si->size = len;
-		len = sock->ops->sendmsg(&iocb, sock, &s->msg, len, NULL);
-		if (-EIOCBQUEUED == len)
-			len = wait_on_sync_kiocb(&iocb);
+		len = sock_sendmsg(sock, &s->msg, len);
 	}
 	kfree_skb(skb);
 
diff -Nru a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
--- a/net/bluetooth/hci_sock.c	Mon Jan 20 16:00:08 2003
+++ b/net/bluetooth/hci_sock.c	Mon Jan 20 16:00:08 2003
@@ -316,7 +316,7 @@
         	put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(skb->stamp), &skb->stamp);
 }
  
-static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len, int flags, struct scm_cookie *scm)
+static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len, int flags)
 {
 	int noblock = flags & MSG_DONTWAIT;
 	struct sock *sk = sock->sk;
@@ -352,8 +352,7 @@
 	return err ? : copied;
 }
 
-static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len,
-                            struct scm_cookie *scm)
+static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct hci_dev *hdev;
diff -Nru a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
--- a/net/bluetooth/l2cap.c	Mon Jan 20 16:00:08 2003
+++ b/net/bluetooth/l2cap.c	Mon Jan 20 16:00:08 2003
@@ -709,7 +709,7 @@
 	return err;
 }
 
-static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm)
+static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	int err = 0;
diff -Nru a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
--- a/net/bluetooth/rfcomm/core.c	Mon Jan 20 16:00:07 2003
+++ b/net/bluetooth/rfcomm/core.c	Mon Jan 20 16:00:07 2003
@@ -604,29 +604,17 @@
 /* ---- RFCOMM frame sending ---- */
 static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len)
 {
-	struct kiocb iocb;
-	struct sock_iocb *si;
 	struct socket *sock = s->sock;
 	struct iovec iv = { data, len };
 	struct msghdr msg;
-	int err;
 
 	BT_DBG("session %p len %d", s, len);
 
 	memset(&msg, 0, sizeof(msg));
 	msg.msg_iovlen = 1;
 	msg.msg_iov = &iv;
-	init_sync_kiocb(&iocb, NULL);
-	si = kiocb_to_siocb(&iocb);
-	si->scm = NULL;
-	si->sock = sock;
-	si->msg = &msg;
-	si->size = len;
-
-	err = sock->ops->sendmsg(&iocb, sock, &msg, len, NULL);
-	if (-EIOCBQUEUED == err)
-		err = wait_on_sync_kiocb(&iocb);
-	return err;
+
+	return sock_sendmsg(sock, &msg, len);
 }
 
 static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci)
@@ -838,13 +826,10 @@
 
 static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len)
 {
-	struct kiocb iocb;
-	struct sock_iocb *si;
 	struct socket *sock = s->sock;
 	struct iovec iv[3];
 	struct msghdr msg;
 	unsigned char hdr[5], crc[1];
-	int err;
 
 	if (len > 125)
 		return -EINVAL;
@@ -869,18 +854,8 @@
 	memset(&msg, 0, sizeof(msg));
 	msg.msg_iovlen = 3;
 	msg.msg_iov = iv;
-	init_sync_kiocb(&iocb, NULL);
-	si = kiocb_to_siocb(&iocb);
-	si->scm = NULL;
-	si->sock = sock;
-	si->msg = &msg;
-	si->size = 6 + len;
-
-	err = sock->ops->sendmsg(&iocb, sock, &msg, 6 + len, NULL);
-	if (-EIOCBQUEUED == err)
-		err = wait_on_sync_kiocb(&iocb);
 
-	return err;
+	return sock_sendmsg(sock, &msg, 6 + len);
 }
 
 static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits)
diff -Nru a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
--- a/net/bluetooth/rfcomm/sock.c	Mon Jan 20 16:00:08 2003
+++ b/net/bluetooth/rfcomm/sock.c	Mon Jan 20 16:00:08 2003
@@ -479,7 +479,7 @@
 }
 
 static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
-			       struct msghdr *msg, int len, struct scm_cookie *scm)
+			       struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
@@ -553,8 +553,7 @@
 }
 
 static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
-			       struct msghdr *msg, int size, int flags,
-			       struct scm_cookie *scm)
+			       struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	int target, err = 0, copied = 0;
diff -Nru a/net/bluetooth/sco.c b/net/bluetooth/sco.c
--- a/net/bluetooth/sco.c	Mon Jan 20 16:00:07 2003
+++ b/net/bluetooth/sco.c	Mon Jan 20 16:00:07 2003
@@ -632,7 +632,7 @@
 	return 0;
 }
 
-static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm)
+static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	int err = 0;
diff -Nru a/net/core/sock.c b/net/core/sock.c
--- a/net/core/sock.c	Mon Jan 20 16:00:08 2003
+++ b/net/core/sock.c	Mon Jan 20 16:00:08 2003
@@ -960,13 +960,13 @@
 }
 
 int sock_no_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
-		    int flags, struct scm_cookie *scm)
+		    int flags)
 {
 	return -EOPNOTSUPP;
 }
 
 int sock_no_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
-		    int len, int flags, struct scm_cookie *scm)
+		    int len, int flags)
 {
 	return -EOPNOTSUPP;
 }
diff -Nru a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
--- a/net/decnet/af_decnet.c	Mon Jan 20 16:00:08 2003
+++ b/net/decnet/af_decnet.c	Mon Jan 20 16:00:08 2003
@@ -1718,7 +1718,7 @@
 
 
 static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
-	struct msghdr *msg, int size, int flags, struct scm_cookie *scm)
+	struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct dn_scp *scp = DN_SK(sk);
@@ -1889,7 +1889,7 @@
 }
 
 static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
-	   struct msghdr *msg, int size, struct scm_cookie *scm)
+	   struct msghdr *msg, int size)
 {
 	struct sock *sk = sock->sk;
 	struct dn_scp *scp = DN_SK(sk);
diff -Nru a/net/econet/af_econet.c b/net/econet/af_econet.c
--- a/net/econet/af_econet.c	Mon Jan 20 16:00:07 2003
+++ b/net/econet/af_econet.c	Mon Jan 20 16:00:07 2003
@@ -126,8 +126,7 @@
  */
 
 static int econet_recvmsg(struct kiocb *iocb, struct socket *sock,
-			  struct msghdr *msg, int len, int flags,
-			  struct scm_cookie *scm)
+			  struct msghdr *msg, int len, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb;
@@ -260,7 +259,7 @@
  */
 
 static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
-			  struct msghdr *msg, int len, struct scm_cookie *scm)
+			  struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct sockaddr_ec *saddr=(struct sockaddr_ec *)msg->msg_name;
diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
--- a/net/ipv4/af_inet.c	Mon Jan 20 16:00:07 2003
+++ b/net/ipv4/af_inet.c	Mon Jan 20 16:00:07 2003
@@ -730,7 +730,7 @@
 
 
 int inet_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
-		 int size, int flags, struct scm_cookie *scm)
+		 int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	int addr_len = 0;
@@ -745,7 +745,7 @@
 
 
 int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
-		 int size, struct scm_cookie *scm)
+		 int size)
 {
 	struct sock *sk = sock->sk;
 
diff -Nru a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c
--- a/net/ipx/af_ipx.c	Mon Jan 20 16:00:07 2003
+++ b/net/ipx/af_ipx.c	Mon Jan 20 16:00:07 2003
@@ -2010,7 +2010,7 @@
 }
 
 static int ipx_sendmsg(struct kiocb *iocb, struct socket *sock,
-	struct msghdr *msg, int len, struct scm_cookie *scm)
+	struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct ipx_opt *ipxs = ipx_sk(sk);
@@ -2070,7 +2070,7 @@
 
 
 static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
-		struct msghdr *msg, int size, int flags, struct scm_cookie *scm)
+		struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct ipx_opt *ipxs = ipx_sk(sk);
diff -Nru a/net/irda/af_irda.c b/net/irda/af_irda.c
--- a/net/irda/af_irda.c	Mon Jan 20 16:00:07 2003
+++ b/net/irda/af_irda.c	Mon Jan 20 16:00:07 2003
@@ -1253,14 +1253,14 @@
 }
 
 /*
- * Function irda_sendmsg (iocb, sock, msg, len, scm)
+ * Function irda_sendmsg (iocb, sock, msg, len)
  *
  *    Send message down to TinyTP. This function is used for both STREAM and
  *    SEQPACK services. This is possible since it forces the client to
  *    fragment the message if necessary
  */
 static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
-			struct msghdr *msg, int len, struct scm_cookie *scm)
+			struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct irda_sock *self;
@@ -1326,14 +1326,13 @@
 }
 
 /*
- * Function irda_recvmsg_dgram (iocb, sock, msg, size, flags, scm)
+ * Function irda_recvmsg_dgram (iocb, sock, msg, size, flags)
  *
  *    Try to receive message and copy it to user. The frame is discarded
  *    after being read, regardless of how much the user actually read
  */
 static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock,
-			      struct msghdr *msg, int size, int flags,
-			      struct scm_cookie *scm)
+			      struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct irda_sock *self = irda_sk(sk);
@@ -1380,11 +1379,10 @@
 }
 
 /*
- * Function irda_recvmsg_stream (iocb, sock, msg, size, flags, scm)
+ * Function irda_recvmsg_stream (iocb, sock, msg, size, flags)
  */
 static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
-			       struct msghdr *msg, int size, int flags,
-			       struct scm_cookie *scm)
+			       struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct irda_sock *self = irda_sk(sk);
@@ -1504,14 +1502,14 @@
 }
 
 /*
- * Function irda_sendmsg_dgram (iocb, sock, msg, len, scm)
+ * Function irda_sendmsg_dgram (iocb, sock, msg, len)
  *
  *    Send message down to TinyTP for the unreliable sequenced
  *    packet service...
  *
  */
 static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
-			      struct msghdr *msg, int len, struct scm_cookie *scm)
+			      struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct irda_sock *self;
@@ -1570,14 +1568,14 @@
 }
 
 /*
- * Function irda_sendmsg_ultra (iocb, sock, msg, len, scm)
+ * Function irda_sendmsg_ultra (iocb, sock, msg, len)
  *
  *    Send message down to IrLMP for the unreliable Ultra
  *    packet service...
  */
 #ifdef CONFIG_IRDA_ULTRA
 static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
-			      struct msghdr *msg, int len, struct scm_cookie *scm)
+			      struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct irda_sock *self;
diff -Nru a/net/key/af_key.c b/net/key/af_key.c
--- a/net/key/af_key.c	Mon Jan 20 16:00:07 2003
+++ b/net/key/af_key.c	Mon Jan 20 16:00:07 2003
@@ -2141,8 +2141,7 @@
 }
 
 static int pfkey_sendmsg(struct kiocb *kiocb,
-			 struct socket *sock, struct msghdr *msg, int len,
-			 struct scm_cookie *scm)
+			 struct socket *sock, struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb = NULL;
@@ -2185,7 +2184,7 @@
 
 static int pfkey_recvmsg(struct kiocb *kiocb,
 			 struct socket *sock, struct msghdr *msg, int len,
-			 int flags, struct scm_cookie *scm)
+			 int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb;
diff -Nru a/net/llc/af_llc.c b/net/llc/af_llc.c
--- a/net/llc/af_llc.c	Mon Jan 20 16:00:07 2003
+++ b/net/llc/af_llc.c	Mon Jan 20 16:00:07 2003
@@ -672,14 +672,12 @@
  *	@msg: Various user space related information.
  *	@size: Size of user buffer.
  *	@flags: User specified flags.
- *	@scm: Unknown.
  *
  *	Copy received data to the socket user.
  *	Returns non-negative upon success, negative otherwise.
  */
 static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
-			  struct msghdr *msg, int size, int flags,
-			  struct scm_cookie *scm)
+			  struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name;
@@ -727,13 +725,12 @@
  *	@sock: Socket to transmit data from.
  *	@msg: Various user related information.
  *	@len: Length of data to transmit.
- *	@scm: Unknown.
  *
  *	Transmit data provided by the socket user.
  *	Returns non-negative upon success, negative otherwise.
  */
 static int llc_ui_sendmsg(struct kiocb *iocb, struct socket *sock,
-			  struct msghdr *msg, int len, struct scm_cookie *scm)
+			  struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct llc_opt *llc = llc_sk(sk);
diff -Nru a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
--- a/net/netlink/af_netlink.c	Mon Jan 20 16:00:08 2003
+++ b/net/netlink/af_netlink.c	Mon Jan 20 16:00:08 2003
@@ -584,10 +584,10 @@
 	read_unlock(&nl_table_lock);
 }
 
-static int netlink_sendmsg(struct kiocb *iocb, struct socket *sock,
-			   struct msghdr *msg, int len,
-			   struct scm_cookie *scm)
+static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
+			   struct msghdr *msg, int len)
 {
+	struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
 	struct sock *sk = sock->sk;
 	struct netlink_opt *nlk = nlk_sk(sk);
 	struct sockaddr_nl *addr=msg->msg_name;
@@ -595,10 +595,17 @@
 	u32 dst_groups;
 	struct sk_buff *skb;
 	int err;
+	struct scm_cookie scm;
 
 	if (msg->msg_flags&MSG_OOB)
 		return -EOPNOTSUPP;
 
+	if (NULL == siocb->scm)
+		siocb->scm = &scm;
+	err = scm_send(sock, msg, siocb->scm);
+	if (err < 0)
+		return err;
+
 	if (msg->msg_namelen) {
 		if (addr->nl_family != AF_NETLINK)
 			return -EINVAL;
@@ -629,7 +636,7 @@
 	NETLINK_CB(skb).groups	= nlk->groups;
 	NETLINK_CB(skb).dst_pid = dst_pid;
 	NETLINK_CB(skb).dst_groups = dst_groups;
-	memcpy(NETLINK_CREDS(skb), &scm->creds, sizeof(struct ucred));
+	memcpy(NETLINK_CREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
 
 	/* What can I do? Netlink is asynchronous, so that
 	   we will have to save current capabilities to
@@ -654,10 +661,12 @@
 	return err;
 }
 
-static int netlink_recvmsg(struct kiocb *iocb, struct socket *sock,
+static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
 			   struct msghdr *msg, int len,
-			   int flags, struct scm_cookie *scm)
+			   int flags)
 {
+	struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
+	struct scm_cookie scm;
 	struct sock *sk = sock->sk;
 	struct netlink_opt *nlk = nlk_sk(sk);
 	int noblock = flags&MSG_DONTWAIT;
@@ -693,11 +702,17 @@
 		msg->msg_namelen = sizeof(*addr);
 	}
 
-	scm->creds = *NETLINK_CREDS(skb);
+	if (NULL == siocb->scm) {
+		memset(&scm, 0, sizeof(scm));
+		siocb->scm = &scm;
+	}
+	siocb->scm->creds = *NETLINK_CREDS(skb);
 	skb_free_datagram(sk, skb);
 
 	if (nlk->cb && atomic_read(&sk->rmem_alloc) <= sk->rcvbuf / 2)
 		netlink_dump(sk);
+
+	scm_recv(sock, msg, siocb->scm, flags);
 
 out:
 	if (skb_queue_len(&sk->receive_queue) <= sk->rcvbuf/2) {
diff -Nru a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
--- a/net/netrom/af_netrom.c	Mon Jan 20 16:00:07 2003
+++ b/net/netrom/af_netrom.c	Mon Jan 20 16:00:08 2003
@@ -967,7 +967,7 @@
 }
 
 static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
-		      struct msghdr *msg, int len, struct scm_cookie *scm)
+		      struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	nr_cb *nr = nr_sk(sk);
@@ -1058,8 +1058,7 @@
 }
 
 static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
-		      struct msghdr *msg, int size, int flags,
-		      struct scm_cookie *scm)
+		      struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
diff -Nru a/net/packet/af_packet.c b/net/packet/af_packet.c
--- a/net/packet/af_packet.c	Mon Jan 20 16:00:08 2003
+++ b/net/packet/af_packet.c	Mon Jan 20 16:00:08 2003
@@ -280,8 +280,7 @@
  */
  
 static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
-			       struct msghdr *msg, int len,
-			       struct scm_cookie *scm)
+			       struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct sockaddr_pkt *saddr=(struct sockaddr_pkt *)msg->msg_name;
@@ -658,7 +657,7 @@
 
 
 static int packet_sendmsg(struct kiocb *iocb, struct socket *sock,
-			  struct msghdr *msg, int len, struct scm_cookie *scm)
+			  struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct sockaddr_ll *saddr=(struct sockaddr_ll *)msg->msg_name;
@@ -1013,8 +1012,7 @@
  */
 
 static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
-			  struct msghdr *msg, int len,
-			  int flags, struct scm_cookie *scm)
+			  struct msghdr *msg, int len, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb;
diff -Nru a/net/rose/af_rose.c b/net/rose/af_rose.c
--- a/net/rose/af_rose.c	Mon Jan 20 16:00:08 2003
+++ b/net/rose/af_rose.c	Mon Jan 20 16:00:08 2003
@@ -1026,7 +1026,7 @@
 }
 
 static int rose_sendmsg(struct kiocb *iocb, struct socket *sock,
-			struct msghdr *msg, int len, struct scm_cookie *scm)
+			struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	rose_cb *rose = rose_sk(sk);
@@ -1190,8 +1190,7 @@
 
 
 static int rose_recvmsg(struct kiocb *iocb, struct socket *sock,
-			struct msghdr *msg, int size, int flags,
-			struct scm_cookie *scm)
+			struct msghdr *msg, int size, int flags)
 {
 	struct sock *sk = sock->sk;
 	rose_cb *rose = rose_sk(sk);
diff -Nru a/net/socket.c b/net/socket.c
--- a/net/socket.c	Mon Jan 20 16:00:07 2003
+++ b/net/socket.c	Mon Jan 20 16:00:07 2003
@@ -89,7 +89,6 @@
 #include <asm/uaccess.h>
 
 #include <net/sock.h>
-#include <net/scm.h>
 #include <linux/netfilter.h>
 
 static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
@@ -517,23 +516,16 @@
 	sock->file=NULL;
 }
 
-static int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int size)
+static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int size)
 {
 	struct sock_iocb *si = kiocb_to_siocb(iocb);
-	int err;
 
-	si->scm = &si->async_scm;
 	si->sock = sock;
+	si->scm = NULL;
 	si->msg = msg;
 	si->size = size;
 
-	err = scm_send(sock, msg, si->scm);
-	if (err >= 0) {
-		err = sock->ops->sendmsg(iocb, sock, msg, size, si->scm);
-		if (-EIOCBQUEUED != err)
-			scm_destroy(si->scm);
-	}
-	return err;
+	return sock->ops->sendmsg(iocb, sock, msg, size);
 }
 
 int sock_sendmsg(struct socket *sock, struct msghdr *msg, int size)
@@ -549,24 +541,17 @@
 }
 
 
-int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int size, int flags)
+static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, int size, int flags)
 {
 	struct sock_iocb *si = kiocb_to_siocb(iocb);
 
 	si->sock = sock;
-	si->scm = &si->async_scm;
-	si->sock = sock;
+	si->scm = NULL;
 	si->msg = msg;
 	si->size = size;
 	si->flags = flags;
 
-	memset(si->scm, 0, sizeof(*si->scm));
-
-	size = sock->ops->recvmsg(iocb, sock, msg, size, flags, si->scm);
-	if (size >= 0)
-		scm_recv(sock, msg, si->scm, flags);
-
-	return size;
+	return sock->ops->recvmsg(iocb, sock, msg, size, flags);
 }
 
 int sock_recvmsg(struct socket *sock, struct msghdr *msg, int size, int flags)
diff -Nru a/net/unix/af_unix.c b/net/unix/af_unix.c
--- a/net/unix/af_unix.c	Mon Jan 20 16:00:08 2003
+++ b/net/unix/af_unix.c	Mon Jan 20 16:00:08 2003
@@ -1180,10 +1180,10 @@
  *	Send AF_UNIX data.
  */
 
-static int unix_dgram_sendmsg(struct kiocb *iocb, struct socket *sock,
-			      struct msghdr *msg, int len,
-			      struct scm_cookie *scm)
+static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
+			      struct msghdr *msg, int len)
 {
+	struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
 	struct sock *sk = sock->sk;
 	struct unix_sock *u = unix_sk(sk);
 	struct sockaddr_un *sunaddr=msg->msg_name;
@@ -1193,6 +1193,13 @@
 	unsigned hash;
 	struct sk_buff *skb;
 	long timeo;
+	struct scm_cookie scm;
+
+	if (NULL == siocb->scm)
+		siocb->scm = &scm;
+	err = scm_send(sock, msg, siocb->scm);
+	if (err < 0)
+		return err;
 
 	err = -EOPNOTSUPP;
 	if (msg->msg_flags&MSG_OOB)
@@ -1222,9 +1229,9 @@
 	if (skb==NULL)
 		goto out;
 
-	memcpy(UNIXCREDS(skb), &scm->creds, sizeof(struct ucred));
-	if (scm->fp)
-		unix_attach_fds(scm, skb);
+	memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
+	if (siocb->scm->fp)
+		unix_attach_fds(siocb->scm, skb);
 
 	skb->h.raw = skb->data;
 	err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
@@ -1300,6 +1307,7 @@
 	unix_state_runlock(other);
 	other->data_ready(other, len);
 	sock_put(other);
+	scm_destroy(siocb->scm);
 	return len;
 
 out_unlock:
@@ -1309,20 +1317,28 @@
 out:
 	if (other)
 		sock_put(other);
+	scm_destroy(siocb->scm);
 	return err;
 }
 
 		
-static int unix_stream_sendmsg(struct kiocb *iocb, struct socket *sock,
-			       struct msghdr *msg, int len,
-			       struct scm_cookie *scm)
+static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
+			       struct msghdr *msg, int len)
 {
+	struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
 	struct sock *sk = sock->sk;
 	unix_socket *other = NULL;
 	struct sockaddr_un *sunaddr=msg->msg_name;
 	int err,size;
 	struct sk_buff *skb;
 	int sent=0;
+	struct scm_cookie scm;
+
+	if (NULL == siocb->scm)
+		siocb->scm = &scm;
+	err = scm_send(sock, msg, siocb->scm);
+	if (err < 0)
+		return err;
 
 	err = -EOPNOTSUPP;
 	if (msg->msg_flags&MSG_OOB)
@@ -1376,9 +1392,9 @@
 		 */
 		size = min_t(int, size, skb_tailroom(skb));
 
-		memcpy(UNIXCREDS(skb), &scm->creds, sizeof(struct ucred));
-		if (scm->fp)
-			unix_attach_fds(scm, skb);
+		memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
+		if (siocb->scm->fp)
+			unix_attach_fds(siocb->scm, skb);
 
 		if ((err = memcpy_fromiovec(skb_put(skb,size), msg->msg_iov, size)) != 0) {
 			kfree_skb(skb);
@@ -1396,6 +1412,10 @@
 		sent+=size;
 	}
 	sock_put(other);
+
+	scm_destroy(siocb->scm);
+	siocb->scm = NULL;
+
 	return sent;
 
 pipe_err_free:
@@ -1408,6 +1428,8 @@
 out_err:
         if (other)
 		sock_put(other);
+	scm_destroy(siocb->scm);
+	siocb->scm = NULL;
 	return sent ? : err;
 }
 
@@ -1424,8 +1446,9 @@
 
 static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
 			      struct msghdr *msg, int size,
-			      int flags, struct scm_cookie *scm)
+			      int flags)
 {
+	struct scm_cookie scm;
 	struct sock *sk = sock->sk;
 	struct unix_sock *u = unix_sk(sk);
 	int noblock = flags & MSG_DONTWAIT;
@@ -1456,12 +1479,13 @@
 	if (err)
 		goto out_free;
 
-	scm->creds = *UNIXCREDS(skb);
+	memset(&scm, 0, sizeof(scm));
+	scm.creds = *UNIXCREDS(skb);
 
 	if (!(flags & MSG_PEEK))
 	{
 		if (UNIXCB(skb).fp)
-			unix_detach_fds(scm, skb);
+			unix_detach_fds(&scm, skb);
 	}
 	else 
 	{
@@ -1478,10 +1502,12 @@
 		   
 		*/
 		if (UNIXCB(skb).fp)
-			scm->fp = scm_fp_dup(UNIXCB(skb).fp);
+			scm.fp = scm_fp_dup(UNIXCB(skb).fp);
 	}
 	err = size;
 
+	scm_recv(sock, msg, &scm, flags);
+
 out_free:
 	skb_free_datagram(sk,skb);
 out:
@@ -1527,8 +1553,9 @@
 
 static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
 			       struct msghdr *msg, int size,
-			       int flags, struct scm_cookie *scm)
+			       int flags)
 {
+	struct scm_cookie scm;
 	struct sock *sk = sock->sk;
 	struct unix_sock *u = unix_sk(sk);
 	struct sockaddr_un *sunaddr=msg->msg_name;
@@ -1555,6 +1582,8 @@
 	 * while sleeps in memcpy_tomsg
 	 */
 
+	memset(&scm, 0, sizeof(scm));
+
 	down(&u->readsem);
 
 	do
@@ -1593,13 +1622,13 @@
 
 		if (check_creds) {
 			/* Never glue messages from different writers */
-			if (memcmp(UNIXCREDS(skb), &scm->creds, sizeof(scm->creds)) != 0) {
+			if (memcmp(UNIXCREDS(skb), &scm.creds, sizeof(scm.creds)) != 0) {
 				skb_queue_head(&sk->receive_queue, skb);
 				break;
 			}
 		} else {
 			/* Copy credentials */
-			scm->creds = *UNIXCREDS(skb);
+			scm.creds = *UNIXCREDS(skb);
 			check_creds = 1;
 		}
 
@@ -1626,7 +1655,7 @@
 			skb_pull(skb, chunk);
 
 			if (UNIXCB(skb).fp)
-				unix_detach_fds(scm, skb);
+				unix_detach_fds(&scm, skb);
 
 			/* put the skb back if we didn't use it up.. */
 			if (skb->len)
@@ -1637,7 +1666,7 @@
 
 			kfree_skb(skb);
 
-			if (scm->fp)
+			if (scm.fp)
 				break;
 		}
 		else
@@ -1645,7 +1674,7 @@
 			/* It is questionable, see note in unix_dgram_recvmsg.
 			 */
 			if (UNIXCB(skb).fp)
-				scm->fp = scm_fp_dup(UNIXCB(skb).fp);
+				scm.fp = scm_fp_dup(UNIXCB(skb).fp);
 
 			/* put message back and return */
 			skb_queue_head(&sk->receive_queue, skb);
@@ -1654,6 +1683,7 @@
 	} while (size);
 
 	up(&u->readsem);
+	scm_recv(sock, msg, &scm, flags);
 out:
 	return copied ? : err;
 }
diff -Nru a/net/wanrouter/af_wanpipe.c b/net/wanrouter/af_wanpipe.c
--- a/net/wanrouter/af_wanpipe.c	Mon Jan 20 16:00:08 2003
+++ b/net/wanrouter/af_wanpipe.c	Mon Jan 20 16:00:08 2003
@@ -542,7 +542,7 @@
  *===========================================================*/
 
 static int wanpipe_sendmsg(struct kiocb *iocb, struct socket *sock,
-			   struct msghdr *msg, int len, struct scm_cookie *scm)
+			   struct msghdr *msg, int len)
 {
 	wanpipe_opt *wp;
 	struct sock *sk = sock->sk;
@@ -1649,8 +1649,7 @@
  *===========================================================*/
 
 static int wanpipe_recvmsg(struct kiocb *iocb, struct socket *sock,
-			   struct msghdr *msg, int len, int flags,
-			   struct scm_cookie *scm)
+			   struct msghdr *msg, int len, int flags)
 {
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb;
diff -Nru a/net/x25/af_x25.c b/net/x25/af_x25.c
--- a/net/x25/af_x25.c	Mon Jan 20 16:00:08 2003
+++ b/net/x25/af_x25.c	Mon Jan 20 16:00:08 2003
@@ -917,7 +917,7 @@
 }
 
 static int x25_sendmsg(struct kiocb *iocb, struct socket *sock,
-		       struct msghdr *msg, int len, struct scm_cookie *scm)
+		       struct msghdr *msg, int len)
 {
 	struct sock *sk = sock->sk;
 	struct x25_opt *x25 = x25_sk(sk);
@@ -1093,7 +1093,7 @@
 
 static int x25_recvmsg(struct kiocb *iocb, struct socket *sock,
 		       struct msghdr *msg, int size,
-		       int flags, struct scm_cookie *scm)
+		       int flags)
 {
 	struct sock *sk = sock->sk;
 	struct x25_opt *x25 = x25_sk(sk);
Mail text in /tmp/linus.txt; please check and send using your favourite
mailer.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [patch/bk] remove scm_cookie parameter to send/recvmsg
  2003-01-20 21:17 [patch/bk] remove scm_cookie parameter to send/recvmsg Benjamin LaHaise
@ 2003-01-21  5:14 ` David S. Miller
  0 siblings, 0 replies; 2+ messages in thread
From: David S. Miller @ 2003-01-21  5:14 UTC (permalink / raw)
  To: bcrl; +Cc: netdev

   From: Benjamin LaHaise <bcrl@redhat.com>
   Date: Mon, 20 Jan 2003 16:17:55 -0500

   +		memset(&scm, 0, sizeof(scm));
    		init_sync_kiocb(&iocb, NULL);
    		si = kiocb_to_siocb(&iocb);
    		si->sock = sock;
   -		si->scm = &si->async_scm;
   +		si->scm = &scm;
    		si->msg = &kern_msg;
    		si->size = total_len;
    		si->flags = user_flags;
    		memset(si->scm, 0, sizeof(*si->scm));

We're now memset()'ing it twice?  :)  I think the first
memset isn't needed, and this makes the code consistent with
the other places this logic is duplicated.

Otherwise the patch is fine, please fix this stuff up and
resubmit, thanks.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-01-21  5:14 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-20 21:17 [patch/bk] remove scm_cookie parameter to send/recvmsg Benjamin LaHaise
2003-01-21  5:14 ` David S. Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).