Module Name: src
Committed By: snj
Date: Sat Apr 4 23:36:28 UTC 2009
Modified Files:
src/sys/arch/xen/xen [netbsd-5]: xenevt.c
src/sys/compat/svr4 [netbsd-5]: svr4_net.c
src/sys/compat/svr4_32 [netbsd-5]: svr4_32_net.c
src/sys/dev/dmover [netbsd-5]: dmover_io.c
src/sys/dev/putter [netbsd-5]: putter.c
src/sys/kern [netbsd-5]: kern_descrip.c kern_drvctl.c kern_event.c
sys_mqueue.c sys_pipe.c sys_socket.c uipc_socket.c uipc_syscalls.c
vfs_vnops.c
src/sys/net [netbsd-5]: bpf.c if_tap.c
src/sys/opencrypto [netbsd-5]: cryptodev.c
src/sys/sys [netbsd-5]: file.h param.h socketvar.h
Log Message:
Pull up following revision(s) (requested by ad in ticket #661):
sys/arch/xen/xen/xenevt.c: revision 1.32
sys/compat/svr4/svr4_net.c: revision 1.56
sys/compat/svr4_32/svr4_32_net.c: revision 1.19
sys/dev/dmover/dmover_io.c: revision 1.32
sys/dev/putter/putter.c: revision 1.21
sys/kern/kern_descrip.c: revision 1.190
sys/kern/kern_drvctl.c: revision 1.23
sys/kern/kern_event.c: revision 1.64
sys/kern/sys_mqueue.c: revision 1.14
sys/kern/sys_pipe.c: revision 1.109
sys/kern/sys_socket.c: revision 1.59
sys/kern/uipc_syscalls.c: revision 1.136
sys/kern/vfs_vnops.c: revision 1.164
sys/kern/uipc_socket.c: revision 1.188
sys/net/bpf.c: revision 1.144
sys/net/if_tap.c: revision 1.55
sys/opencrypto/cryptodev.c: revision 1.47
sys/sys/file.h: revision 1.67
sys/sys/param.h: patch
sys/sys/socketvar.h: revision 1.119
Add fileops::fo_drain(), to be called from fd_close() when there is more
than one active reference to a file descriptor. It should dislodge threads
sleeping while holding a reference to the descriptor. Implemented only for
sockets but should be extended to pipes, fifos, etc.
Fixes the case of a multithreaded process doing something like the
following, which would have hung until the process got a signal.
thr0 accept(fd, ...)
thr1 close(fd)
To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.29.4.1 src/sys/arch/xen/xen/xenevt.c
cvs rdiff -u -r1.53 -r1.53.10.1 src/sys/compat/svr4/svr4_net.c
cvs rdiff -u -r1.18 -r1.18.10.1 src/sys/compat/svr4_32/svr4_32_net.c
cvs rdiff -u -r1.31 -r1.31.14.1 src/sys/dev/dmover/dmover_io.c
cvs rdiff -u -r1.16 -r1.16.4.1 src/sys/dev/putter/putter.c
cvs rdiff -u -r1.182.6.5 -r1.182.6.6 src/sys/kern/kern_descrip.c
cvs rdiff -u -r1.19.6.1 -r1.19.6.2 src/sys/kern/kern_drvctl.c
cvs rdiff -u -r1.60 -r1.60.6.1 src/sys/kern/kern_event.c
cvs rdiff -u -r1.12 -r1.12.4.1 src/sys/kern/sys_mqueue.c
cvs rdiff -u -r1.103.4.4 -r1.103.4.5 src/sys/kern/sys_pipe.c
cvs rdiff -u -r1.58 -r1.58.10.1 src/sys/kern/sys_socket.c
cvs rdiff -u -r1.177.4.1 -r1.177.4.2 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.134.4.1 -r1.134.4.2 src/sys/kern/uipc_syscalls.c
cvs rdiff -u -r1.160 -r1.160.4.1 src/sys/kern/vfs_vnops.c
cvs rdiff -u -r1.141 -r1.141.6.1 src/sys/net/bpf.c
cvs rdiff -u -r1.47.4.5 -r1.47.4.6 src/sys/net/if_tap.c
cvs rdiff -u -r1.44.8.1 -r1.44.8.2 src/sys/opencrypto/cryptodev.c
cvs rdiff -u -r1.65.6.1 -r1.65.6.2 src/sys/sys/file.h
cvs rdiff -u -r1.330.4.6 -r1.330.4.7 src/sys/sys/param.h
cvs rdiff -u -r1.116.4.1 -r1.116.4.2 src/sys/sys/socketvar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/xen/xen/xenevt.c
diff -u src/sys/arch/xen/xen/xenevt.c:1.29 src/sys/arch/xen/xen/xenevt.c:1.29.4.1
--- src/sys/arch/xen/xen/xenevt.c:1.29 Fri Sep 5 13:37:24 2008
+++ src/sys/arch/xen/xen/xenevt.c Sat Apr 4 23:36:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: xenevt.c,v 1.29 2008/09/05 13:37:24 tron Exp $ */
+/* $NetBSD: xenevt.c,v 1.29.4.1 2009/04/04 23:36:27 snj Exp $ */
/*
* Copyright (c) 2005 Manuel Bouyer.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenevt.c,v 1.29 2008/09/05 13:37:24 tron Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenevt.c,v 1.29.4.1 2009/04/04 23:36:27 snj Exp $");
#include "opt_xen.h"
#include <sys/param.h>
@@ -80,14 +80,15 @@
/* static int xenevt_fkqfilter(struct file *, struct knote *); */
static const struct fileops xenevt_fileops = {
- xenevt_fread,
- xenevt_fwrite,
- xenevt_fioctl,
- fnullop_fcntl,
- xenevt_fpoll,
- fbadop_stat,
- xenevt_fclose,
- /* xenevt_fkqfilter */ fnullop_kqfilter
+ .fo_read = xenevt_fread,
+ .fo_write = xenevt_fwrite,
+ .fo_ioctl = xenevt_fioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = xenevt_fpoll,
+ .fo_stat = fbadop_stat,
+ .fo_close = xenevt_fclose,
+ .fo_kqfilter = /* xenevt_fkqfilter */ fnullop_kqfilter,
+ .fo_drain = fnullop_drain,
};
dev_type_open(xenevtopen);
Index: src/sys/compat/svr4/svr4_net.c
diff -u src/sys/compat/svr4/svr4_net.c:1.53 src/sys/compat/svr4/svr4_net.c:1.53.10.1
--- src/sys/compat/svr4/svr4_net.c:1.53 Mon Apr 28 20:23:45 2008
+++ src/sys/compat/svr4/svr4_net.c Sat Apr 4 23:36:27 2009
@@ -1,7 +1,7 @@
-/* $NetBSD: svr4_net.c,v 1.53 2008/04/28 20:23:45 martin Exp $ */
+/* $NetBSD: svr4_net.c,v 1.53.10.1 2009/04/04 23:36:27 snj Exp $ */
/*-
- * Copyright (c) 1994, 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 1994, 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_net.c,v 1.53 2008/04/28 20:23:45 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_net.c,v 1.53.10.1 2009/04/04 23:36:27 snj Exp $");
#define COMPAT_SVR4 1
@@ -100,8 +100,15 @@
int svr4_soo_close(file_t *);
static const struct fileops svr4_netops = {
- soo_read, soo_write, soo_ioctl, soo_fcntl, soo_poll,
- soo_stat, svr4_soo_close, soo_kqfilter
+ .fo_read = soo_read,
+ .fo_write = soo_write,
+ .fo_ioctl = soo_ioctl,
+ .fo_fcntl = soo_fcntl,
+ .fo_poll = soo_poll,
+ .fo_stat = soo_stat,
+ .fo_close = svr4_soo_close,
+ .fo_kqfilter = soo_kqfilter,
+ .fo_drain = soo_drain,
};
Index: src/sys/compat/svr4_32/svr4_32_net.c
diff -u src/sys/compat/svr4_32/svr4_32_net.c:1.18 src/sys/compat/svr4_32/svr4_32_net.c:1.18.10.1
--- src/sys/compat/svr4_32/svr4_32_net.c:1.18 Mon Apr 28 20:23:46 2008
+++ src/sys/compat/svr4_32/svr4_32_net.c Sat Apr 4 23:36:27 2009
@@ -1,7 +1,7 @@
-/* $NetBSD: svr4_32_net.c,v 1.18 2008/04/28 20:23:46 martin Exp $ */
+/* $NetBSD: svr4_32_net.c,v 1.18.10.1 2009/04/04 23:36:27 snj Exp $ */
/*-
- * Copyright (c) 1994, 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 1994, 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_32_net.c,v 1.18 2008/04/28 20:23:46 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_32_net.c,v 1.18.10.1 2009/04/04 23:36:27 snj Exp $");
#define COMPAT_SVR4 1
@@ -95,8 +95,14 @@
int svr4_ptm_alloc(struct proc *);
static const struct fileops svr4_32_netops = {
- soo_read, soo_write, soo_ioctl, soo_fcntl, soo_poll,
- soo_stat, svr4_soo_close, D_OTHER
+ .fo_read = soo_read,
+ .fo_write = soo_write,
+ .fo_ioctl = soo_ioctl,
+ .fo_fcntl = soo_fcntl,
+ .fo_poll = soo_poll,
+ .fo_stat = soo_stat,
+ .fo_close = svr4_soo_close,
+ .fo_drain = soo_drain,
};
Index: src/sys/dev/dmover/dmover_io.c
diff -u src/sys/dev/dmover/dmover_io.c:1.31 src/sys/dev/dmover/dmover_io.c:1.31.14.1
--- src/sys/dev/dmover/dmover_io.c:1.31 Wed Mar 26 13:33:58 2008
+++ src/sys/dev/dmover/dmover_io.c Sat Apr 4 23:36:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: dmover_io.c,v 1.31 2008/03/26 13:33:58 ad Exp $ */
+/* $NetBSD: dmover_io.c,v 1.31.14.1 2009/04/04 23:36:27 snj Exp $ */
/*
* Copyright (c) 2002, 2003 Wasabi Systems, Inc.
@@ -55,7 +55,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dmover_io.c,v 1.31 2008/03/26 13:33:58 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dmover_io.c,v 1.31.14.1 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/queue.h>
@@ -729,14 +729,15 @@
}
static const struct fileops dmio_fileops = {
- dmio_read,
- dmio_write,
- dmio_ioctl,
- fnullop_fcntl,
- dmio_poll,
- fbadop_stat,
- dmio_close,
- fnullop_kqfilter
+ .fo_read = dmio_read,
+ .fo_write = dmio_write,
+ .fo_ioctl = dmio_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = dmio_poll,
+ .fo_stat = fbadop_stat,
+ .fo_close = dmio_close,
+ .fo_kqfilter = fnullop_kqfilter,
+ .fo_drain = fnullop_drain,
};
/*
Index: src/sys/dev/putter/putter.c
diff -u src/sys/dev/putter/putter.c:1.16 src/sys/dev/putter/putter.c:1.16.4.1
--- src/sys/dev/putter/putter.c:1.16 Fri Aug 8 13:02:10 2008
+++ src/sys/dev/putter/putter.c Sat Apr 4 23:36:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: putter.c,v 1.16 2008/08/08 13:02:10 pooka Exp $ */
+/* $NetBSD: putter.c,v 1.16.4.1 2009/04/04 23:36:27 snj Exp $ */
/*
* Copyright (c) 2006, 2007 Antti Kantee. All Rights Reserved.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: putter.c,v 1.16 2008/08/08 13:02:10 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: putter.c,v 1.16.4.1 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -176,14 +176,15 @@
static const struct fileops putter_fileops = {
- putter_fop_read,
- putter_fop_write,
- putter_fop_ioctl,
- fnullop_fcntl,
- putter_fop_poll,
- fbadop_stat,
- putter_fop_close,
- putter_fop_kqfilter
+ .fo_read = putter_fop_read,
+ .fo_write = putter_fop_write,
+ .fo_ioctl = putter_fop_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = putter_fop_poll,
+ .fo_stat = fbadop_stat,
+ .fo_close = putter_fop_close,
+ .fo_kqfilter = putter_fop_kqfilter,
+ .fo_drain = fnullop_drain,
};
static int
Index: src/sys/kern/kern_descrip.c
diff -u src/sys/kern/kern_descrip.c:1.182.6.5 src/sys/kern/kern_descrip.c:1.182.6.6
--- src/sys/kern/kern_descrip.c:1.182.6.5 Tue Mar 31 23:38:41 2009
+++ src/sys/kern/kern_descrip.c Sat Apr 4 23:36:27 2009
@@ -1,9 +1,12 @@
-/* $NetBSD: kern_descrip.c,v 1.182.6.5 2009/03/31 23:38:41 snj Exp $ */
+/* $NetBSD: kern_descrip.c,v 1.182.6.6 2009/04/04 23:36:27 snj Exp $ */
/*-
- * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -67,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.182.6.5 2009/03/31 23:38:41 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.182.6.6 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -587,15 +590,20 @@
*
*/
atomic_or_uint(&ff->ff_refcnt, FR_CLOSING);
+
/*
* Remove any knotes attached to the file. A knote
* attached to the descriptor can hold references on it.
*/
+ mutex_exit(&ff->ff_lock);
if (!SLIST_EMPTY(&ff->ff_knlist)) {
- mutex_exit(&ff->ff_lock);
knote_fdclose(fd);
- mutex_enter(&ff->ff_lock);
}
+
+ /* Try to drain out descriptor references. */
+ (*fp->f_ops->fo_drain)(fp);
+ mutex_enter(&ff->ff_lock);
+
/*
* We need to see the count drop to zero at least once,
* in order to ensure that all pre-existing references
@@ -1917,6 +1925,12 @@
return 0;
}
+void
+fnullop_drain(file_t *fp)
+{
+
+}
+
int
fbadop_read(file_t *fp, off_t *offset, struct uio *uio,
kauth_cred_t cred, int flags)
Index: src/sys/kern/kern_drvctl.c
diff -u src/sys/kern/kern_drvctl.c:1.19.6.1 src/sys/kern/kern_drvctl.c:1.19.6.2
--- src/sys/kern/kern_drvctl.c:1.19.6.1 Tue Nov 25 04:01:28 2008
+++ src/sys/kern/kern_drvctl.c Sat Apr 4 23:36:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_drvctl.c,v 1.19.6.1 2008/11/25 04:01:28 snj Exp $ */
+/* $NetBSD: kern_drvctl.c,v 1.19.6.2 2009/04/04 23:36:27 snj Exp $ */
/*
* Copyright (c) 2004
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_drvctl.c,v 1.19.6.1 2008/11/25 04:01:28 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_drvctl.c,v 1.19.6.2 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -79,14 +79,15 @@
static int drvctl_close(struct file *);
static const struct fileops drvctl_fileops = {
- drvctl_read,
- drvctl_write,
- drvctl_ioctl,
- fnullop_fcntl,
- drvctl_poll,
- fbadop_stat,
- drvctl_close,
- fnullop_kqfilter
+ .fo_read = drvctl_read,
+ .fo_write = drvctl_write,
+ .fo_ioctl = drvctl_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = drvctl_poll,
+ .fo_stat = fbadop_stat,
+ .fo_close = drvctl_close,
+ .fo_kqfilter = fnullop_kqfilter,
+ .fo_drain = fnullop_drain,
};
#define MAXLOCATORS 100
Index: src/sys/kern/kern_event.c
diff -u src/sys/kern/kern_event.c:1.60 src/sys/kern/kern_event.c:1.60.6.1
--- src/sys/kern/kern_event.c:1.60 Tue Jun 24 10:27:35 2008
+++ src/sys/kern/kern_event.c Sat Apr 4 23:36:27 2009
@@ -1,9 +1,12 @@
-/* $NetBSD: kern_event.c,v 1.60 2008/06/24 10:27:35 gmcgarry Exp $ */
+/* $NetBSD: kern_event.c,v 1.60.6.1 2009/04/04 23:36:27 snj Exp $ */
/*-
- * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -55,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.60 2008/06/24 10:27:35 gmcgarry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.60.6.1 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -104,8 +107,15 @@
static int filt_timer(struct knote *, long hint);
static const struct fileops kqueueops = {
- (void *)enxio, (void *)enxio, kqueue_ioctl, kqueue_fcntl, kqueue_poll,
- kqueue_stat, kqueue_close, kqueue_kqfilter
+ .fo_read = (void *)enxio,
+ .fo_write = (void *)enxio,
+ .fo_ioctl = kqueue_ioctl,
+ .fo_fcntl = kqueue_fcntl,
+ .fo_poll = kqueue_poll,
+ .fo_stat = kqueue_stat,
+ .fo_close = kqueue_close,
+ .fo_kqfilter = kqueue_kqfilter,
+ .fo_drain = fnullop_drain,
};
static const struct filterops kqread_filtops =
Index: src/sys/kern/sys_mqueue.c
diff -u src/sys/kern/sys_mqueue.c:1.12 src/sys/kern/sys_mqueue.c:1.12.4.1
--- src/sys/kern/sys_mqueue.c:1.12 Mon Sep 29 10:27:53 2008
+++ src/sys/kern/sys_mqueue.c Sat Apr 4 23:36:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_mqueue.c,v 1.12 2008/09/29 10:27:53 rmind Exp $ */
+/* $NetBSD: sys_mqueue.c,v 1.12.4.1 2009/04/04 23:36:27 snj Exp $ */
/*
* Copyright (c) 2007, 2008 Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.12 2008/09/29 10:27:53 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.12.4.1 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -89,8 +89,15 @@
#define FNOVAL -1
static const struct fileops mqops = {
- fbadop_read, fbadop_write, fbadop_ioctl, fnullop_fcntl, mq_poll_fop,
- fbadop_stat, mq_close_fop, fnullop_kqfilter
+ .fo_read = fbadop_read,
+ .fo_write = fbadop_write,
+ .fo_ioctl = fbadop_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = mq_poll_fop,
+ .fo_stat = fbadop_stat,
+ .fo_close = mq_close_fop,
+ .fo_kqfilter = fnullop_kqfilter,
+ .fo_drain = fnullop_drain,
};
/*
Index: src/sys/kern/sys_pipe.c
diff -u src/sys/kern/sys_pipe.c:1.103.4.4 src/sys/kern/sys_pipe.c:1.103.4.5
--- src/sys/kern/sys_pipe.c:1.103.4.4 Tue Feb 24 02:37:49 2009
+++ src/sys/kern/sys_pipe.c Sat Apr 4 23:36:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_pipe.c,v 1.103.4.4 2009/02/24 02:37:49 snj Exp $ */
+/* $NetBSD: sys_pipe.c,v 1.103.4.5 2009/04/04 23:36:27 snj Exp $ */
/*-
* Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.103.4.4 2009/02/24 02:37:49 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.103.4.5 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -112,8 +112,15 @@
static int pipe_ioctl(struct file *fp, u_long cmd, void *data);
static const struct fileops pipeops = {
- pipe_read, pipe_write, pipe_ioctl, fnullop_fcntl, pipe_poll,
- pipe_stat, pipe_close, pipe_kqfilter
+ .fo_read = pipe_read,
+ .fo_write = pipe_write,
+ .fo_ioctl = pipe_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = pipe_poll,
+ .fo_stat = pipe_stat,
+ .fo_close = pipe_close,
+ .fo_kqfilter = pipe_kqfilter,
+ .fo_drain = fnullop_drain,
};
/*
Index: src/sys/kern/sys_socket.c
diff -u src/sys/kern/sys_socket.c:1.58 src/sys/kern/sys_socket.c:1.58.10.1
--- src/sys/kern/sys_socket.c:1.58 Tue Apr 29 18:35:14 2008
+++ src/sys/kern/sys_socket.c Sat Apr 4 23:36:27 2009
@@ -1,9 +1,12 @@
-/* $NetBSD: sys_socket.c,v 1.58 2008/04/29 18:35:14 ad Exp $ */
+/* $NetBSD: sys_socket.c,v 1.58.10.1 2009/04/04 23:36:27 snj Exp $ */
/*-
- * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -58,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.58 2008/04/29 18:35:14 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.58.10.1 2009/04/04 23:36:27 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -78,8 +81,15 @@
#include <net/route.h>
const struct fileops socketops = {
- soo_read, soo_write, soo_ioctl, soo_fcntl, soo_poll,
- soo_stat, soo_close, soo_kqfilter
+ .fo_read = soo_read,
+ .fo_write = soo_write,
+ .fo_ioctl = soo_ioctl,
+ .fo_fcntl = soo_fcntl,
+ .fo_poll = soo_poll,
+ .fo_stat = soo_stat,
+ .fo_close = soo_close,
+ .fo_kqfilter = soo_kqfilter,
+ .fo_drain = soo_drain,
};
/* ARGSUSED */
@@ -248,3 +258,10 @@
return error;
}
+
+void
+soo_drain(file_t *fp)
+{
+
+ (void)sodrain(fp->f_data);
+}
Index: src/sys/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.177.4.1 src/sys/kern/uipc_socket.c:1.177.4.2
--- src/sys/kern/uipc_socket.c:1.177.4.1 Mon Feb 2 21:04:45 2009
+++ src/sys/kern/uipc_socket.c Sat Apr 4 23:36:27 2009
@@ -1,11 +1,11 @@
-/* $NetBSD: uipc_socket.c,v 1.177.4.1 2009/02/02 21:04:45 snj Exp $ */
+/* $NetBSD: uipc_socket.c,v 1.177.4.2 2009/04/04 23:36:27 snj Exp $ */
/*-
- * Copyright (c) 2002, 2007, 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
- * by Jason R. Thorpe of Wasabi Systems, Inc.
+ * by Jason R. Thorpe of Wasabi Systems, Inc, and by Andrew Doran.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.177.4.1 2009/02/02 21:04:45 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.177.4.2 2009/04/04 23:36:27 snj Exp $");
#include "opt_sock_counters.h"
#include "opt_sosend_loan.h"
@@ -1536,6 +1536,20 @@
return error;
}
+int
+sodrain(struct socket *so)
+{
+ int error;
+
+ solock(so);
+ so->so_state |= SS_ISDRAINING;
+ cv_broadcast(&so->so_cv);
+ error = soshutdown(so, SHUT_RDWR);
+ sounlock(so);
+
+ return error;
+}
+
void
sorflush(struct socket *so)
{
Index: src/sys/kern/uipc_syscalls.c
diff -u src/sys/kern/uipc_syscalls.c:1.134.4.1 src/sys/kern/uipc_syscalls.c:1.134.4.2
--- src/sys/kern/uipc_syscalls.c:1.134.4.1 Mon Feb 2 21:04:45 2009
+++ src/sys/kern/uipc_syscalls.c Sat Apr 4 23:36:28 2009
@@ -1,9 +1,12 @@
-/* $NetBSD: uipc_syscalls.c,v 1.134.4.1 2009/02/02 21:04:45 snj Exp $ */
+/* $NetBSD: uipc_syscalls.c,v 1.134.4.2 2009/04/04 23:36:28 snj Exp $ */
/*-
- * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -58,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.134.4.1 2009/02/02 21:04:45 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.134.4.2 2009/04/04 23:36:28 snj Exp $");
#include "opt_pipe.h"
@@ -300,7 +303,7 @@
}
solock(so);
MCLAIM(nam, so->so_mowner);
- if (so->so_state & SS_ISCONNECTING) {
+ if ((so->so_state & SS_ISCONNECTING) != 0) {
error = EALREADY;
goto out;
}
@@ -308,12 +311,17 @@
error = soconnect(so, nam, l);
if (error)
goto bad;
- if (so->so_nbio && (so->so_state & SS_ISCONNECTING)) {
+ if (so->so_nbio && (so->so_state & SS_ISCONNECTING) != 0) {
error = EINPROGRESS;
goto out;
}
- while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
+ while ((so->so_state & SS_ISCONNECTING) != 0 && so->so_error == 0) {
error = sowait(so, true, 0);
+ if (__predict_false((so->so_state & SS_ISDRAINING) != 0)) {
+ error = EPIPE;
+ interrupted = 1;
+ break;
+ }
if (error) {
if (error == EINTR || error == ERESTART)
interrupted = 1;
Index: src/sys/kern/vfs_vnops.c
diff -u src/sys/kern/vfs_vnops.c:1.160 src/sys/kern/vfs_vnops.c:1.160.4.1
--- src/sys/kern/vfs_vnops.c:1.160 Wed Aug 27 06:28:09 2008
+++ src/sys/kern/vfs_vnops.c Sat Apr 4 23:36:28 2009
@@ -1,4 +1,33 @@
-/* $NetBSD: vfs_vnops.c,v 1.160 2008/08/27 06:28:09 christos Exp $ */
+/* $NetBSD: vfs_vnops.c,v 1.160.4.1 2009/04/04 23:36:28 snj Exp $ */
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.160 2008/08/27 06:28:09 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.160.4.1 2009/04/04 23:36:28 snj Exp $");
#include "fs_union.h"
#include "veriexec.h"
@@ -89,8 +118,15 @@
static int vn_ioctl(file_t *fp, u_long com, void *data);
const struct fileops vnops = {
- vn_read, vn_write, vn_ioctl, vn_fcntl, vn_poll,
- vn_statfile, vn_closefile, vn_kqfilter
+ .fo_read = vn_read,
+ .fo_write = vn_write,
+ .fo_ioctl = vn_ioctl,
+ .fo_fcntl = vn_fcntl,
+ .fo_poll = vn_poll,
+ .fo_stat = vn_statfile,
+ .fo_close = vn_closefile,
+ .fo_kqfilter = vn_kqfilter,
+ .fo_drain = fnullop_drain,
};
/*
Index: src/sys/net/bpf.c
diff -u src/sys/net/bpf.c:1.141 src/sys/net/bpf.c:1.141.6.1
--- src/sys/net/bpf.c:1.141 Sun Jun 15 16:37:21 2008
+++ src/sys/net/bpf.c Sat Apr 4 23:36:28 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: bpf.c,v 1.141 2008/06/15 16:37:21 christos Exp $ */
+/* $NetBSD: bpf.c,v 1.141.6.1 2009/04/04 23:36:28 snj Exp $ */
/*
* Copyright (c) 1990, 1991, 1993
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.141 2008/06/15 16:37:21 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.141.6.1 2009/04/04 23:36:28 snj Exp $");
#if defined(_KERNEL_OPT)
#include "opt_bpf.h"
@@ -156,14 +156,15 @@
static void bpf_softintr(void *);
static const struct fileops bpf_fileops = {
- bpf_read,
- bpf_write,
- bpf_ioctl,
- fnullop_fcntl,
- bpf_poll,
- fbadop_stat,
- bpf_close,
- bpf_kqfilter,
+ .fo_read = bpf_read,
+ .fo_write = bpf_write,
+ .fo_ioctl = bpf_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = bpf_poll,
+ .fo_stat = fbadop_stat,
+ .fo_close = bpf_close,
+ .fo_kqfilter = bpf_kqfilter,
+ .fo_drain = fnullop_drain,
};
dev_type_open(bpfopen);
Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.47.4.5 src/sys/net/if_tap.c:1.47.4.6
--- src/sys/net/if_tap.c:1.47.4.5 Wed Mar 18 05:23:44 2009
+++ src/sys/net/if_tap.c Sat Apr 4 23:36:28 2009
@@ -1,7 +1,7 @@
-/* $NetBSD: if_tap.c,v 1.47.4.5 2009/03/18 05:23:44 snj Exp $ */
+/* $NetBSD: if_tap.c,v 1.47.4.6 2009/04/04 23:36:28 snj Exp $ */
/*
- * Copyright (c) 2003, 2004, 2008 The NetBSD Foundation.
+ * Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.47.4.5 2009/03/18 05:23:44 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.47.4.6 2009/04/04 23:36:28 snj Exp $");
#if defined(_KERNEL_OPT)
#include "bpfilter.h"
@@ -148,14 +148,15 @@
static int tap_fops_kqfilter(file_t *, struct knote *);
static const struct fileops tap_fileops = {
- tap_fops_read,
- tap_fops_write,
- tap_fops_ioctl,
- fnullop_fcntl,
- tap_fops_poll,
- fbadop_stat,
- tap_fops_close,
- tap_fops_kqfilter,
+ .fo_read = tap_fops_read,
+ .fo_write = tap_fops_write,
+ .fo_ioctl = tap_fops_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = tap_fops_poll,
+ .fo_stat = fbadop_stat,
+ .fo_close = tap_fops_close,
+ .fo_kqfilter = tap_fops_kqfilter,
+ .fo_drain = fnullop_drain,
};
/* Helper for cloning open() */
Index: src/sys/opencrypto/cryptodev.c
diff -u src/sys/opencrypto/cryptodev.c:1.44.8.1 src/sys/opencrypto/cryptodev.c:1.44.8.2
--- src/sys/opencrypto/cryptodev.c:1.44.8.1 Thu Nov 20 03:22:38 2008
+++ src/sys/opencrypto/cryptodev.c Sat Apr 4 23:36:28 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: cryptodev.c,v 1.44.8.1 2008/11/20 03:22:38 snj Exp $ */
+/* $NetBSD: cryptodev.c,v 1.44.8.2 2009/04/04 23:36:28 snj Exp $ */
/* $FreeBSD: src/sys/opencrypto/cryptodev.c,v 1.4.2.4 2003/06/03 00:09:02 sam Exp $ */
/* $OpenBSD: cryptodev.c,v 1.53 2002/07/10 22:21:30 mickey Exp $ */
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.44.8.1 2008/11/20 03:22:38 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.44.8.2 2009/04/04 23:36:28 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -141,14 +141,15 @@
static int cryptof_poll(struct file *, int);
static const struct fileops cryptofops = {
- cryptof_read,
- cryptof_write,
- cryptof_ioctl,
- fnullop_fcntl,
- cryptof_poll,
- fbadop_stat,
- cryptof_close,
- fnullop_kqfilter
+ .fo_read = cryptof_read,
+ .fo_write = cryptof_write,
+ .fo_ioctl = cryptof_ioctl,
+ .fo_fcntl = fnullop_fcntl,
+ .fo_poll = cryptof_poll,
+ .fo_stat = fbadop_stat,
+ .fo_close = cryptof_close,
+ .fo_kqfilter = fnullop_kqfilter,
+ .fo_drain = fnullop_drain,
};
static struct csession *csefind(struct fcrypt *, u_int);
Index: src/sys/sys/file.h
diff -u src/sys/sys/file.h:1.65.6.1 src/sys/sys/file.h:1.65.6.2
--- src/sys/sys/file.h:1.65.6.1 Wed Mar 18 05:33:23 2009
+++ src/sys/sys/file.h Sat Apr 4 23:36:28 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: file.h,v 1.65.6.1 2009/03/18 05:33:23 snj Exp $ */
+/* $NetBSD: file.h,v 1.65.6.2 2009/04/04 23:36:28 snj Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -100,6 +100,9 @@
int (*fo_stat) (struct file *, struct stat *);
int (*fo_close) (struct file *);
int (*fo_kqfilter) (struct file *, struct knote *);
+ void (*fo_drain) (struct file *);
+ void (*fo_spare1) (void);
+ void (*fo_spare2) (void);
} *f_ops;
void *f_data; /* descriptor data, e.g. vnode/socket */
LIST_ENTRY(file) f_list; /* list of active files */
@@ -162,6 +165,7 @@
int fbadop_ioctl(struct file *, u_long, void *);
int fbadop_close(struct file *);
int fbadop_stat(struct file *, struct stat *);
+void fnullop_drain(struct file *);
#endif /* _KERNEL */
Index: src/sys/sys/param.h
diff -u src/sys/sys/param.h:1.330.4.6 src/sys/sys/param.h:1.330.4.7
--- src/sys/sys/param.h:1.330.4.6 Wed Apr 1 00:25:22 2009
+++ src/sys/sys/param.h Sat Apr 4 23:36:28 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: param.h,v 1.330.4.6 2009/04/01 00:25:22 snj Exp $ */
+/* $NetBSD: param.h,v 1.330.4.7 2009/04/04 23:36:28 snj Exp $ */
/*-
* Copyright (c) 1982, 1986, 1989, 1993
@@ -63,7 +63,7 @@
* 2.99.9 (299000900)
*/
-#define __NetBSD_Version__ 500000002 /* NetBSD 5.0_RC3 */
+#define __NetBSD_Version__ 500000003 /* NetBSD 5.0_RC3 */
#define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \
(m) * 1000000) + (p) * 100) <= __NetBSD_Version__)
Index: src/sys/sys/socketvar.h
diff -u src/sys/sys/socketvar.h:1.116.4.1 src/sys/sys/socketvar.h:1.116.4.2
--- src/sys/sys/socketvar.h:1.116.4.1 Mon Feb 2 21:04:45 2009
+++ src/sys/sys/socketvar.h Sat Apr 4 23:36:28 2009
@@ -1,9 +1,12 @@
-/* $NetBSD: socketvar.h,v 1.116.4.1 2009/02/02 21:04:45 snj Exp $ */
+/* $NetBSD: socketvar.h,v 1.116.4.2 2009/04/04 23:36:28 snj Exp $ */
/*-
- * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -198,6 +201,7 @@
#define SS_CANTSENDMORE 0x010 /* can't send more data to peer */
#define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */
#define SS_RCVATMARK 0x040 /* at mark on input */
+#define SS_ISDRAINING 0x080 /* draining fd references */
#define SS_ISDISCONNECTED 0x800 /* socket disconnected from peer */
#define SS_ASYNC 0x100 /* async i/o notify */
@@ -255,6 +259,7 @@
int soo_kqfilter(file_t *, struct knote *);
int soo_close(file_t *);
int soo_stat(file_t *, struct stat *);
+void soo_drain(file_t *);
void sbappend(struct sockbuf *, struct mbuf *);
void sbappendstream(struct sockbuf *, struct mbuf *);
int sbappendaddr(struct sockbuf *, const struct sockaddr *, struct mbuf *,
@@ -310,6 +315,7 @@
int sosetopt(struct socket *, struct sockopt *);
int so_setsockopt(struct lwp *, struct socket *, int, int, const void *, size_t);
int soshutdown(struct socket *, int);
+int sodrain(struct socket *);
void sowakeup(struct socket *, struct sockbuf *, int);
int sockargs(struct mbuf **, const void *, size_t, int);
int sopoll(struct socket *, int);