From 9ba76b73b2c135df4edbbbf290df4e77e5f7ba1d Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Tue, 13 Jun 2006 08:12:04 +0000 Subject: [PATCH] Add kernel syscall support for explicit blocking and non-blocking I/O regardless of the setting applied to the file pointer. send/sendmsg/sendto/recv/recvmsg/recfrom: New MSG_ flags defined in sys/socket.h may be passed to these functions to override the settings applied to the file pointer on a per-I/O basis. MSG_FBLOCKING - Force the operation to be blocking MSG_FNONBLOCKING- Force the operation to be non-blocking pread/preadv/pwrite/pwritev: These system calls have been renamed and wrappers will be added to libc. The new system calls are prefixed with a double underscore (like getcwd vs __getcwd) and include an additional flags argument. The new flags are defined in sys/fcntl.h and may be used to override settings applied to the file pointer on a per-I/O basis. Additionally, the internal __ versions of these functions now accept an offset of -1 to mean 'degenerate into a read/readv/write/writev' (i.e. use the offset in the file pointer and update it on completion). O_FBLOCKING - Force the operation to be blocking O_FNONBLOCKING - Force the operation to be non-blocking O_FAPPEND - Force the write operation to append (to a regular file) O_FOFFSET - (implied of the offset != -1) - offset is valid O_FSYNCWRITE - Force a synchronous write O_FASYNCWRITE - Force an asynchronous write O_FUNBUFFERED - Force an unbuffered operation (O_DIRECT) O_FBUFFERED - Force a buffered operation (negate O_DIRECT) If the flags do not specify an operation (e.g. neither FBLOCKING or FNONBLOCKING are set), then the settings in the file pointer are used. The original system calls will become wrappers in libc, without the flags arguments. The new system calls will be made available to libc_r to allow it to perform non-blocking I/O without having to mess with a descriptor's file flags. NOTE: the new __pread and __pwrite system calls are backwards compatible with the originals due to a pad byte that libc always set to 0. The new __preadv and __pwritev system calls are NOT backwards compatible, but since they were added to HEAD just two months ago I have decided to not renumber them either. NOTE: The subrev has been bumped to 1.5.4 and installworld will refuse to install if you are not running at least a 1.5.4 kernel. --- sys/bus/usb/usb.c | 6 +- sys/conf/subvers-DEVELOPMENT_1_5 | 5 +- sys/dev/drm/drm_drv.h | 5 +- sys/dev/misc/snp/snp.c | 5 +- sys/dev/sound/pcm/channel.c | 23 +++-- sys/dev/sound/pcm/channel.h | 6 +- sys/dev/sound/pcm/dsp.c | 19 ++-- sys/dev/usbmisc/ugen/ugen.c | 5 +- sys/dev/usbmisc/uhid/uhid.c | 6 +- sys/emulation/linux/i386/linux_proto.h | 2 +- sys/emulation/linux/i386/linux_syscall.h | 2 +- sys/emulation/linux/i386/linux_sysent.c | 2 +- sys/emulation/linux/i386/linux_union.h | 2 +- sys/emulation/linux/linux_file.c | 6 +- sys/i386/i386/mem.c | 3 +- sys/kern/init_sysent.c | 10 +-- sys/kern/kern_descrip.c | 12 +-- sys/kern/kern_fp.c | 6 +- sys/kern/kern_memio.c | 3 +- sys/kern/subr_log.c | 5 +- sys/kern/sys_generic.c | 45 +++++++--- sys/kern/sys_pipe.c | 35 ++++++-- sys/kern/sys_socket.c | 42 ++++++--- sys/kern/syscalls.c | 10 +-- sys/kern/syscalls.master | 16 ++-- sys/kern/tty.c | 4 +- sys/kern/uipc_socket.c | 12 +-- sys/kern/uipc_syscalls.c | 34 +++++-- sys/kern/vfs_aio.c | 6 +- sys/kern/vfs_vnops.c | 110 ++++++++++++++++++----- sys/net/bpf.c | 5 +- sys/net/i4b/driver/i4b_rbch.c | 19 +--- sys/net/netisr.h | 3 +- sys/net/tap/if_tap.c | 5 +- sys/net/tun/if_tun.c | 4 +- sys/netgraph/ksocket/ng_ksocket.c | 11 ++- sys/netinet/sctp.h | 7 +- sys/netinet/sctp_output.c | 28 ++---- sys/netinet/sctp_pcb.c | 6 +- sys/netinet/sctp_peeloff.c | 4 +- sys/netproto/ncp/ncp_sock.c | 13 +-- sys/netproto/smb/smb_trantcp.c | 5 +- sys/platform/pc32/i386/mem.c | 3 +- sys/sys/fcntl.h | 16 +++- sys/sys/file.h | 4 +- sys/sys/param.h | 6 +- sys/sys/socket.h | 31 ++++--- sys/sys/socketvar.h | 6 +- sys/sys/syscall-args | 10 +-- sys/sys/syscall-hide.h | 10 +-- sys/sys/syscall.h | 10 +-- sys/sys/syscall.mk | 10 +-- sys/sys/sysproto.h | 24 ++--- sys/sys/sysunion.h | 11 +-- sys/vfs/fifofs/fifo_vnops.c | 32 +++---- sys/vfs/nfs/bootp_subr.c | 6 +- sys/vfs/nfs/krpc_subr.c | 5 +- sys/vfs/nfs/nfs_socket.c | 5 +- sys/vfs/nfs/nfs_vfsops.c | 5 +- sys/vfs/portal/portal_vnops.c | 4 +- 60 files changed, 433 insertions(+), 322 deletions(-) diff --git a/sys/bus/usb/usb.c b/sys/bus/usb/usb.c index f09603a02c..181ec062e5 100644 --- a/sys/bus/usb/usb.c +++ b/sys/bus/usb/usb.c @@ -1,7 +1,7 @@ /* * $NetBSD: usb.c,v 1.68 2002/02/20 20:30:12 christos Exp $ * $FreeBSD: src/sys/dev/usb/usb.c,v 1.95 2003/11/09 23:54:21 joe Exp $ - * $DragonFly: src/sys/bus/usb/usb.c,v 1.16 2006/01/22 14:03:51 swildner Exp $ + * $DragonFly: src/sys/bus/usb/usb.c,v 1.17 2006/06/13 08:11:56 dillon Exp $ */ /* Also already merged from NetBSD: @@ -549,10 +549,6 @@ usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) if (unit == USB_DEV_MINOR) { switch (cmd) { - case FIONBIO: - /* All handled in the upper FS layer. */ - return (0); - case FIOASYNC: if (*(int *)data) #if defined(__DragonFly__) diff --git a/sys/conf/subvers-DEVELOPMENT_1_5 b/sys/conf/subvers-DEVELOPMENT_1_5 index b6c4fe7cc8..75c20dfaa7 100644 --- a/sys/conf/subvers-DEVELOPMENT_1_5 +++ b/sys/conf/subvers-DEVELOPMENT_1_5 @@ -1,6 +1,7 @@ # Subversion control for DragonFly 1.5.X-DEVELOPMENT -# $DragonFly: src/sys/conf/Attic/subvers-DEVELOPMENT_1_5,v 1.4 2006/04/14 21:06:35 dillon Exp $ +# $DragonFly: src/sys/conf/Attic/subvers-DEVELOPMENT_1_5,v 1.5 2006/06/13 08:12:00 dillon Exp $ 0 - 1 synchronize before buffer cache block->offset conversion 2 synchronize buffer buf/bio conversion to 64 bit offsets -3 stabilization, many bub fixes, fixe installer segfault & mail aliases +3 stabilization, many bug fixes, fixe installer segfault & mail aliases +4 many more bug fixes, ufs/softupdates/dirbad, pread[v], pwrite[v] diff --git a/sys/dev/drm/drm_drv.h b/sys/dev/drm/drm_drv.h index 0139d63a57..3b980c39e7 100644 --- a/sys/dev/drm/drm_drv.h +++ b/sys/dev/drm/drm_drv.h @@ -29,7 +29,7 @@ * Gareth Hughes * * $FreeBSD: src/sys/dev/drm/drm_drv.h,v 1.13.2.1 2003/04/26 07:05:28 anholt Exp $ - * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.12 2006/03/02 19:07:57 dillon Exp $ + * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.13 2006/06/13 08:12:01 dillon Exp $ */ /* @@ -987,9 +987,6 @@ int DRM(ioctl)(dev_t kdev, u_long cmd, caddr_t data, int flags, #endif switch (cmd) { - case FIONBIO: - return 0; - case FIOASYNC: dev->flags |= FASYNC; return 0; diff --git a/sys/dev/misc/snp/snp.c b/sys/dev/misc/snp/snp.c index 8f2e790305..fac8f04e64 100644 --- a/sys/dev/misc/snp/snp.c +++ b/sys/dev/misc/snp/snp.c @@ -13,7 +13,7 @@ * Snoop stuff. * * $FreeBSD: src/sys/dev/snp/snp.c,v 1.69.2.2 2002/05/06 07:30:02 dd Exp $ - * $DragonFly: src/sys/dev/misc/snp/snp.c,v 1.12 2005/12/11 01:54:08 swildner Exp $ + * $DragonFly: src/sys/dev/misc/snp/snp.c,v 1.13 2006/06/13 08:12:02 dillon Exp $ */ #include @@ -516,9 +516,6 @@ snpioctl(dev_t dev, u_long cmd, caddr_t data, int flags, d_thread_t *td) *((dev_t *)data) = snp->snp_target; break; - case FIONBIO: - break; - case FIOASYNC: if (*(int *)data) snp->snp_flags |= SNOOP_ASYNC; diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c index 8eb5d09ab5..38ff507fd7 100644 --- a/sys/dev/sound/pcm/channel.c +++ b/sys/dev/sound/pcm/channel.c @@ -25,14 +25,15 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/channel.c,v 1.19.2.19 2003/03/11 15:15:41 orion Exp $ - * $DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.7 2005/06/10 23:07:01 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.8 2006/06/13 08:12:02 dillon Exp $ */ #include +#include #include "feeder_if.h" -SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.7 2005/06/10 23:07:01 dillon Exp $"); +SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.8 2006/06/13 08:12:02 dillon Exp $"); #define MIN_CHUNK_SIZE 256 /* for uiomove etc. */ #define DMA_ALIGN_THRESHOLD 4 @@ -249,19 +250,21 @@ chn_wrintr(struct pcm_channel *c) */ int -chn_write(struct pcm_channel *c, struct uio *buf) +chn_write(struct pcm_channel *c, struct uio *buf, int ioflags) { int ret, timeout, newsize, count, sz; + int nbio; struct snd_dbuf *bs = c->bufsoft; CHN_LOCKASSERT(c); + nbio = (c->flags & CHN_F_NBIO) || (ioflags & IO_NDELAY); /* * XXX Certain applications attempt to write larger size * of pcm data than c->blocksize2nd without blocking, * resulting partial write. Expand the block size so that * the write operation avoids blocking. */ - if ((c->flags & CHN_F_NBIO) && buf->uio_resid > sndbuf_getblksz(bs)) { + if (nbio && buf->uio_resid > sndbuf_getblksz(bs)) { DEB(device_printf(c->dev, "broken app, nbio and tried to write %d bytes with fragsz %d\n", buf->uio_resid, sndbuf_getblksz(bs))); newsize = 16; @@ -276,9 +279,9 @@ chn_write(struct pcm_channel *c, struct uio *buf) while (!ret && (buf->uio_resid > 0) && (count > 0)) { sz = sndbuf_getfree(bs); if (sz == 0) { - if (c->flags & CHN_F_NBIO) + if (nbio) { ret = EWOULDBLOCK; - else { + } else { timeout = (hz * sndbuf_getblksz(bs)) / (sndbuf_getspd(bs) * sndbuf_getbps(bs)); if (timeout < 1) timeout = 1; @@ -394,15 +397,17 @@ chn_rdintr(struct pcm_channel *c) */ int -chn_read(struct pcm_channel *c, struct uio *buf) +chn_read(struct pcm_channel *c, struct uio *buf, int ioflags) { - int ret, timeout, sz, count; + int ret, timeout, sz, count; + int nbio; struct snd_dbuf *bs = c->bufsoft; CHN_LOCKASSERT(c); if (!(c->flags & CHN_F_TRIGGERED)) chn_start(c, 0); + nbio = (c->flags & CHN_F_NBIO) || (ioflags & IO_NDELAY); ret = 0; count = hz; while (!ret && (buf->uio_resid > 0) && (count > 0)) { @@ -411,7 +416,7 @@ chn_read(struct pcm_channel *c, struct uio *buf) if (sz > 0) { ret = sndbuf_uiomove(bs, buf, sz); } else { - if (c->flags & CHN_F_NBIO) { + if (nbio) { ret = EWOULDBLOCK; } else { timeout = (hz * sndbuf_getblksz(bs)) / (sndbuf_getspd(bs) * sndbuf_getbps(bs)); diff --git a/sys/dev/sound/pcm/channel.h b/sys/dev/sound/pcm/channel.h index 57b0a0b4c0..ac6471823a 100644 --- a/sys/dev/sound/pcm/channel.h +++ b/sys/dev/sound/pcm/channel.h @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/channel.h,v 1.5.2.6 2002/04/22 15:49:36 cg Exp $ - * $DragonFly: src/sys/dev/sound/pcm/channel.h,v 1.2 2003/06/17 04:28:31 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/channel.h,v 1.3 2006/06/13 08:12:02 dillon Exp $ */ struct pcmchan_children { @@ -70,8 +70,8 @@ struct pcm_channel { #include "channel_if.h" int chn_reinit(struct pcm_channel *c); -int chn_write(struct pcm_channel *c, struct uio *buf); -int chn_read(struct pcm_channel *c, struct uio *buf); +int chn_write(struct pcm_channel *c, struct uio *buf, int ioflags); +int chn_read(struct pcm_channel *c, struct uio *buf, int ioflags); u_int32_t chn_start(struct pcm_channel *c, int force); int chn_sync(struct pcm_channel *c, int threshold); int chn_flush(struct pcm_channel *c); diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index dde27a338c..f4cbf147a9 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/dsp.c,v 1.15.2.13 2002/08/30 13:53:03 orion Exp $ - * $DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.8 2005/06/10 23:07:01 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.9 2006/06/13 08:12:02 dillon Exp $ */ #include @@ -32,7 +32,7 @@ #include -SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.8 2005/06/10 23:07:01 dillon Exp $"); +SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.9 2006/06/13 08:12:02 dillon Exp $"); #define OLDPCM_IOCTL @@ -288,8 +288,11 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) crit_exit(); return ENODEV; } +#if 0 + /* removed, will be passed as an IO_ flag */ if (flags & O_NONBLOCK) rdch->flags |= CHN_F_NBIO; +#endif pcm_chnref(rdch, 1); CHN_UNLOCK(rdch); } @@ -307,8 +310,11 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) crit_exit(); return ENODEV; } +#if 0 + /* removed, will be passed as an IO_ flag */ if (flags & O_NONBLOCK) wrch->flags |= CHN_F_NBIO; +#endif pcm_chnref(wrch, 1); CHN_UNLOCK(wrch); } @@ -399,7 +405,7 @@ dsp_read(dev_t i_dev, struct uio *buf, int flag) } if (!(rdch->flags & CHN_F_RUNNING)) rdch->flags |= CHN_F_RUNNING; - ret = chn_read(rdch, buf); + ret = chn_read(rdch, buf, flag); relchns(i_dev, rdch, wrch, SD_F_PRIO_RD); crit_exit(); @@ -425,7 +431,7 @@ dsp_write(dev_t i_dev, struct uio *buf, int flag) } if (!(wrch->flags & CHN_F_RUNNING)) wrch->flags |= CHN_F_RUNNING; - ret = chn_write(wrch, buf); + ret = chn_write(wrch, buf, flag); relchns(i_dev, rdch, wrch, SD_F_PRIO_WR); crit_exit(); @@ -612,7 +618,10 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) break; case SNDCTL_DSP_NONBLOCK: - case FIONBIO: /* set/clear non-blocking i/o */ + /* + * set/clear non-blocking I/O. WARNING: non-blocking I/O + * can also be set with FIONBIO + */ if (rdch) rdch->flags &= ~CHN_F_NBIO; if (wrch) diff --git a/sys/dev/usbmisc/ugen/ugen.c b/sys/dev/usbmisc/ugen/ugen.c index fe9a1085af..61c3b6bea1 100644 --- a/sys/dev/usbmisc/ugen/ugen.c +++ b/sys/dev/usbmisc/ugen/ugen.c @@ -2,7 +2,7 @@ * $NetBSD: ugen.c,v 1.27 1999/10/28 12:08:38 augustss Exp $ * $NetBSD: ugen.c,v 1.59 2002/07/11 21:14:28 augustss Exp $ * $FreeBSD: src/sys/dev/usb/ugen.c,v 1.81 2003/11/09 09:17:22 tanimura Exp $ - * $DragonFly: src/sys/dev/usbmisc/ugen/ugen.c,v 1.16 2005/06/02 20:40:49 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/ugen/ugen.c,v 1.17 2006/06/13 08:12:02 dillon Exp $ */ /* @@ -1189,9 +1189,6 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, return (EIO); switch (cmd) { - case FIONBIO: - /* All handled in the upper FS layer. */ - return (0); case USB_SET_SHORT_XFER: /* This flag only affects read */ if (endpt == USB_CONTROL_ENDPOINT) diff --git a/sys/dev/usbmisc/uhid/uhid.c b/sys/dev/usbmisc/uhid/uhid.c index 57612ee76c..05219c8b2e 100644 --- a/sys/dev/usbmisc/uhid/uhid.c +++ b/sys/dev/usbmisc/uhid/uhid.c @@ -1,7 +1,7 @@ /* * $NetBSD: uhid.c,v 1.46 2001/11/13 06:24:55 lukem Exp $ * $FreeBSD: src/sys/dev/usb/uhid.c,v 1.65 2003/11/09 09:17:22 tanimura Exp $ - * $DragonFly: src/sys/dev/usbmisc/uhid/uhid.c,v 1.14 2005/06/02 20:40:50 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/uhid/uhid.c,v 1.15 2006/06/13 08:12:02 dillon Exp $ */ /* Also already merged from NetBSD: @@ -603,10 +603,6 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, int flag, return (EIO); switch (cmd) { - case FIONBIO: - /* All handled in the upper FS layer. */ - break; - case FIOASYNC: if (*(int *)addr) { if (sc->sc_async != NULL) diff --git a/sys/emulation/linux/i386/linux_proto.h b/sys/emulation/linux/i386/linux_proto.h index f2f2a46af0..e01b62a57f 100644 --- a/sys/emulation/linux/i386/linux_proto.h +++ b/sys/emulation/linux/i386/linux_proto.h @@ -2,7 +2,7 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/emulation/linux/i386/linux_proto.h,v 1.17 2006/06/07 03:02:09 dillon Exp $ + * $DragonFly: src/sys/emulation/linux/i386/linux_proto.h,v 1.18 2006/06/13 08:12:03 dillon Exp $ * created from DragonFly: src/sys/emulation/linux/i386/syscalls.master,v 1.9 2006/06/05 07:26:10 dillon Exp */ diff --git a/sys/emulation/linux/i386/linux_syscall.h b/sys/emulation/linux/i386/linux_syscall.h index 121b6bd233..76d35f079e 100644 --- a/sys/emulation/linux/i386/linux_syscall.h +++ b/sys/emulation/linux/i386/linux_syscall.h @@ -2,7 +2,7 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/emulation/linux/i386/linux_syscall.h,v 1.17 2006/06/07 03:02:09 dillon Exp $ + * $DragonFly: src/sys/emulation/linux/i386/linux_syscall.h,v 1.18 2006/06/13 08:12:03 dillon Exp $ * created from DragonFly: src/sys/emulation/linux/i386/syscalls.master,v 1.9 2006/06/05 07:26:10 dillon Exp */ diff --git a/sys/emulation/linux/i386/linux_sysent.c b/sys/emulation/linux/i386/linux_sysent.c index fd30d5d0b3..3abac554bd 100644 --- a/sys/emulation/linux/i386/linux_sysent.c +++ b/sys/emulation/linux/i386/linux_sysent.c @@ -2,7 +2,7 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/emulation/linux/i386/linux_sysent.c,v 1.17 2006/06/07 03:02:09 dillon Exp $ + * $DragonFly: src/sys/emulation/linux/i386/linux_sysent.c,v 1.18 2006/06/13 08:12:03 dillon Exp $ * created from DragonFly: src/sys/emulation/linux/i386/syscalls.master,v 1.9 2006/06/05 07:26:10 dillon Exp */ diff --git a/sys/emulation/linux/i386/linux_union.h b/sys/emulation/linux/i386/linux_union.h index 59ec16adfe..e8ce7ddcce 100644 --- a/sys/emulation/linux/i386/linux_union.h +++ b/sys/emulation/linux/i386/linux_union.h @@ -2,7 +2,7 @@ * Union of syscall args for messaging. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/emulation/linux/i386/linux_union.h,v 1.13 2006/06/07 03:02:09 dillon Exp $ + * $DragonFly: src/sys/emulation/linux/i386/linux_union.h,v 1.14 2006/06/13 08:12:03 dillon Exp $ * created from DragonFly: src/sys/emulation/linux/i386/syscalls.master,v 1.9 2006/06/05 07:26:10 dillon Exp */ diff --git a/sys/emulation/linux/linux_file.c b/sys/emulation/linux/linux_file.c index f26aa266eb..3ad754ee80 100644 --- a/sys/emulation/linux/linux_file.c +++ b/sys/emulation/linux/linux_file.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/compat/linux/linux_file.c,v 1.41.2.6 2003/01/06 09:19:43 fjoe Exp $ - * $DragonFly: src/sys/emulation/linux/linux_file.c,v 1.32 2006/06/05 07:26:09 dillon Exp $ + * $DragonFly: src/sys/emulation/linux/linux_file.c,v 1.33 2006/06/13 08:12:03 dillon Exp $ */ #include "opt_compat.h" @@ -832,7 +832,7 @@ sys_linux_pread(struct linux_pread_args *uap) if (auio.uio_resid < 0) error = EINVAL; else - error = kern_preadv(uap->fd, &auio, FOF_OFFSET, &uap->sysmsg_result); + error = kern_preadv(uap->fd, &auio, O_FOFFSET, &uap->sysmsg_result); return(error); } @@ -857,7 +857,7 @@ sys_linux_pwrite(struct linux_pwrite_args *uap) if (auio.uio_resid < 0) error = EINVAL; else - error = kern_pwritev(uap->fd, &auio, FOF_OFFSET, &uap->sysmsg_result); + error = kern_pwritev(uap->fd, &auio, O_FOFFSET, &uap->sysmsg_result); return(error); } diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c index 78bd0fdb26..36cdb310a0 100644 --- a/sys/i386/i386/mem.c +++ b/sys/i386/i386/mem.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/i386/i386/Attic/mem.c,v 1.12 2005/11/02 22:59:43 dillon Exp $ + * $DragonFly: src/sys/i386/i386/Attic/mem.c,v 1.13 2006/06/13 08:12:03 dillon Exp $ */ /* @@ -453,7 +453,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) switch (cmd) { /* Really handled in upper layer */ case FIOASYNC: - case FIONBIO: break; case MEM_SETIRQ: intr = *(int16_t *)data; diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 4c11f651d1..ba10d6841d 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -2,7 +2,7 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/kern/init_sysent.c,v 1.40 2006/06/07 03:02:10 dillon Exp $ + * $DragonFly: src/sys/kern/init_sysent.c,v 1.41 2006/06/13 08:12:03 dillon Exp $ * created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp */ @@ -207,8 +207,8 @@ struct sysent sysent[] = { { AS(msgsys_args), (sy_call_t *)sys_msgsys }, /* 170 = msgsys */ { AS(shmsys_args), (sy_call_t *)sys_shmsys }, /* 171 = shmsys */ { 0, (sy_call_t *)sys_nosys }, /* 172 = nosys */ - { SYF_MPSAFE | AS(pread_args), (sy_call_t *)sys_pread }, /* 173 = pread */ - { SYF_MPSAFE | AS(pwrite_args), (sy_call_t *)sys_pwrite }, /* 174 = pwrite */ + { SYF_MPSAFE | AS(__pread_args), (sy_call_t *)sys___pread }, /* 173 = __pread */ + { SYF_MPSAFE | AS(__pwrite_args), (sy_call_t *)sys___pwrite }, /* 174 = __pwrite */ { 0, (sy_call_t *)sys_nosys }, /* 175 = nosys */ { AS(ntp_adjtime_args), (sy_call_t *)sys_ntp_adjtime }, /* 176 = ntp_adjtime */ { 0, (sy_call_t *)sys_nosys }, /* 177 = sfork */ @@ -323,8 +323,8 @@ struct sysent sysent[] = { { 0, (sy_call_t *)sys_nosys }, /* 286 = nosys */ { 0, (sy_call_t *)sys_nosys }, /* 287 = nosys */ { 0, (sy_call_t *)sys_nosys }, /* 288 = nosys */ - { SYF_MPSAFE | AS(preadv_args), (sy_call_t *)sys_preadv }, /* 289 = preadv */ - { SYF_MPSAFE | AS(pwritev_args), (sy_call_t *)sys_pwritev }, /* 290 = pwritev */ + { SYF_MPSAFE | AS(__preadv_args), (sy_call_t *)sys___preadv }, /* 289 = __preadv */ + { SYF_MPSAFE | AS(__pwritev_args), (sy_call_t *)sys___pwritev }, /* 290 = __pwritev */ { 0, (sy_call_t *)sys_nosys }, /* 291 = nosys */ { 0, (sy_call_t *)sys_nosys }, /* 292 = nosys */ { 0, (sy_call_t *)sys_nosys }, /* 293 = nosys */ diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 918b86bfc0..1d57b79f6d 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -70,7 +70,7 @@ * * @(#)kern_descrip.c 8.6 (Berkeley) 4/19/94 * $FreeBSD: src/sys/kern/kern_descrip.c,v 1.81.2.19 2004/02/28 00:43:31 tegge Exp $ - * $DragonFly: src/sys/kern/kern_descrip.c,v 1.67 2006/06/05 07:26:10 dillon Exp $ + * $DragonFly: src/sys/kern/kern_descrip.c,v 1.68 2006/06/13 08:12:03 dillon Exp $ */ #include "opt_compat.h" @@ -238,6 +238,7 @@ kern_fcntl(int fd, int cmd, union fcntl_dat *dat, struct ucred *cred) struct file *fp; struct vnode *vp; u_int newmin; + u_int oflags; int tmp, error, flg = F_POSIX; KKASSERT(p); @@ -280,19 +281,14 @@ kern_fcntl(int fd, int cmd, union fcntl_dat *dat, struct ucred *cred) break; case F_SETFL: + oflags = fp->f_flag & FCNTLFLAGS; fp->f_flag &= ~FCNTLFLAGS; fp->f_flag |= FFLAGS(dat->fc_flags & ~O_ACCMODE) & FCNTLFLAGS; - tmp = fp->f_flag & FNONBLOCK; - error = fo_ioctl(fp, FIONBIO, (caddr_t)&tmp, cred); - if (error) - break; tmp = fp->f_flag & FASYNC; error = fo_ioctl(fp, FIOASYNC, (caddr_t)&tmp, cred); if (error == 0) break; - fp->f_flag &= ~FNONBLOCK; - tmp = 0; - fo_ioctl(fp, FIONBIO, (caddr_t)&tmp, cred); + fp->f_flag = (fp->f_flag & ~FCNTLFLAGS) | oflags; break; case F_GETOWN: diff --git a/sys/kern/kern_fp.c b/sys/kern/kern_fp.c index 139d826028..3df86f7019 100644 --- a/sys/kern/kern_fp.c +++ b/sys/kern/kern_fp.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/kern_fp.c,v 1.16 2006/05/06 06:38:38 dillon Exp $ + * $DragonFly: src/sys/kern/kern_fp.c,v 1.17 2006/06/13 08:12:03 dillon Exp $ */ /* @@ -230,7 +230,7 @@ fp_pread(file_t fp, void *buf, size_t nbytes, off_t offset, ssize_t *res) auio.uio_td = curthread; count = nbytes; - error = fo_read(fp, &auio, fp->f_cred, FOF_OFFSET); + error = fo_read(fp, &auio, fp->f_cred, O_FOFFSET); if (error) { if (auio.uio_resid != nbytes && (error == ERESTART || error == EINTR || error == EWOULDBLOCK) @@ -331,7 +331,7 @@ fp_pwrite(file_t fp, void *buf, size_t nbytes, off_t offset, ssize_t *res) auio.uio_td = curthread; count = nbytes; - error = fo_write(fp, &auio, fp->f_cred, FOF_OFFSET); + error = fo_write(fp, &auio, fp->f_cred, O_FOFFSET); if (error) { if (auio.uio_resid != nbytes && (error == ERESTART || error == EINTR || error == EWOULDBLOCK) diff --git a/sys/kern/kern_memio.c b/sys/kern/kern_memio.c index 232f44d103..a7467bf63d 100644 --- a/sys/kern/kern_memio.c +++ b/sys/kern/kern_memio.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/kern/kern_memio.c,v 1.12 2005/11/02 22:59:43 dillon Exp $ + * $DragonFly: src/sys/kern/kern_memio.c,v 1.13 2006/06/13 08:12:03 dillon Exp $ */ /* @@ -453,7 +453,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) switch (cmd) { /* Really handled in upper layer */ case FIOASYNC: - case FIONBIO: break; case MEM_SETIRQ: intr = *(int16_t *)data; diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index 9b9e683c7b..70bd1ace91 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -32,7 +32,7 @@ * * @(#)subr_log.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/kern/subr_log.c,v 1.39.2.2 2001/06/02 08:11:25 phk Exp $ - * $DragonFly: src/sys/kern/subr_log.c,v 1.8 2005/06/06 15:02:28 dillon Exp $ + * $DragonFly: src/sys/kern/subr_log.c,v 1.9 2006/06/13 08:12:03 dillon Exp $ */ /* @@ -227,9 +227,6 @@ logioctl(dev_t dev, u_long com, caddr_t data, int flag, struct thread *td) *(int *)data = l; break; - case FIONBIO: - break; - case FIOASYNC: if (*(int *)data) logsoftc.sc_state |= LOG_ASYNC; diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index d4a767a572..41adbee29e 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -37,7 +37,7 @@ * * @(#)sys_generic.c 8.5 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/sys_generic.c,v 1.55.2.10 2001/03/17 10:39:32 peter Exp $ - * $DragonFly: src/sys/kern/sys_generic.c,v 1.32 2006/06/05 07:26:10 dillon Exp $ + * $DragonFly: src/sys/kern/sys_generic.c,v 1.33 2006/06/13 08:12:03 dillon Exp $ */ #include "opt_ktrace.h" @@ -119,12 +119,13 @@ sys_read(struct read_args *uap) * MPSAFE */ int -sys_pread(struct pread_args *uap) +sys___pread(struct __pread_args *uap) { struct thread *td = curthread; struct uio auio; struct iovec aiov; int error; + int flags; aiov.iov_base = uap->buf; aiov.iov_len = uap->nbyte; @@ -136,10 +137,14 @@ sys_pread(struct pread_args *uap) auio.uio_segflg = UIO_USERSPACE; auio.uio_td = td; + flags = uap->flags & O_FMASK; + if (uap->offset != (off_t)-1) + flags |= O_FOFFSET; + if (auio.uio_resid < 0) error = EINVAL; else - error = kern_preadv(uap->fd, &auio, FOF_OFFSET, &uap->sysmsg_result); + error = kern_preadv(uap->fd, &auio, flags, &uap->sysmsg_result); return(error); } @@ -180,12 +185,13 @@ sys_readv(struct readv_args *uap) * MPSAFE */ int -sys_preadv(struct preadv_args *uap) +sys___preadv(struct __preadv_args *uap) { struct thread *td = curthread; struct uio auio; struct iovec aiov[UIO_SMALLIOV], *iov = NULL; int error; + int flags; error = iovec_copyin(uap->iovp, &iov, aiov, uap->iovcnt, &auio.uio_resid); @@ -198,7 +204,11 @@ sys_preadv(struct preadv_args *uap) auio.uio_segflg = UIO_USERSPACE; auio.uio_td = td; - error = kern_preadv(uap->fd, &auio, FOF_OFFSET, &uap->sysmsg_result); + flags = uap->flags & O_FMASK; + if (uap->offset != (off_t)-1) + flags |= O_FOFFSET; + + error = kern_preadv(uap->fd, &auio, flags, &uap->sysmsg_result); iovec_free(&iov, aiov); return(error); @@ -220,7 +230,7 @@ kern_preadv(int fd, struct uio *auio, int flags, int *res) fp = holdfp(p->p_fd, fd, FREAD); if (fp == NULL) return (EBADF); - if (flags & FOF_OFFSET && fp->f_type != DTYPE_VNODE) { + if (flags & O_FOFFSET && fp->f_type != DTYPE_VNODE) { error = ESPIPE; } else if (auio->uio_resid < 0) { error = EINVAL; @@ -323,12 +333,13 @@ sys_write(struct write_args *uap) * MPSAFE */ int -sys_pwrite(struct pwrite_args *uap) +sys___pwrite(struct __pwrite_args *uap) { struct thread *td = curthread; struct uio auio; struct iovec aiov; int error; + int flags; aiov.iov_base = (void *)(uintptr_t)uap->buf; aiov.iov_len = uap->nbyte; @@ -340,10 +351,14 @@ sys_pwrite(struct pwrite_args *uap) auio.uio_segflg = UIO_USERSPACE; auio.uio_td = td; + flags = uap->flags & O_FMASK; + if (uap->offset != (off_t)-1) + flags |= O_FOFFSET; + if (auio.uio_resid < 0) error = EINVAL; else - error = kern_pwritev(uap->fd, &auio, FOF_OFFSET, &uap->sysmsg_result); + error = kern_pwritev(uap->fd, &auio, flags, &uap->sysmsg_result); return(error); } @@ -383,12 +398,13 @@ sys_writev(struct writev_args *uap) * MPSAFE */ int -sys_pwritev(struct pwritev_args *uap) +sys___pwritev(struct __pwritev_args *uap) { struct thread *td = curthread; struct uio auio; struct iovec aiov[UIO_SMALLIOV], *iov = NULL; int error; + int flags; error = iovec_copyin(uap->iovp, &iov, aiov, uap->iovcnt, &auio.uio_resid); @@ -401,7 +417,11 @@ sys_pwritev(struct pwritev_args *uap) auio.uio_segflg = UIO_USERSPACE; auio.uio_td = td; - error = kern_pwritev(uap->fd, &auio, FOF_OFFSET, &uap->sysmsg_result); + flags = uap->flags & O_FMASK; + if (uap->offset != (off_t)-1) + flags |= O_FOFFSET; + + error = kern_pwritev(uap->fd, &auio, flags, &uap->sysmsg_result); iovec_free(&iov, aiov); return(error); @@ -423,7 +443,7 @@ kern_pwritev(int fd, struct uio *auio, int flags, int *res) fp = holdfp(p->p_fd, fd, FWRITE); if (fp == NULL) return (EBADF); - else if ((flags & FOF_OFFSET) && fp->f_type != DTYPE_VNODE) { + else if ((flags & O_FOFFSET) && fp->f_type != DTYPE_VNODE) { error = ESPIPE; } else { error = dofilewrite(fd, fp, auio, flags, res); @@ -654,13 +674,12 @@ mapped_ioctl(int fd, u_long com, caddr_t uspc_data, struct ioctl_map *map) } switch (com) { - case FIONBIO: if ((tmp = *(int *)data)) fp->f_flag |= FNONBLOCK; else fp->f_flag &= ~FNONBLOCK; - error = fo_ioctl(fp, FIONBIO, (caddr_t)&tmp, cred); + error = 0; break; case FIOASYNC: diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 332d5024dd..8f2dcc1a25 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -17,7 +17,7 @@ * are met. * * $FreeBSD: src/sys/kern/sys_pipe.c,v 1.60.2.13 2002/08/05 15:05:15 des Exp $ - * $DragonFly: src/sys/kern/sys_pipe.c,v 1.38 2006/06/05 07:26:10 dillon Exp $ + * $DragonFly: src/sys/kern/sys_pipe.c,v 1.39 2006/06/13 08:12:03 dillon Exp $ */ /* @@ -418,11 +418,12 @@ pipeselwakeup(cpipe) * MPALMOSTSAFE (acquires mplock) */ static int -pipe_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags) +pipe_read(struct file *fp, struct uio *uio, struct ucred *cred, int fflags) { struct pipe *rpipe; int error; int nread = 0; + int nbio; u_int size; get_mplock(); @@ -432,6 +433,15 @@ pipe_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags) if (error) goto unlocked_error; + if (fflags & O_FBLOCKING) + nbio = 0; + else if (fflags & O_FNONBLOCKING) + nbio = 1; + else if (fp->f_flag & O_NONBLOCK) + nbio = 1; + else + nbio = 0; + while (uio->uio_resid) { caddr_t va; @@ -588,7 +598,7 @@ pipe_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags) * Handle non-blocking mode operation or * wait for more data. */ - if (fp->f_flag & FNONBLOCK) { + if (nbio) { error = EAGAIN; } else { rpipe->pipe_state |= PIPE_WANTR; @@ -858,10 +868,11 @@ error2: * MPALMOSTSAFE - acquires mplock */ static int -pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) +pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int fflags) { int error = 0; int orig_resid; + int nbio; struct pipe *wpipe, *rpipe; get_mplock(); @@ -877,6 +888,15 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) } ++wpipe->pipe_busy; + if (fflags & O_FBLOCKING) + nbio = 0; + else if (fflags & O_FNONBLOCKING) + nbio = 1; + else if (fp->f_flag & O_NONBLOCK) + nbio = 1; + else + nbio = 0; + /* * If it is advantageous to resize the pipe buffer, do * so. @@ -928,7 +948,7 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) */ if ((uio->uio_iov->iov_len >= PIPE_MINDIRECT || pipe_dwrite_enable > 1) && - (fp->f_flag & FNONBLOCK) == 0 && + nbio == 0 && pipe_dwrite_enable) { error = pipe_direct_write( wpipe, uio); if (error) @@ -1069,7 +1089,7 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) /* * don't block on non-blocking I/O */ - if (fp->f_flag & FNONBLOCK) { + if (nbio) { error = EAGAIN; break; } @@ -1148,9 +1168,6 @@ pipe_ioctl(struct file *fp, u_long cmd, caddr_t data, struct ucred *cred) mpipe = (struct pipe *)fp->f_data; switch (cmd) { - case FIONBIO: - error = 0; - break; case FIOASYNC: if (*(int *)data) { mpipe->pipe_state |= PIPE_ASYNC; diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c index 48a37c178a..f4b2d4ffb4 100644 --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -32,7 +32,7 @@ * * @(#)sys_socket.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/kern/sys_socket.c,v 1.28.2.2 2001/02/26 04:23:16 jlemon Exp $ - * $DragonFly: src/sys/kern/sys_socket.c,v 1.11 2006/05/26 15:55:12 dillon Exp $ + * $DragonFly: src/sys/kern/sys_socket.c,v 1.12 2006/06/13 08:12:03 dillon Exp $ */ #include @@ -45,6 +45,7 @@ #include #include /* XXX */ #include +#include #include #include #include @@ -64,14 +65,25 @@ struct fileops socketops = { * MPALMOSTSAFE - acquires mplock */ int -soo_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags) +soo_read(struct file *fp, struct uio *uio, struct ucred *cred, int fflags) { struct socket *so; int error; + int msgflags; get_mplock(); so = (struct socket *)fp->f_data; - error = so_pru_soreceive(so, NULL, uio, NULL, NULL, NULL); + + if (fflags & O_FBLOCKING) + msgflags = 0; + else if (fflags & O_FNONBLOCKING) + msgflags = MSG_FNONBLOCKING; + else if (fp->f_flag & FNONBLOCK) + msgflags = MSG_FNONBLOCKING; + else + msgflags = 0; + + error = so_pru_soreceive(so, NULL, uio, NULL, NULL, &msgflags); rel_mplock(); return (error); } @@ -80,14 +92,25 @@ soo_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags) * MPALMOSTSAFE - acquires mplock */ int -soo_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) +soo_write(struct file *fp, struct uio *uio, struct ucred *cred, int fflags) { struct socket *so; int error; + int msgflags; get_mplock(); so = (struct socket *)fp->f_data; - error = so_pru_sosend(so, NULL, uio, NULL, NULL, 0, uio->uio_td); + + if (fflags & O_FBLOCKING) + msgflags = 0; + else if (fflags & O_FNONBLOCKING) + msgflags = MSG_FNONBLOCKING; + else if (fp->f_flag & FNONBLOCK) + msgflags = MSG_FNONBLOCKING; + else + msgflags = 0; + + error = so_pru_sosend(so, NULL, uio, NULL, NULL, msgflags, uio->uio_td); rel_mplock(); return (error); } @@ -105,13 +128,6 @@ soo_ioctl(struct file *fp, u_long cmd, caddr_t data, struct ucred *cred) so = (struct socket *)fp->f_data; switch (cmd) { - case FIONBIO: - if (*(int *)data) - so->so_state |= SS_NBIO; - else - so->so_state &= ~SS_NBIO; - error = 0; - break; case FIOASYNC: if (*(int *)data) { so->so_state |= SS_ASYNC; @@ -221,7 +237,7 @@ soo_close(struct file *fp) get_mplock(); fp->f_ops = &badfileops; if (fp->f_data) - error = soclose((struct socket *)fp->f_data); + error = soclose((struct socket *)fp->f_data, fp->f_flag); else error = 0; fp->f_data = NULL; diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 6608b18c7e..2d750a0041 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -2,7 +2,7 @@ * System call names. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/kern/syscalls.c,v 1.39 2006/06/07 03:02:10 dillon Exp $ + * $DragonFly: src/sys/kern/syscalls.c,v 1.40 2006/06/13 08:12:03 dillon Exp $ * created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp */ @@ -182,8 +182,8 @@ char *syscallnames[] = { "msgsys", /* 170 = msgsys */ "shmsys", /* 171 = shmsys */ "#172", /* 172 = nosys */ - "pread", /* 173 = pread */ - "pwrite", /* 174 = pwrite */ + "__pread", /* 173 = __pread */ + "__pwrite", /* 174 = __pwrite */ "#175", /* 175 = nosys */ "ntp_adjtime", /* 176 = ntp_adjtime */ "#177", /* 177 = sfork */ @@ -298,8 +298,8 @@ char *syscallnames[] = { "#286", /* 286 = nosys */ "#287", /* 287 = nosys */ "#288", /* 288 = nosys */ - "preadv", /* 289 = preadv */ - "pwritev", /* 290 = pwritev */ + "__preadv", /* 289 = __preadv */ + "__pwritev", /* 290 = __pwritev */ "#291", /* 291 = nosys */ "#292", /* 292 = nosys */ "#293", /* 293 = nosys */ diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 22c6b058d0..1bb9c86b82 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ - $DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp $ + $DragonFly: src/sys/kern/syscalls.master,v 1.39 2006/06/13 08:12:03 dillon Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 ; $FreeBSD: src/sys/kern/syscalls.master,v 1.72.2.10 2002/07/12 08:22:46 alfred Exp $ @@ -274,10 +274,10 @@ 171 STD BSD { int shmsys(int which, int a2, int a3, int a4); } ; XXX should be { int shmsys(int which, ...); } 172 UNIMPL NOHIDE nosys -173 MPSAFE STD POSIX { ssize_t pread(int fd, void *buf, size_t nbyte, \ - int pad, off_t offset); } -174 MPSAFE STD POSIX { ssize_t pwrite(int fd, const void *buf, \ - size_t nbyte, int pad, off_t offset); } +173 MPSAFE STD POSIX { ssize_t __pread(int fd, void *buf, \ + size_t nbyte, int flags, off_t offset); } +174 MPSAFE STD POSIX { ssize_t __pwrite(int fd, const void *buf, \ + size_t nbyte, int flags, off_t offset); } 175 UNIMPL NOHIDE nosys 176 STD BSD { int ntp_adjtime(struct timex *tp); } 177 UNIMPL NOHIDE sfork (BSD/OS 2.x) @@ -429,8 +429,10 @@ 287 UNIMPL NOHIDE nosys 288 UNIMPL NOHIDE nosys ; 289 and 290 from NetBSD (OpenBSD: 267 and 268) -289 MPSAFE STD BSD { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } -290 MPSAFE STD BSD { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } +289 MPSAFE STD BSD { ssize_t __preadv(int fd, struct iovec *iovp, \ + u_int iovcnt, int flags, off_t offset); } +290 MPSAFE STD BSD { ssize_t __pwritev(int fd, struct iovec *iovp,\ + u_int iovcnt, int flags, off_t offset); } 291 UNIMPL NOHIDE nosys 292 UNIMPL NOHIDE nosys 293 UNIMPL NOHIDE nosys diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 01506b07ef..5486ef4dab 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -37,7 +37,7 @@ * * @(#)tty.c 8.8 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/tty.c,v 1.129.2.5 2002/03/11 01:32:31 dd Exp $ - * $DragonFly: src/sys/kern/tty.c,v 1.23 2006/05/06 02:43:12 dillon Exp $ + * $DragonFly: src/sys/kern/tty.c,v 1.24 2006/06/13 08:12:03 dillon Exp $ */ /*- @@ -829,8 +829,6 @@ ttioctl(struct tty *tp, u_long cmd, void *data, int flag) CLR(tp->t_state, TS_ASYNC); crit_exit(); break; - case FIONBIO: /* set/clear non-blocking i/o */ - break; /* XXX: delete. */ case FIONREAD: /* get # bytes to read */ crit_enter(); *(int *)data = ttnread(tp); diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 870a7e3fb8..5093c5a26f 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -82,7 +82,7 @@ * * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 * $FreeBSD: src/sys/kern/uipc_socket.c,v 1.68.2.24 2003/11/11 17:18:18 silby Exp $ - * $DragonFly: src/sys/kern/uipc_socket.c,v 1.37 2006/05/20 17:41:40 dillon Exp $ + * $DragonFly: src/sys/kern/uipc_socket.c,v 1.38 2006/06/13 08:12:03 dillon Exp $ */ #include "opt_inet.h" @@ -330,7 +330,7 @@ sofree(struct socket *so) * Free socket when disconnect complete. */ int -soclose(struct socket *so) +soclose(struct socket *so, int fflag) { int error = 0; @@ -346,7 +346,7 @@ soclose(struct socket *so) } if (so->so_options & SO_LINGER) { if ((so->so_state & SS_ISDISCONNECTING) && - (so->so_state & SS_NBIO)) + (fflag & FNONBLOCK)) goto drop; while (so->so_state & SS_ISCONNECTED) { error = tsleep((caddr_t)&so->so_timeo, @@ -579,7 +579,7 @@ restart: gotoerr(EMSGSIZE); if (space < resid + clen && uio && (atomic || space < so->so_snd.sb_lowat || space < clen)) { - if (so->so_state & SS_NBIO) + if (flags & (MSG_FNONBLOCKING|MSG_DONTWAIT)) gotoerr(EWOULDBLOCK); sbunlock(&so->so_snd); error = sbwait(&so->so_snd); @@ -728,7 +728,7 @@ restart: if (resid > so->so_snd.sb_hiwat) gotoerr(EMSGSIZE); if (uio && sbspace(&so->so_snd) < resid) { - if (so->so_state & SS_NBIO) + if (flags & (MSG_FNONBLOCKING|MSG_DONTWAIT)) gotoerr(EWOULDBLOCK); sbunlock(&so->so_snd); error = sbwait(&so->so_snd); @@ -877,7 +877,7 @@ restart: } if (uio->uio_resid == 0) goto release; - if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { + if (flags & (MSG_FNONBLOCKING|MSG_DONTWAIT)) { error = EWOULDBLOCK; goto release; } diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index fe1c924317..3362ece2dc 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -35,7 +35,7 @@ * * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94 * $FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.65.2.17 2003/04/04 17:11:16 tegge Exp $ - * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.69 2006/06/05 07:26:10 dillon Exp $ + * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.70 2006/06/13 08:12:03 dillon Exp $ */ #include "opt_ktrace.h" @@ -230,7 +230,7 @@ soaccept_predicate(struct netmsg *msg0) msg->nm_lmsg.ms_error = ECONNABORTED; return (TRUE); } - if (head->so_state & SS_NBIO) { + if (msg->nm_fflags & FNONBLOCK) { msg->nm_lmsg.ms_error = EWOULDBLOCK; return (TRUE); } @@ -285,6 +285,7 @@ kern_accept(int s, struct sockaddr **name, int *namelen, int *res) lwkt_cmd_func(netmsg_so_notify), lwkt_cmd_func(netmsg_so_notify_abort)); msg.nm_predicate = soaccept_predicate; + msg.nm_fflags = lfp->f_flag; msg.nm_so = head; msg.nm_etype = NM_REVENT; error = lwkt_domsg(port, &msg.nm_lmsg); @@ -416,14 +417,14 @@ kern_connect(int s, struct sockaddr *sa) if (error) return (error); so = (struct socket *)fp->f_data; - if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { + if ((fp->f_flag & FNONBLOCK) && (so->so_state & SS_ISCONNECTING)) { error = EALREADY; goto done; } error = soconnect(so, sa, td); if (error) goto bad; - if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { + if ((fp->f_flag & FNONBLOCK) && (so->so_state & SS_ISCONNECTING)) { error = EINPROGRESS; goto done; } @@ -525,9 +526,9 @@ free3: fsetfd(p, NULL, fd1); fdrop(fp1); free2: - (void)soclose(so2); + (void)soclose(so2, 0); free1: - (void)soclose(so1); + (void)soclose(so1, 0); return (error); } @@ -578,6 +579,10 @@ kern_sendmsg(int s, struct sockaddr *sa, struct uio *auio, #endif len = auio->uio_resid; so = (struct socket *)fp->f_data; + if ((flags & (MSG_FNONBLOCKING|MSG_FBLOCKING)) == 0) { + if (fp->f_flag & FNONBLOCK) + flags |= MSG_FNONBLOCKING; + } error = so_pru_sosend(so, sa, auio, NULL, control, flags, td); if (error) { if (auio->uio_resid != len && (error == ERESTART || @@ -725,6 +730,7 @@ kern_recvmsg(int s, struct sockaddr **sa, struct uio *auio, struct proc *p = td->td_proc; struct file *fp; int len, error; + int lflags; struct socket *so; #ifdef KTRACE struct iovec *ktriov = NULL; @@ -749,6 +755,18 @@ kern_recvmsg(int s, struct sockaddr **sa, struct uio *auio, #endif len = auio->uio_resid; so = (struct socket *)fp->f_data; + + if (flags == NULL || (*flags & (MSG_FNONBLOCKING|MSG_FBLOCKING)) == 0) { + if (fp->f_flag & FNONBLOCK) { + if (flags) { + *flags |= MSG_FNONBLOCKING; + } else { + lflags = MSG_FNONBLOCKING; + flags = &lflags; + } + } + } + error = so_pru_soreceive(so, sa, auio, NULL, control, flags); if (error) { if (auio->uio_resid != len && (error == ERESTART || @@ -1465,7 +1483,7 @@ retry_lookup: * Optimize the non-blocking case by looking at the socket space * before going to the extra work of constituting the sf_buf. */ - if ((so->so_state & SS_NBIO) && sbspace(&so->so_snd) <= 0) { + if ((fp->f_flag & FNONBLOCK) && sbspace(&so->so_snd) <= 0) { if (so->so_state & SS_CANTSENDMORE) error = EPIPE; else @@ -1631,7 +1649,7 @@ retry_space: * a race condition with sbwait(). */ if (sbspace(&so->so_snd) < so->so_snd.sb_lowat) { - if (so->so_state & SS_NBIO) { + if (fp->f_flag & FNONBLOCK) { m_freem(m); sbunlock(&so->so_snd); crit_exit(); diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 5adaf48295..ac27f0c37b 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -14,7 +14,7 @@ * of the author. This software is distributed AS-IS. * * $FreeBSD: src/sys/kern/vfs_aio.c,v 1.70.2.28 2003/05/29 06:15:35 alc Exp $ - * $DragonFly: src/sys/kern/vfs_aio.c,v 1.28 2006/06/05 07:26:10 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_aio.c,v 1.29 2006/06/13 08:12:03 dillon Exp $ */ /* @@ -580,10 +580,10 @@ aio_process(struct aiocblist *aiocbe) */ if (cb->aio_lio_opcode == LIO_READ) { auio.uio_rw = UIO_READ; - error = fo_read(fp, &auio, fp->f_cred, FOF_OFFSET); + error = fo_read(fp, &auio, fp->f_cred, O_FOFFSET); } else { auio.uio_rw = UIO_WRITE; - error = fo_write(fp, &auio, fp->f_cred, FOF_OFFSET); + error = fo_write(fp, &auio, fp->f_cred, O_FOFFSET); } inblock_end = mytd->td_proc->p_stats->p_ru.ru_inblock; oublock_end = mytd->td_proc->p_stats->p_ru.ru_oublock; diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index d705d83dc6..ed4976160a 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -37,7 +37,7 @@ * * @(#)vfs_vnops.c 8.2 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/vfs_vnops.c,v 1.87.2.13 2002/12/29 18:19:53 dillon Exp $ - * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.40 2006/05/26 00:33:09 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.41 2006/06/13 08:12:03 dillon Exp $ */ #include @@ -492,19 +492,30 @@ vn_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags) KASSERT(uio->uio_td == curthread, ("uio_td %p is not td %p", uio->uio_td, curthread)); vp = (struct vnode *)fp->f_data; + ioflag = 0; - if (fp->f_flag & FNONBLOCK) + if (flags & O_FBLOCKING) { + /* ioflag &= ~IO_NDELAY; */ + } else if (flags & O_FNONBLOCKING) { + ioflag |= IO_NDELAY; + } else if (fp->f_flag & FNONBLOCK) { ioflag |= IO_NDELAY; - if (fp->f_flag & O_DIRECT) + } + if (flags & O_FBUFFERED) { + /* ioflag &= ~IO_DIRECT; */ + } else if (flags & O_FUNBUFFERED) { + ioflag |= IO_DIRECT; + } else if (fp->f_flag & O_DIRECT) { ioflag |= IO_DIRECT; + } vn_lock(vp, LK_SHARED | LK_NOPAUSE | LK_RETRY); - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) uio->uio_offset = fp->f_offset; ioflag |= sequential_heuristic(uio, fp); error = VOP_READ(vp, uio, ioflag, cred); - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) fp->f_offset = uio->uio_offset; fp->f_nextoff = uio->uio_offset; VOP_UNLOCK(vp, 0); @@ -548,20 +559,30 @@ svn_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags) error = 0; goto done; } - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) uio->uio_offset = fp->f_offset; ioflag = 0; - if (fp->f_flag & FNONBLOCK) + if (flags & O_FBLOCKING) { + /* ioflag &= ~IO_NDELAY; */ + } else if (flags & O_FNONBLOCKING) { + ioflag |= IO_NDELAY; + } else if (fp->f_flag & FNONBLOCK) { ioflag |= IO_NDELAY; - if (fp->f_flag & O_DIRECT) + } + if (flags & O_FBUFFERED) { + /* ioflag &= ~IO_DIRECT; */ + } else if (flags & O_FUNBUFFERED) { + ioflag |= IO_DIRECT; + } else if (fp->f_flag & O_DIRECT) { ioflag |= IO_DIRECT; + } ioflag |= sequential_heuristic(uio, fp); error = dev_dread(dev, uio, ioflag); release_dev(dev); - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) fp->f_offset = uio->uio_offset; fp->f_nextoff = uio->uio_offset; done: @@ -585,22 +606,43 @@ vn_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) if (vp->v_type == VREG) bwillwrite(); vp = (struct vnode *)fp->f_data; /* XXX needed? */ + ioflag = IO_UNIT; - if (vp->v_type == VREG && (fp->f_flag & O_APPEND)) + if (vp->v_type == VREG && + ((fp->f_flag & O_APPEND) || (flags & O_FAPPEND))) { ioflag |= IO_APPEND; - if (fp->f_flag & FNONBLOCK) + } + + if (flags & O_FBLOCKING) { + /* ioflag &= ~IO_NDELAY; */ + } else if (flags & O_FNONBLOCKING) { ioflag |= IO_NDELAY; - if (fp->f_flag & O_DIRECT) + } else if (fp->f_flag & FNONBLOCK) { + ioflag |= IO_NDELAY; + } + if (flags & O_FBUFFERED) { + /* ioflag &= ~IO_DIRECT; */ + } else if (flags & O_FUNBUFFERED) { + ioflag |= IO_DIRECT; + } else if (fp->f_flag & O_DIRECT) { ioflag |= IO_DIRECT; - if ((fp->f_flag & O_FSYNC) || - (vp->v_mount && (vp->v_mount->mnt_flag & MNT_SYNCHRONOUS))) + } + if (flags & O_FASYNCWRITE) { + /* ioflag &= ~IO_SYNC; */ + } else if (flags & O_FSYNCWRITE) { + ioflag |= IO_SYNC; + } else if (fp->f_flag & O_FSYNC) { + ioflag |= IO_SYNC; + } + + if (vp->v_mount && (vp->v_mount->mnt_flag & MNT_SYNCHRONOUS)) ioflag |= IO_SYNC; vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) uio->uio_offset = fp->f_offset; ioflag |= sequential_heuristic(uio, fp); error = VOP_WRITE(vp, uio, ioflag, cred); - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) fp->f_offset = uio->uio_offset; fp->f_nextoff = uio->uio_offset; VOP_UNLOCK(vp, 0); @@ -643,25 +685,45 @@ svn_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) } reference_dev(dev); - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) uio->uio_offset = fp->f_offset; ioflag = IO_UNIT; - if (vp->v_type == VREG && (fp->f_flag & O_APPEND)) + if (vp->v_type == VREG && + ((fp->f_flag & O_APPEND) || (flags & O_FAPPEND))) { ioflag |= IO_APPEND; - if (fp->f_flag & FNONBLOCK) + } + + if (flags & O_FBLOCKING) { + /* ioflag &= ~IO_NDELAY; */ + } else if (flags & O_FNONBLOCKING) { + ioflag |= IO_NDELAY; + } else if (fp->f_flag & FNONBLOCK) { ioflag |= IO_NDELAY; - if (fp->f_flag & O_DIRECT) + } + if (flags & O_FBUFFERED) { + /* ioflag &= ~IO_DIRECT; */ + } else if (flags & O_FUNBUFFERED) { + ioflag |= IO_DIRECT; + } else if (fp->f_flag & O_DIRECT) { ioflag |= IO_DIRECT; - if ((fp->f_flag & O_FSYNC) || - (vp->v_mount && (vp->v_mount->mnt_flag & MNT_SYNCHRONOUS))) + } + if (flags & O_FASYNCWRITE) { + /* ioflag &= ~IO_SYNC; */ + } else if (flags & O_FSYNCWRITE) { + ioflag |= IO_SYNC; + } else if (fp->f_flag & O_FSYNC) { + ioflag |= IO_SYNC; + } + + if (vp->v_mount && (vp->v_mount->mnt_flag & MNT_SYNCHRONOUS)) ioflag |= IO_SYNC; ioflag |= sequential_heuristic(uio, fp); error = dev_dwrite(dev, uio, ioflag); release_dev(dev); - if ((flags & FOF_OFFSET) == 0) + if ((flags & O_FOFFSET) == 0) fp->f_offset = uio->uio_offset; fp->f_nextoff = uio->uio_offset; done: @@ -840,7 +902,7 @@ vn_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *ucred) error = 0; break; } - if (com == FIONBIO || com == FIOASYNC) { /* XXX */ + if (com == FIOASYNC) { /* XXX */ error = 0; /* XXX */ break; } diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 6f72bc916d..5194a802f2 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -38,7 +38,7 @@ * @(#)bpf.c 8.2 (Berkeley) 3/28/94 * * $FreeBSD: src/sys/net/bpf.c,v 1.59.2.12 2002/04/14 21:41:48 luigi Exp $ - * $DragonFly: src/sys/net/bpf.c,v 1.29 2005/11/28 17:13:45 dillon Exp $ + * $DragonFly: src/sys/net/bpf.c,v 1.30 2006/06/13 08:12:03 dillon Exp $ */ #include "use_bpf.h" @@ -828,9 +828,6 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) d->bd_seesent = *(u_int *)addr; break; - case FIONBIO: /* Non-blocking I/O */ - break; - case FIOASYNC: /* Send signal on receive packets */ d->bd_async = *(int *)addr; break; diff --git a/sys/net/i4b/driver/i4b_rbch.c b/sys/net/i4b/driver/i4b_rbch.c index c8b8fd9a46..cf2e8142a1 100644 --- a/sys/net/i4b/driver/i4b_rbch.c +++ b/sys/net/i4b/driver/i4b_rbch.c @@ -28,7 +28,7 @@ * --------------------------------------------------- * * $FreeBSD: src/sys/i4b/driver/i4b_rbch.c,v 1.10.2.3 2001/08/12 16:22:48 hm Exp $ - * $DragonFly: src/sys/net/i4b/driver/i4b_rbch.c,v 1.17 2005/06/15 11:56:03 joerg Exp $ + * $DragonFly: src/sys/net/i4b/driver/i4b_rbch.c,v 1.18 2006/06/13 08:12:03 dillon Exp $ * * last edit-date: [Sat Aug 11 18:06:57 2001] * @@ -262,7 +262,7 @@ i4brbchread(dev_t dev, struct uio *uio, int ioflag) return(EIO); } - if((sc->sc_devstate & ST_NOBLOCK)) + if((sc->sc_devstate & ST_NOBLOCK) || (ioflag & IO_NDELAY)) { if(!(sc->sc_devstate & ST_CONNECTED)) { CRIT_END; @@ -361,7 +361,7 @@ i4brbchwrite(dev_t dev, struct uio * uio, int ioflag) return(EIO); } - if((sc->sc_devstate & ST_NOBLOCK)) + if((sc->sc_devstate & ST_NOBLOCK) || (ioflag & IO_NDELAY)) { if(!(sc->sc_devstate & ST_CONNECTED)) { CRIT_END; @@ -479,19 +479,6 @@ i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct thread * } break; - case FIONBIO: - if (*(int *)data) - { - NDBGL4(L4_RBCHDBG, "unit %d, setting non-blocking mode", unit); - sc->sc_devstate |= ST_NOBLOCK; - } - else - { - NDBGL4(L4_RBCHDBG, "unit %d, clearing non-blocking mode", unit); - sc->sc_devstate &= ~ST_NOBLOCK; - } - break; - case TIOCCDTR: /* Clear DTR */ if(sc->sc_devstate & ST_CONNECTED) { diff --git a/sys/net/netisr.h b/sys/net/netisr.h index bab9b8a38a..0847754fc7 100644 --- a/sys/net/netisr.h +++ b/sys/net/netisr.h @@ -82,7 +82,7 @@ * * @(#)netisr.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/net/netisr.h,v 1.21.2.5 2002/02/09 23:02:39 luigi Exp $ - * $DragonFly: src/sys/net/netisr.h,v 1.23 2006/05/21 03:43:45 dillon Exp $ + * $DragonFly: src/sys/net/netisr.h,v 1.24 2006/06/13 08:12:03 dillon Exp $ */ #ifndef _NET_NETISR_H_ @@ -171,6 +171,7 @@ struct netmsg_so_notify { struct lwkt_msg nm_lmsg; msg_predicate_fn_t nm_predicate; struct socket *nm_so; + int nm_fflags; /* flags e.g. FNONBLOCK */ int nm_etype; /* receive or send event */ TAILQ_ENTRY(netmsg_so_notify) nm_list; }; diff --git a/sys/net/tap/if_tap.c b/sys/net/tap/if_tap.c index b65b9c68b9..9606da1c8f 100644 --- a/sys/net/tap/if_tap.c +++ b/sys/net/tap/if_tap.c @@ -32,7 +32,7 @@ /* * $FreeBSD: src/sys/net/if_tap.c,v 1.3.2.3 2002/04/14 21:41:48 luigi Exp $ - * $DragonFly: src/sys/net/tap/if_tap.c,v 1.24 2005/12/30 18:37:09 dillon Exp $ + * $DragonFly: src/sys/net/tap/if_tap.c,v 1.25 2006/06/13 08:12:03 dillon Exp $ * $Id: if_tap.c,v 0.21 2000/07/23 21:46:02 max Exp $ */ @@ -523,9 +523,6 @@ tapioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) *(int *)data = tapdebug; break; - case FIONBIO: - break; - case FIOASYNC: if (*(int *)data) tp->tap_flags |= TAP_ASYNC; diff --git a/sys/net/tun/if_tun.c b/sys/net/tun/if_tun.c index 93cd11e550..dcdb564d9d 100644 --- a/sys/net/tun/if_tun.c +++ b/sys/net/tun/if_tun.c @@ -14,7 +14,7 @@ * operation though. * * $FreeBSD: src/sys/net/if_tun.c,v 1.74.2.8 2002/02/13 00:43:11 dillon Exp $ - * $DragonFly: src/sys/net/tun/if_tun.c,v 1.27 2005/12/11 13:00:17 swildner Exp $ + * $DragonFly: src/sys/net/tun/if_tun.c,v 1.28 2006/06/13 08:12:03 dillon Exp $ */ #include "opt_atalk.h" @@ -455,8 +455,6 @@ tunioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case TUNSIFPID: tp->tun_pid = curproc->p_pid; break; - case FIONBIO: - break; case FIOASYNC: if (*(int *)data) tp->tun_flags |= TUN_ASYNC; diff --git a/sys/netgraph/ksocket/ng_ksocket.c b/sys/netgraph/ksocket/ng_ksocket.c index 833dbc6c7a..c1d3728d75 100644 --- a/sys/netgraph/ksocket/ng_ksocket.c +++ b/sys/netgraph/ksocket/ng_ksocket.c @@ -37,7 +37,7 @@ * Author: Archie Cobbs * * $FreeBSD: src/sys/netgraph/ng_ksocket.c,v 1.5.2.14 2003/08/24 08:24:38 hsu Exp $ - * $DragonFly: src/sys/netgraph/ksocket/ng_ksocket.c,v 1.10 2005/06/02 22:11:45 swildner Exp $ + * $DragonFly: src/sys/netgraph/ksocket/ng_ksocket.c,v 1.11 2006/06/13 08:12:03 dillon Exp $ * $Whistle: ng_ksocket.c,v 1.1 1999/11/16 20:04:40 archie Exp $ */ @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -614,7 +615,6 @@ ng_ksocket_newhook(node_p node, hook_p hook, const char *name0) priv->so->so_upcall = ng_ksocket_incoming; priv->so->so_rcv.sb_flags |= SB_UPCALL; priv->so->so_snd.sb_flags |= SB_UPCALL; - priv->so->so_state |= SS_NBIO; } /* OK */ @@ -939,7 +939,7 @@ ng_ksocket_rmnode(node_p node) priv->so->so_upcall = NULL; priv->so->so_rcv.sb_flags &= ~SB_UPCALL; priv->so->so_snd.sb_flags &= ~SB_UPCALL; - soclose(priv->so); + soclose(priv->so, FNONBLOCK); priv->so = NULL; } @@ -1166,7 +1166,6 @@ ng_ksocket_finish_accept(priv_p priv, struct ng_mesg **rptr) /* XXX KNOTE(&head->so_rcv.sb_sel.si_note, 0); */ so->so_state &= ~SS_COMP; - so->so_state |= SS_NBIO; so->so_head = NULL; soaccept(so, &sa); @@ -1178,7 +1177,7 @@ ng_ksocket_finish_accept(priv_p priv, struct ng_mesg **rptr) NG_MKMESSAGE(resp, NGM_KSOCKET_COOKIE, NGM_KSOCKET_ACCEPT, len, M_NOWAIT); if (resp == NULL) { - soclose(so); + soclose(so, FNONBLOCK); goto out; } resp->header.flags |= NGF_RESP; @@ -1187,7 +1186,7 @@ ng_ksocket_finish_accept(priv_p priv, struct ng_mesg **rptr) /* Clone a ksocket node to wrap the new socket */ if (ng_ksocket_constructor(&node2) != 0) { FREE(resp, M_NETGRAPH); - soclose(so); + soclose(so, FNONBLOCK); goto out; } priv2 = (priv_p)node2->private; diff --git a/sys/netinet/sctp.h b/sys/netinet/sctp.h index e8ded4187b..2aad2396aa 100644 --- a/sys/netinet/sctp.h +++ b/sys/netinet/sctp.h @@ -1,5 +1,5 @@ /* $KAME: sctp.h,v 1.17 2004/08/17 04:06:15 itojun Exp $ */ -/* $DragonFly: src/sys/netinet/sctp.h,v 1.2 2006/05/20 02:42:12 dillon Exp $ */ +/* $DragonFly: src/sys/netinet/sctp.h,v 1.3 2006/06/13 08:12:03 dillon Exp $ */ #ifndef _NETINET_SCTP_H_ #define _NETINET_SCTP_H_ @@ -111,6 +111,11 @@ struct sctp_paramhdr { */ /* Blocking I/O is controled by the SS_NBIO flag on the * socket state so_state field. + * + * XXX SS_NBIO no longer exists on DragonFly. Why is SCTP trying to set + * the blocking/non-blocking default state? We really need to present a + * uniform interface to the user program, so we do not actually try to + * do this any more. */ #define SCTP_GET_SNDBUF_USE 0x0000000f /* latter added read/write */ diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index 1cfb004f76..8a997526d9 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -1,5 +1,5 @@ /* $KAME: sctp_output.c,v 1.46 2005/03/06 16:04:17 itojun Exp $ */ -/* $DragonFly: src/sys/netinet/sctp_output.c,v 1.5 2006/01/14 11:33:50 swildner Exp $ */ +/* $DragonFly: src/sys/netinet/sctp_output.c,v 1.6 2006/06/13 08:12:03 dillon Exp $ */ /* * Copyright (C) 2002, 2003, 2004 Cisco Systems Inc, @@ -4341,11 +4341,7 @@ sctp_msg_append(struct sctp_tcb *stcb, so->so_snd.sb_mbmax)) { struct sctp_inpcb *inp; /* Now did we free up enough room? */ - if ((so->so_state & SS_NBIO) -#if defined(__FreeBSD__) && __FreeBSD_version >= 500000 - || (flags & MSG_NBIO) -#endif - ) { + if (flags & (MSG_FNONBLOCKING|MSG_DONTWAIT)) { /* Non-blocking io in place */ error = EWOULDBLOCK; goto release; @@ -4750,7 +4746,7 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, { struct sctp_copy_all *ca; struct mbuf *m; - int turned_on_nonblock=0, ret; + int ret; ca = (struct sctp_copy_all *)ptr; if (ca->m == NULL) { @@ -4766,16 +4762,8 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, ca->cnt_failed++; return; } - if ((stcb->sctp_socket->so_state & SS_NBIO) == 0) { - /* we have to do this non-blocking */ - turned_on_nonblock = 1; - stcb->sctp_socket->so_state |= SS_NBIO; - } - ret = sctp_msg_append(stcb, stcb->asoc.primary_destination, m, &ca->sndrcv, 0); - if (turned_on_nonblock) { - /* we turned on non-blocking so turn it off */ - stcb->sctp_socket->so_state &= ~SS_NBIO; - } + ret = sctp_msg_append(stcb, stcb->asoc.primary_destination, m, + &ca->sndrcv, MSG_FNONBLOCKING); if (ret) { ca->cnt_failed++; } else { @@ -9564,11 +9552,7 @@ sctp_copy_it_in(struct sctp_inpcb *inp, (asoc->total_output_mbuf_queue_size > so->so_snd.sb_mbmax) ) { - if ((so->so_state & SS_NBIO) -#if defined(__FreeBSD__) && __FreeBSD_version >= 500000 - || (flags & MSG_NBIO) -#endif - ) { + if (flags & (MSG_FNONBLOCKING|MSG_DONTWAIT)) { /* Non-blocking io in place */ error = EWOULDBLOCK; goto release; diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index 96ff4566ef..24073543df 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -1,5 +1,5 @@ /* $KAME: sctp_pcb.c,v 1.37 2004/08/17 06:28:02 t-momose Exp $ */ -/* $DragonFly: src/sys/netinet/sctp_pcb.c,v 1.8 2006/01/14 11:33:50 swildner Exp $ */ +/* $DragonFly: src/sys/netinet/sctp_pcb.c,v 1.9 2006/06/13 08:12:03 dillon Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc. @@ -1534,15 +1534,11 @@ sctp_inpcb_alloc(struct socket *so) inp->sctp_flags = (SCTP_PCB_FLAGS_UDPTYPE | SCTP_PCB_FLAGS_UNBOUND); inp->sctp_flags |= (SCTP_PCB_FLAGS_RECVDATAIOEVNT); - /* Be sure it is NON-BLOCKING IO for UDP */ - /*so->so_state |= SS_NBIO;*/ } else if (so->so_type == SOCK_STREAM) { /* TCP style socket */ inp->sctp_flags = (SCTP_PCB_FLAGS_TCPTYPE | SCTP_PCB_FLAGS_UNBOUND); inp->sctp_flags |= (SCTP_PCB_FLAGS_RECVDATAIOEVNT); - /* Be sure we have blocking IO bu default */ - so->so_state &= ~SS_NBIO; } else { /* * unsupported socket type (RAW, etc)- in case we missed diff --git a/sys/netinet/sctp_peeloff.c b/sys/netinet/sctp_peeloff.c index 5cecb5cdac..b8e2c55b7b 100644 --- a/sys/netinet/sctp_peeloff.c +++ b/sys/netinet/sctp_peeloff.c @@ -1,5 +1,5 @@ /* $KAME: sctp_peeloff.c,v 1.12 2004/08/17 04:06:19 itojun Exp $ */ -/* $DragonFly: src/sys/netinet/sctp_peeloff.c,v 1.2 2005/07/15 15:02:02 eirikn Exp $ */ +/* $DragonFly: src/sys/netinet/sctp_peeloff.c,v 1.3 2006/06/13 08:12:03 dillon Exp $ */ /* * Copyright (C) 2002, 2003 Cisco Systems Inc, @@ -187,8 +187,6 @@ sctp_get_peeloff(struct socket *head, caddr_t assoc_id, int *error) SCTP_PCB_FLAGS_IN_TCPPOOL | /* Turn on Blocking IO */ (SCTP_PCB_COPY_FLAGS & inp->sctp_flags)); n_inp->sctp_socket = newso; - /* Turn off any non-blocking symantic. */ - newso->so_state &= ~SS_NBIO; newso->so_state |= SS_ISCONNECTED; /* We remove it right away */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__DragonFly__) diff --git a/sys/netproto/ncp/ncp_sock.c b/sys/netproto/ncp/ncp_sock.c index 776937e31d..342630a460 100644 --- a/sys/netproto/ncp/ncp_sock.c +++ b/sys/netproto/ncp/ncp_sock.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netncp/ncp_sock.c,v 1.2 1999/10/12 10:36:59 bp Exp $ - * $DragonFly: src/sys/netproto/ncp/ncp_sock.c,v 1.13 2006/05/06 02:43:13 dillon Exp $ + * $DragonFly: src/sys/netproto/ncp/ncp_sock.c,v 1.14 2006/06/13 08:12:04 dillon Exp $ * * Low level socket routines */ @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -288,9 +289,9 @@ ncp_sock_connect_ipx(struct ncp_conn *conn) { if (!error) break; if (error != EADDRINUSE) goto bad; sipx.sipx_port = htons((ntohs(sipx.sipx_port)+4) & 0xfff8); - soclose(conn->ncp_so); + soclose(conn->ncp_so, FNONBLOCK); if (conn->wdg_so) - soclose(conn->wdg_so); + soclose(conn->wdg_so, FNONBLOCK); } npcb = sotoipxpcb(conn->ncp_so); npcb->ipxp_dpt = IPXPROTO_NCP; @@ -376,20 +377,20 @@ ncp_sock_disconnect(struct ncp_conn *conn) { so = conn->ncp_so; conn->ncp_so = (struct socket *)0; soshutdown(so, 2); - soclose(so); + soclose(so, FNONBLOCK); } if (conn->wdg_so) { so = conn->wdg_so; conn->wdg_so = (struct socket *)0; soshutdown(so, 2); - soclose(so); + soclose(so, FNONBLOCK); } #ifdef NCPBURST if (conn->bc_so) { so = conn->bc_so; conn->bc_so = (struct socket *)NULL; soshutdown(so, 2); - soclose(so); + soclose(so, FNONBLOCK); } #endif return 0; diff --git a/sys/netproto/smb/smb_trantcp.c b/sys/netproto/smb/smb_trantcp.c index bda11da454..1a8a78dcf4 100644 --- a/sys/netproto/smb/smb_trantcp.c +++ b/sys/netproto/smb/smb_trantcp.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netsmb/smb_trantcp.c,v 1.3.2.1 2001/05/22 08:32:34 bp Exp $ - * $DragonFly: src/sys/netproto/smb/smb_trantcp.c,v 1.14 2006/05/06 02:43:13 dillon Exp $ + * $DragonFly: src/sys/netproto/smb/smb_trantcp.c,v 1.15 2006/06/13 08:12:04 dillon Exp $ */ #include #include @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -557,7 +558,7 @@ smb_nbst_disconnect(struct smb_vc *vcp, struct thread *td) nbp->nbp_flags &= ~NBF_CONNECTED; nbp->nbp_tso = (struct socket *)NULL; soshutdown(so, 2); - soclose(so); + soclose(so, FNONBLOCK); } if (nbp->nbp_state != NBST_RETARGET) { nbp->nbp_state = NBST_CLOSED; diff --git a/sys/platform/pc32/i386/mem.c b/sys/platform/pc32/i386/mem.c index a7e4d3d5c5..0f335808c3 100644 --- a/sys/platform/pc32/i386/mem.c +++ b/sys/platform/pc32/i386/mem.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/platform/pc32/i386/Attic/mem.c,v 1.12 2005/11/02 22:59:43 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/Attic/mem.c,v 1.13 2006/06/13 08:12:03 dillon Exp $ */ /* @@ -453,7 +453,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) switch (cmd) { /* Really handled in upper layer */ case FIOASYNC: - case FIONBIO: break; case MEM_SETIRQ: intr = *(int16_t *)data; diff --git a/sys/sys/fcntl.h b/sys/sys/fcntl.h index c18edf8349..570846cf51 100644 --- a/sys/sys/fcntl.h +++ b/sys/sys/fcntl.h @@ -37,7 +37,7 @@ * * @(#)fcntl.h 8.3 (Berkeley) 1/21/94 * $FreeBSD: src/sys/sys/fcntl.h,v 1.9.2.2 2001/06/03 05:00:10 dillon Exp $ - * $DragonFly: src/sys/sys/fcntl.h,v 1.8 2006/05/20 02:42:13 dillon Exp $ + * $DragonFly: src/sys/sys/fcntl.h,v 1.9 2006/06/13 08:12:04 dillon Exp $ */ #ifndef _SYS_FCNTL_H_ @@ -93,13 +93,25 @@ /* Defined by POSIX 1003.1; BSD default, but must be distinct from O_RDONLY. */ #define O_NOCTTY 0x8000 /* don't assign controlling terminal */ -/* Attempt to bypass buffer cache */ +/* Attempt to bypass the buffer cache */ #define O_DIRECT 0x00010000 #ifdef _KERNEL #define O_ROOTCRED 0x00020000 /* fp_open */ #endif +#define O_FBLOCKING 0x00040000 /* force blocking I/O */ +#define O_FNONBLOCKING 0x00080000 /* force non-blocking I/O */ +#define O_FAPPEND 0x00100000 /* force append mode for write */ +#define O_FOFFSET 0x00200000 /* force specific offset */ +#define O_FSYNCWRITE 0x00400000 /* force synchronous write */ +#define O_FASYNCWRITE 0x00800000 /* force asynchronous write */ +#define O_FUNBUFFERED 0x01000000 /* force unbuffered (direct) I/O */ +#define O_FBUFFERED 0x02000000 /* force buffered I/O */ + +#define O_FMASK (O_FBLOCKING|O_FNONBLOCKING|O_FAPPEND|O_FOFFSET|\ + O_FSYNCWRITE|O_FASYNCWRITE|O_FUNBUFFERED|O_FBUFFERED) + #ifdef _KERNEL /* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */ #define FFLAGS(oflags) ((oflags) + 1) diff --git a/sys/sys/file.h b/sys/sys/file.h index 7eb2a24ac7..89d68362f5 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -32,7 +32,7 @@ * * @(#)file.h 8.3 (Berkeley) 1/9/95 * $FreeBSD: src/sys/sys/file.h,v 1.22.2.7 2002/11/21 23:39:24 sam Exp $ - * $DragonFly: src/sys/sys/file.h,v 1.20 2006/05/26 02:26:26 dillon Exp $ + * $DragonFly: src/sys/sys/file.h,v 1.21 2006/06/13 08:12:04 dillon Exp $ */ #ifndef _SYS_FILE_H_ @@ -87,8 +87,6 @@ struct fileops { int (*fold_shutdown) (struct file *fp, int how); }; -#define FOF_OFFSET 1 /* fo_read(), fo_write() flags */ - /* * Kernel descriptor table - One entry for each open kernel vnode and socket. * diff --git a/sys/sys/param.h b/sys/sys/param.h index 1e1b36a845..f95488116c 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -37,7 +37,7 @@ * * @(#)param.h 8.3 (Berkeley) 4/4/95 * $FreeBSD: src/sys/sys/param.h,v 1.61.2.38 2003/05/22 17:12:01 fjoe Exp $ - * $DragonFly: src/sys/sys/param.h,v 1.32 2006/04/14 01:00:16 dillon Exp $ + * $DragonFly: src/sys/sys/param.h,v 1.33 2006/06/13 08:12:04 dillon Exp $ */ #ifndef _SYS_PARAM_H_ @@ -53,9 +53,11 @@ * * Version changes should be documented in: * doc/en_US.ISO8859-1/books/porters-handbook/book.sgml + * + * 150002 - MSG_F* and O_F* flags (force blocking/non-blocking operation) */ #undef __DragonFly_version -#define __DragonFly_version 150001 /* Master, propagated to newvers */ +#define __DragonFly_version 150002 /* Master, propagated to newvers */ #ifdef __FreeBSD__ /* diff --git a/sys/sys/socket.h b/sys/sys/socket.h index b144d214f1..e8d37edb94 100644 --- a/sys/sys/socket.h +++ b/sys/sys/socket.h @@ -32,7 +32,7 @@ * * @(#)socket.h 8.4 (Berkeley) 2/21/94 * $FreeBSD: src/sys/sys/socket.h,v 1.39.2.7 2001/07/03 11:02:01 ume Exp $ - * $DragonFly: src/sys/sys/socket.h,v 1.13 2006/06/11 22:54:18 joerg Exp $ + * $DragonFly: src/sys/sys/socket.h,v 1.14 2006/06/13 08:12:04 dillon Exp $ */ #ifndef _SYS_SOCKET_H_ @@ -339,16 +339,25 @@ struct msghdr { int msg_flags; /* flags on received message */ }; -#define MSG_OOB 0x1 /* process out-of-band data */ -#define MSG_PEEK 0x2 /* peek at incoming message */ -#define MSG_DONTROUTE 0x4 /* send without using routing tables */ -#define MSG_EOR 0x8 /* data completes record */ -#define MSG_TRUNC 0x10 /* data discarded before delivery */ -#define MSG_CTRUNC 0x20 /* control data lost before delivery */ -#define MSG_WAITALL 0x40 /* wait for full request or error */ -#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ -#define MSG_EOF 0x100 /* data completes connection */ -#define MSG_NOTIFICATION 0x200 /* notification message */ +#define MSG_OOB 0x00000001 /* process out-of-band data */ +#define MSG_PEEK 0x00000002 /* peek at incoming message */ +#define MSG_DONTROUTE 0x00000004 /* send without using routing tables */ +#define MSG_EOR 0x00000008 /* data completes record */ +#define MSG_TRUNC 0x00000010 /* data discarded before delivery */ +#define MSG_CTRUNC 0x00000020 /* control data lost before delivery */ +#define MSG_WAITALL 0x00000040 /* wait for full request or error */ +#define MSG_DONTWAIT 0x00000080 /* this message should be nonblocking */ +#define MSG_EOF 0x00000100 /* data completes connection */ +#define MSG_NOTIFICATION 0x00000200 /* notification message */ + +/* + * These override FIONBIO. MSG_FNONBLOCKING is functionally equivalent to + * MSG_DONTWAIT. + */ +#define MSG_FBLOCKING 0x00010000 /* force blocking operation */ +#define MSG_FNONBLOCKING 0x00020000 /* force non-blocking operation */ + +#define MSG_FMASK 0xFFFF0000 /* force mask */ /* * Header for ancillary data objects in msg_control buffer. diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 7b0a9fdb91..3a50f1d7da 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -32,7 +32,7 @@ * * @(#)socketvar.h 8.3 (Berkeley) 2/19/95 * $FreeBSD: src/sys/sys/socketvar.h,v 1.46.2.10 2003/08/24 08:24:39 hsu Exp $ - * $DragonFly: src/sys/sys/socketvar.h,v 1.25 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/sys/socketvar.h,v 1.26 2006/06/13 08:12:04 dillon Exp $ */ #ifndef _SYS_SOCKETVAR_H_ @@ -144,7 +144,7 @@ struct socket { #define SS_CANTRCVMORE 0x0020 /* can't receive more data from peer */ #define SS_RCVATMARK 0x0040 /* at mark on input */ -#define SS_NBIO 0x0100 /* non-blocking ops */ +#define SS_UNUSED0100 0x0100 #define SS_ASYNC 0x0200 /* async i/o notify */ #define SS_ISCONFIRMING 0x0400 /* deciding to accept connection req */ @@ -370,7 +370,7 @@ struct socket *soalloc (int waitok); int sobind (struct socket *so, struct sockaddr *nam, struct thread *td); void socantrcvmore (struct socket *so); void socantsendmore (struct socket *so); -int soclose (struct socket *so); +int soclose (struct socket *so, int fflags); int soconnect (struct socket *so, struct sockaddr *nam, struct thread *td); int soconnect2 (struct socket *so1, struct socket *so2); int socreate (int dom, struct socket **aso, int type, int proto, diff --git a/sys/sys/syscall-args b/sys/sys/syscall-args index 6e0b9f6d66..465d5bf62b 100644 --- a/sys/sys/syscall-args +++ b/sys/sys/syscall-args @@ -1,6 +1,6 @@ # System call argument table. # DO NOT EDIT-- this file is automatically generated. -# $DragonFly: src/sys/sys/Attic/syscall-args,v 1.24 2006/06/07 03:02:11 dillon Exp $ +# $DragonFly: src/sys/sys/Attic/syscall-args,v 1.25 2006/06/13 08:12:04 dillon Exp $ # Created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp @@ -120,8 +120,8 @@ int rtprio rtprio rtprio_args int function pid_t pid struct rtprio * rtp int semsys semsys semsys_args int which int a2 int a3 int a4 int a5 int msgsys msgsys msgsys_args int which int a2 int a3 int a4 int a5 int a6 int shmsys shmsys shmsys_args int which int a2 int a3 int a4 -int pread pread pread_args int fd void * buf size_t nbyte int pad off_t offset -int pwrite pwrite pwrite_args int fd const void * buf size_t nbyte int pad off_t offset +int __pread __pread __pread_args int fd void * buf size_t nbyte int flags off_t offset +int __pwrite __pwrite __pwrite_args int fd const void * buf size_t nbyte int flags off_t offset int ntp_adjtime ntp_adjtime ntp_adjtime_args struct timex * tp int setgid setgid setgid_args gid_t gid int setegid setegid setegid_args gid_t egid @@ -166,8 +166,8 @@ int lchmod lchmod lchmod_args char * path mode_t mode int netbsd_lchown lchown lchown_args char * path uid_t uid gid_t gid int lutimes lutimes lutimes_args char * path struct timeval * tptr int netbsd_msync msync msync_args void * addr size_t len int flags -int preadv preadv preadv_args int fd struct iovec * iovp u_int iovcnt off_t offset -int pwritev pwritev pwritev_args int fd struct iovec * iovp u_int iovcnt off_t offset +int __preadv __preadv __preadv_args int fd struct iovec * iovp u_int iovcnt int flags off_t offset +int __pwritev __pwritev __pwritev_args int fd struct iovec * iovp u_int iovcnt int flags off_t offset int fhstatfs fhstatfs fhstatfs_args const struct fhandle * u_fhp struct statfs * buf int fhopen fhopen fhopen_args const struct fhandle * u_fhp int flags int modnext modnext modnext_args int modid diff --git a/sys/sys/syscall-hide.h b/sys/sys/syscall-hide.h index f12cf54a2d..5681e875bd 100644 --- a/sys/sys/syscall-hide.h +++ b/sys/sys/syscall-hide.h @@ -2,7 +2,7 @@ * System call hiders. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/syscall-hide.h,v 1.40 2006/06/07 03:02:11 dillon Exp $ + * $DragonFly: src/sys/sys/syscall-hide.h,v 1.41 2006/06/13 08:12:04 dillon Exp $ * created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp */ @@ -156,8 +156,8 @@ HIDE_BSD(rtprio) HIDE_BSD(semsys) HIDE_BSD(msgsys) HIDE_BSD(shmsys) -HIDE_POSIX(pread) -HIDE_POSIX(pwrite) +HIDE_POSIX(__pread) +HIDE_POSIX(__pwrite) HIDE_BSD(ntp_adjtime) HIDE_POSIX(setgid) HIDE_BSD(setegid) @@ -211,8 +211,8 @@ HIDE_BSD(lchown) HIDE_BSD(lutimes) HIDE_BSD(msync) HIDE_BSD({) -HIDE_BSD(preadv) -HIDE_BSD(pwritev) +HIDE_BSD(__preadv) +HIDE_BSD(__pwritev) HIDE_BSD(fhstatfs) HIDE_BSD(fhopen) HIDE_POSIX(fhstat) diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index b36e8e5886..3e8970a017 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -2,7 +2,7 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/syscall.h,v 1.40 2006/06/07 03:02:11 dillon Exp $ + * $DragonFly: src/sys/sys/syscall.h,v 1.41 2006/06/13 08:12:04 dillon Exp $ * created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp */ @@ -167,8 +167,8 @@ #define SYS_semsys 169 #define SYS_msgsys 170 #define SYS_shmsys 171 -#define SYS_pread 173 -#define SYS_pwrite 174 +#define SYS___pread 173 +#define SYS___pwrite 174 #define SYS_ntp_adjtime 176 #define SYS_setgid 181 #define SYS_setegid 182 @@ -221,8 +221,8 @@ /* 278 is obsolete { */ /* 279 is obsolete { */ /* 280 is obsolete { */ -#define SYS_preadv 289 -#define SYS_pwritev 290 +#define SYS___preadv 289 +#define SYS___pwritev 290 #define SYS_fhstatfs 297 #define SYS_fhopen 298 /* 299 is old fhstat */ diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index 3591d3ddf4..3661791f03 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,6 +1,6 @@ # DragonFly system call names. # DO NOT EDIT-- this file is automatically generated. -# $DragonFly: src/sys/sys/syscall.mk,v 1.40 2006/06/07 03:02:11 dillon Exp $ +# $DragonFly: src/sys/sys/syscall.mk,v 1.41 2006/06/13 08:12:04 dillon Exp $ # created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp MIASM = \ syscall.o \ @@ -119,8 +119,8 @@ MIASM = \ semsys.o \ msgsys.o \ shmsys.o \ - pread.o \ - pwrite.o \ + __pread.o \ + __pwrite.o \ ntp_adjtime.o \ setgid.o \ setegid.o \ @@ -165,8 +165,8 @@ MIASM = \ netbsd_lchown.o \ lutimes.o \ netbsd_msync.o \ - preadv.o \ - pwritev.o \ + __preadv.o \ + __pwritev.o \ fhstatfs.o \ fhopen.o \ modnext.o \ diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index a3ab39227a..654b47f6e9 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -2,7 +2,7 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/sysproto.h,v 1.40 2006/06/07 03:02:11 dillon Exp $ + * $DragonFly: src/sys/sys/sysproto.h,v 1.41 2006/06/13 08:12:04 dillon Exp $ * created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp */ @@ -891,24 +891,24 @@ struct shmsys_args { int a3; char a3_[PAD_(int)]; int a4; char a4_[PAD_(int)]; }; -struct pread_args { +struct __pread_args { #ifdef _KERNEL struct sysmsg sysmsg; #endif int fd; char fd_[PAD_(int)]; void * buf; char buf_[PAD_(void *)]; size_t nbyte; char nbyte_[PAD_(size_t)]; - int pad; char pad_[PAD_(int)]; + int flags; char flags_[PAD_(int)]; off_t offset; char offset_[PAD_(off_t)]; }; -struct pwrite_args { +struct __pwrite_args { #ifdef _KERNEL struct sysmsg sysmsg; #endif int fd; char fd_[PAD_(int)]; const void * buf; char buf_[PAD_(const void *)]; size_t nbyte; char nbyte_[PAD_(size_t)]; - int pad; char pad_[PAD_(int)]; + int flags; char flags_[PAD_(int)]; off_t offset; char offset_[PAD_(off_t)]; }; struct ntp_adjtime_args { @@ -1219,22 +1219,24 @@ struct lutimes_args { char * path; char path_[PAD_(char *)]; struct timeval * tptr; char tptr_[PAD_(struct timeval *)]; }; -struct preadv_args { +struct __preadv_args { #ifdef _KERNEL struct sysmsg sysmsg; #endif int fd; char fd_[PAD_(int)]; struct iovec * iovp; char iovp_[PAD_(struct iovec *)]; u_int iovcnt; char iovcnt_[PAD_(u_int)]; + int flags; char flags_[PAD_(int)]; off_t offset; char offset_[PAD_(off_t)]; }; -struct pwritev_args { +struct __pwritev_args { #ifdef _KERNEL struct sysmsg sysmsg; #endif int fd; char fd_[PAD_(int)]; struct iovec * iovp; char iovp_[PAD_(struct iovec *)]; u_int iovcnt; char iovcnt_[PAD_(u_int)]; + int flags; char flags_[PAD_(int)]; off_t offset; char offset_[PAD_(off_t)]; }; struct fhstatfs_args { @@ -2374,8 +2376,8 @@ int sys_rtprio (struct rtprio_args *); int sys_semsys (struct semsys_args *); int sys_msgsys (struct msgsys_args *); int sys_shmsys (struct shmsys_args *); -int sys_pread (struct pread_args *); -int sys_pwrite (struct pwrite_args *); +int sys___pread (struct __pread_args *); +int sys___pwrite (struct __pwrite_args *); int sys_ntp_adjtime (struct ntp_adjtime_args *); int sys_setgid (struct setgid_args *); int sys_setegid (struct setegid_args *); @@ -2418,8 +2420,8 @@ int sys_issetugid (struct issetugid_args *); int sys_lchown (struct lchown_args *); int sys_lchmod (struct lchmod_args *); int sys_lutimes (struct lutimes_args *); -int sys_preadv (struct preadv_args *); -int sys_pwritev (struct pwritev_args *); +int sys___preadv (struct __preadv_args *); +int sys___pwritev (struct __pwritev_args *); int sys_fhstatfs (struct fhstatfs_args *); int sys_fhopen (struct fhopen_args *); int sys_modnext (struct modnext_args *); diff --git a/sys/sys/sysunion.h b/sys/sys/sysunion.h index 85c818cee5..b947d371b9 100644 --- a/sys/sys/sysunion.h +++ b/sys/sys/sysunion.h @@ -2,12 +2,13 @@ * Union of syscall args for messaging. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/sysunion.h,v 1.37 2006/06/07 03:02:11 dillon Exp $ + * $DragonFly: src/sys/sys/sysunion.h,v 1.38 2006/06/13 08:12:04 dillon Exp $ * created from DragonFly: src/sys/kern/syscalls.master,v 1.38 2006/06/05 07:26:10 dillon Exp */ union sysunion { #ifdef _KERNEL /* header only applies in kernel */ + struct lwkt_msg lmsg; struct sysmsg sysmsg; #endif #ifdef COMPAT_43 @@ -207,8 +208,8 @@ union sysunion { struct semsys_args semsys; struct msgsys_args msgsys; struct shmsys_args shmsys; - struct pread_args pread; - struct pwrite_args pwrite; + struct __pread_args __pread; + struct __pwrite_args __pwrite; struct ntp_adjtime_args ntp_adjtime; struct setgid_args setgid; struct setegid_args setegid; @@ -265,8 +266,8 @@ union sysunion { #endif struct lchmod_args lchmod; struct lutimes_args lutimes; - struct preadv_args preadv; - struct pwritev_args pwritev; + struct __preadv_args __preadv; + struct __pwritev_args __pwritev; struct fhstatfs_args fhstatfs; struct fhopen_args fhopen; #ifdef COMPAT_DF12 diff --git a/sys/vfs/fifofs/fifo_vnops.c b/sys/vfs/fifofs/fifo_vnops.c index 2c83e1c0ae..3940c66946 100644 --- a/sys/vfs/fifofs/fifo_vnops.c +++ b/sys/vfs/fifofs/fifo_vnops.c @@ -32,7 +32,7 @@ * * @(#)fifo_vnops.c 8.10 (Berkeley) 5/27/95 * $FreeBSD: src/sys/miscfs/fifofs/fifo_vnops.c,v 1.45.2.4 2003/04/22 10:11:24 bde Exp $ - * $DragonFly: src/sys/vfs/fifofs/fifo_vnops.c,v 1.29 2006/05/07 19:17:16 dillon Exp $ + * $DragonFly: src/sys/vfs/fifofs/fifo_vnops.c,v 1.30 2006/06/13 08:12:04 dillon Exp $ */ #include @@ -184,7 +184,7 @@ fifo_open(struct vop_open_args *ap) fip->fi_readsock = rso; error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0, td); if (error) { - soclose(rso); + soclose(rso, FNONBLOCK); free(fip, M_FIFOINFO); vp->v_fifoinfo = NULL; return (error); @@ -192,8 +192,8 @@ fifo_open(struct vop_open_args *ap) fip->fi_writesock = wso; error = unp_connect2(wso, rso); if (error) { - soclose(wso); - soclose(rso); + soclose(wso, FNONBLOCK); + soclose(rso, FNONBLOCK); free(fip, M_FIFOINFO); vp->v_fifoinfo = NULL; return (error); @@ -279,6 +279,7 @@ fifo_read(struct vop_read_args *ap) struct uio *uio = ap->a_uio; struct socket *rso = ap->a_vp->v_fifoinfo->fi_readsock; int error, startresid; + int flags; #ifdef DIAGNOSTIC if (uio->uio_rw != UIO_READ) @@ -287,14 +288,14 @@ fifo_read(struct vop_read_args *ap) if (uio->uio_resid == 0) return (0); if (ap->a_ioflag & IO_NDELAY) - rso->so_state |= SS_NBIO; + flags = MSG_FNONBLOCKING; + else + flags = 0; startresid = uio->uio_resid; VOP_UNLOCK(ap->a_vp, 0); error = soreceive(rso, (struct sockaddr **)0, uio, (struct mbuf **)0, - (struct mbuf **)0, (int *)0); + (struct mbuf **)0, &flags); vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY); - if (ap->a_ioflag & IO_NDELAY) - rso->so_state &= ~SS_NBIO; return (error); } @@ -311,19 +312,20 @@ fifo_write(struct vop_write_args *ap) struct socket *wso = ap->a_vp->v_fifoinfo->fi_writesock; struct thread *td = ap->a_uio->uio_td; int error; + int flags; #ifdef DIAGNOSTIC if (ap->a_uio->uio_rw != UIO_WRITE) panic("fifo_write mode"); #endif if (ap->a_ioflag & IO_NDELAY) - wso->so_state |= SS_NBIO; + flags = MSG_FNONBLOCKING; + else + flags = 0; VOP_UNLOCK(ap->a_vp, 0); error = sosend(wso, (struct sockaddr *)0, ap->a_uio, 0, - (struct mbuf *)0, 0, td); + (struct mbuf *)0, flags, td); vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY); - if (ap->a_ioflag & IO_NDELAY) - wso->so_state &= ~SS_NBIO; return (error); } @@ -340,8 +342,6 @@ fifo_ioctl(struct vop_ioctl_args *ap) struct file filetmp; /* Local */ int error; - if (ap->a_command == FIONBIO) - return (0); if (ap->a_fflag & FREAD) { filetmp.f_data = ap->a_vp->v_fifoinfo->fi_readsock; error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_cred); @@ -543,8 +543,8 @@ fifo_close(struct vop_close_args *ap) vop_stdclose(ap); return (0); } - error1 = soclose(fip->fi_readsock); - error2 = soclose(fip->fi_writesock); + error1 = soclose(fip->fi_readsock, FNONBLOCK); + error2 = soclose(fip->fi_writesock, FNONBLOCK); FREE(fip, M_FIFOINFO); vp->v_fifoinfo = NULL; if (error1) diff --git a/sys/vfs/nfs/bootp_subr.c b/sys/vfs/nfs/bootp_subr.c index 1a9de0511d..237ff30479 100644 --- a/sys/vfs/nfs/bootp_subr.c +++ b/sys/vfs/nfs/bootp_subr.c @@ -38,7 +38,7 @@ * nfs/krpc_subr.c * $NetBSD: krpc_subr.c,v 1.10 1995/08/08 20:43:43 gwr Exp $ * $FreeBSD: src/sys/nfs/bootp_subr.c,v 1.20.2.9 2003/04/24 16:51:08 ambrisko Exp $ - * $DragonFly: src/sys/vfs/nfs/bootp_subr.c,v 1.14 2006/05/06 03:16:44 dillon Exp $ + * $DragonFly: src/sys/vfs/nfs/bootp_subr.c,v 1.15 2006/06/13 08:12:04 dillon Exp $ */ #include "opt_bootp.h" @@ -960,7 +960,7 @@ bootpc_call(struct bootpc_globalcontext *gctx, struct thread *td) gotreply: out: - soclose(so); + soclose(so, FNONBLOCK); return error; } @@ -1630,7 +1630,7 @@ bootpc_init(void) for (ifctx = gctx->interfaces; ifctx != NULL; ifctx = ifctx->next) { bootpc_adjust_interface(ifctx, gctx, td); - soclose(ifctx->so); + soclose(ifctx->so, FNONBLOCK); } for (ifctx = gctx->interfaces; ifctx != NULL; ifctx = ifctx->next) diff --git a/sys/vfs/nfs/krpc_subr.c b/sys/vfs/nfs/krpc_subr.c index 30f08ab470..9e30bbffaf 100644 --- a/sys/vfs/nfs/krpc_subr.c +++ b/sys/vfs/nfs/krpc_subr.c @@ -1,6 +1,6 @@ /* $NetBSD: krpc_subr.c,v 1.12.4.1 1996/06/07 00:52:26 cgd Exp $ */ /* $FreeBSD: src/sys/nfs/krpc_subr.c,v 1.13.2.1 2000/11/20 21:17:14 tegge Exp $ */ -/* $DragonFly: src/sys/vfs/nfs/krpc_subr.c,v 1.7 2005/05/29 10:08:36 hsu Exp $ */ +/* $DragonFly: src/sys/vfs/nfs/krpc_subr.c,v 1.8 2006/06/13 08:12:04 dillon Exp $ */ /* * Copyright (c) 1995 Gordon Ross, Adam Glass @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -435,7 +436,7 @@ krpc_call(struct sockaddr_in *sa, u_int prog, u_int vers, u_int func, out: if (mhead) m_freem(mhead); if (from) free(from, M_SONAME); - soclose(so); + soclose(so, FNONBLOCK); return error; } diff --git a/sys/vfs/nfs/nfs_socket.c b/sys/vfs/nfs/nfs_socket.c index d45f6fd539..34fd73eedf 100644 --- a/sys/vfs/nfs/nfs_socket.c +++ b/sys/vfs/nfs/nfs_socket.c @@ -35,7 +35,7 @@ * * @(#)nfs_socket.c 8.5 (Berkeley) 3/30/95 * $FreeBSD: src/sys/nfs/nfs_socket.c,v 1.60.2.6 2003/03/26 01:44:46 alfred Exp $ - * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.34 2006/04/25 22:11:31 dillon Exp $ + * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.35 2006/06/13 08:12:04 dillon Exp $ */ /* @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -420,7 +421,7 @@ nfs_disconnect(struct nfsmount *nmp) so = nmp->nm_so; nmp->nm_so = (struct socket *)0; soshutdown(so, 2); - soclose(so); + soclose(so, FNONBLOCK); } } diff --git a/sys/vfs/nfs/nfs_vfsops.c b/sys/vfs/nfs/nfs_vfsops.c index ad9abe08b3..545629eae1 100644 --- a/sys/vfs/nfs/nfs_vfsops.c +++ b/sys/vfs/nfs/nfs_vfsops.c @@ -35,7 +35,7 @@ * * @(#)nfs_vfsops.c 8.12 (Berkeley) 5/20/95 * $FreeBSD: src/sys/nfs/nfs_vfsops.c,v 1.91.2.7 2003/01/27 20:04:08 dillon Exp $ - * $DragonFly: src/sys/vfs/nfs/nfs_vfsops.c,v 1.42 2006/05/06 18:48:53 dillon Exp $ + * $DragonFly: src/sys/vfs/nfs/nfs_vfsops.c,v 1.43 2006/06/13 08:12:04 dillon Exp $ */ #include "opt_bootp.h" @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -499,7 +500,7 @@ nfs_mountroot(struct mount *mp) if (error) panic("nfs_mountroot: SIOCAIFADDR: %d", error); - soclose(so); + soclose(so, FNONBLOCK); /* * If the gateway field is filled in, set it as the default route. diff --git a/sys/vfs/portal/portal_vnops.c b/sys/vfs/portal/portal_vnops.c index cba4b4ba2b..e4d03ee244 100644 --- a/sys/vfs/portal/portal_vnops.c +++ b/sys/vfs/portal/portal_vnops.c @@ -36,7 +36,7 @@ * @(#)portal_vnops.c 8.14 (Berkeley) 5/21/95 * * $FreeBSD: src/sys/miscfs/portal/portal_vnops.c,v 1.38 1999/12/21 06:29:00 chris Exp $ - * $DragonFly: src/sys/vfs/portal/portal_vnops.c,v 1.28 2006/06/05 07:26:11 dillon Exp $ + * $DragonFly: src/sys/vfs/portal/portal_vnops.c,v 1.29 2006/06/13 08:12:04 dillon Exp $ */ /* @@ -428,7 +428,7 @@ bad:; if (so) { soshutdown(so, 2); - soclose(so); + soclose(so, FNONBLOCK); } return (error); } -- 2.41.0