ensure bmap run list is initialised
[unix-history] / usr / src / sys / miscfs / fifofs / fifo_vnops.c
index 5325dce..ea8f885 100644 (file)
@@ -1,26 +1,26 @@
 /*
 /*
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)fifo_vnops.c        7.15 (Berkeley) %G%
+ *     @(#)fifo_vnops.c        8.5 (Berkeley) %G%
  */
 
  */
 
-#include "param.h"
-#include "proc.h"
-#include "time.h"
-#include "namei.h"
-#include "vnode.h"
-#include "socket.h"
-#include "socketvar.h"
-#include "stat.h"
-#include "systm.h"
-#include "ioctl.h"
-#include "file.h"
-#include "fifo.h"
-#include "errno.h"
-#include "malloc.h"
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/time.h>
+#include <sys/namei.h>
+#include <sys/vnode.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/stat.h>
+#include <sys/systm.h>
+#include <sys/ioctl.h>
+#include <sys/file.h>
+#include <sys/errno.h>
+#include <sys/malloc.h>
+#include <miscfs/fifofs/fifo.h>
 
 /*
  * This structure is associated with the FIFO vnode and stores
 
 /*
  * This structure is associated with the FIFO vnode and stores
@@ -39,20 +39,21 @@ struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
        { &vop_lookup_desc, fifo_lookup },              /* lookup */
        { &vop_create_desc, fifo_create },              /* create */
        { &vop_mknod_desc, fifo_mknod },                /* mknod */
        { &vop_lookup_desc, fifo_lookup },              /* lookup */
        { &vop_create_desc, fifo_create },              /* create */
        { &vop_mknod_desc, fifo_mknod },                /* mknod */
-       { &vop_open_desc, fifo_open },          /* open */
+       { &vop_open_desc, fifo_open },                  /* open */
        { &vop_close_desc, fifo_close },                /* close */
        { &vop_access_desc, fifo_access },              /* access */
        { &vop_getattr_desc, fifo_getattr },            /* getattr */
        { &vop_setattr_desc, fifo_setattr },            /* setattr */
        { &vop_close_desc, fifo_close },                /* close */
        { &vop_access_desc, fifo_access },              /* access */
        { &vop_getattr_desc, fifo_getattr },            /* getattr */
        { &vop_setattr_desc, fifo_setattr },            /* setattr */
-       { &vop_read_desc, fifo_read },          /* read */
+       { &vop_read_desc, fifo_read },                  /* read */
        { &vop_write_desc, fifo_write },                /* write */
        { &vop_write_desc, fifo_write },                /* write */
+       { &vop_lease_desc, fifo_lease_check },          /* lease */
        { &vop_ioctl_desc, fifo_ioctl },                /* ioctl */
        { &vop_select_desc, fifo_select },              /* select */
        { &vop_ioctl_desc, fifo_ioctl },                /* ioctl */
        { &vop_select_desc, fifo_select },              /* select */
-       { &vop_mmap_desc, fifo_mmap },          /* mmap */
+       { &vop_mmap_desc, fifo_mmap },                  /* mmap */
        { &vop_fsync_desc, fifo_fsync },                /* fsync */
        { &vop_fsync_desc, fifo_fsync },                /* fsync */
-       { &vop_seek_desc, fifo_seek },          /* seek */
+       { &vop_seek_desc, fifo_seek },                  /* seek */
        { &vop_remove_desc, fifo_remove },              /* remove */
        { &vop_remove_desc, fifo_remove },              /* remove */
-       { &vop_link_desc, fifo_link },          /* link */
+       { &vop_link_desc, fifo_link },                  /* link */
        { &vop_rename_desc, fifo_rename },              /* rename */
        { &vop_mkdir_desc, fifo_mkdir },                /* mkdir */
        { &vop_rmdir_desc, fifo_rmdir },                /* rmdir */
        { &vop_rename_desc, fifo_rename },              /* rename */
        { &vop_mkdir_desc, fifo_mkdir },                /* mkdir */
        { &vop_rmdir_desc, fifo_rmdir },                /* rmdir */
@@ -62,15 +63,15 @@ struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
        { &vop_abortop_desc, fifo_abortop },            /* abortop */
        { &vop_inactive_desc, fifo_inactive },          /* inactive */
        { &vop_reclaim_desc, fifo_reclaim },            /* reclaim */
        { &vop_abortop_desc, fifo_abortop },            /* abortop */
        { &vop_inactive_desc, fifo_inactive },          /* inactive */
        { &vop_reclaim_desc, fifo_reclaim },            /* reclaim */
-       { &vop_lock_desc, fifo_lock },          /* lock */
+       { &vop_lock_desc, fifo_lock },                  /* lock */
        { &vop_unlock_desc, fifo_unlock },              /* unlock */
        { &vop_unlock_desc, fifo_unlock },              /* unlock */
-       { &vop_bmap_desc, fifo_bmap },          /* bmap */
+       { &vop_bmap_desc, fifo_bmap },                  /* bmap */
        { &vop_strategy_desc, fifo_strategy },          /* strategy */
        { &vop_print_desc, fifo_print },                /* print */
        { &vop_islocked_desc, fifo_islocked },          /* islocked */
        { &vop_strategy_desc, fifo_strategy },          /* strategy */
        { &vop_print_desc, fifo_print },                /* print */
        { &vop_islocked_desc, fifo_islocked },          /* islocked */
+       { &vop_pathconf_desc, fifo_pathconf },          /* pathconf */
        { &vop_advlock_desc, fifo_advlock },            /* advlock */
        { &vop_blkatoff_desc, fifo_blkatoff },          /* blkatoff */
        { &vop_advlock_desc, fifo_advlock },            /* advlock */
        { &vop_blkatoff_desc, fifo_blkatoff },          /* blkatoff */
-       { &vop_vget_desc, fifo_vget },          /* vget */
        { &vop_valloc_desc, fifo_valloc },              /* valloc */
        { &vop_vfree_desc, fifo_vfree },                /* vfree */
        { &vop_truncate_desc, fifo_truncate },          /* truncate */
        { &vop_valloc_desc, fifo_valloc },              /* valloc */
        { &vop_vfree_desc, fifo_vfree },                /* vfree */
        { &vop_truncate_desc, fifo_truncate },          /* truncate */
@@ -85,8 +86,12 @@ struct vnodeopv_desc fifo_vnodeop_opv_desc =
  * Trivial lookup routine that always fails.
  */
 /* ARGSUSED */
  * Trivial lookup routine that always fails.
  */
 /* ARGSUSED */
-fifo_lookup (ap)
-       struct vop_lookup_args *ap;
+fifo_lookup(ap)
+       struct vop_lookup_args /* {
+               struct vnode * a_dvp;
+               struct vnode ** a_vpp;
+               struct componentname * a_cnp;
+       } */ *ap;
 {
        
        *ap->a_vpp = NULL;
 {
        
        *ap->a_vpp = NULL;
@@ -98,12 +103,14 @@ fifo_lookup (ap)
  * to find an active instance of a fifo.
  */
 /* ARGSUSED */
  * to find an active instance of a fifo.
  */
 /* ARGSUSED */
-fifo_open (ap)
-       struct vop_open_args *ap;
+fifo_open(ap)
+       struct vop_open_args /* {
+               struct vnode *a_vp;
+               int  a_mode;
+               struct ucred *a_cred;
+               struct proc *a_p;
+       } */ *ap;
 {
 {
-       USES_VOP_CLOSE;
-       USES_VOP_LOCK;
-       USES_VOP_UNLOCK;
        register struct vnode *vp = ap->a_vp;
        register struct fifoinfo *fip;
        struct socket *rso, *wso;
        register struct vnode *vp = ap->a_vp;
        register struct fifoinfo *fip;
        struct socket *rso, *wso;
@@ -115,13 +122,13 @@ fifo_open (ap)
        if ((fip = vp->v_fifoinfo) == NULL) {
                MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
                vp->v_fifoinfo = fip;
        if ((fip = vp->v_fifoinfo) == NULL) {
                MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
                vp->v_fifoinfo = fip;
-               if (error = socreate(AF_UNIX, &rso, SOCK_STREAM, 0)) {
+               if (error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0)) {
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
                        return (error);
                }
                fip->fi_readsock = rso;
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
                        return (error);
                }
                fip->fi_readsock = rso;
-               if (error = socreate(AF_UNIX, &wso, SOCK_STREAM, 0)) {
+               if (error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0)) {
                        (void)soclose(rso);
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
                        (void)soclose(rso);
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
@@ -151,8 +158,8 @@ fifo_open (ap)
                        return (0);
                while (fip->fi_writers == 0) {
                        VOP_UNLOCK(vp);
                        return (0);
                while (fip->fi_writers == 0) {
                        VOP_UNLOCK(vp);
-                       error = tsleep((caddr_t)&fip->fi_readers, PSOCK,
-                               openstr, 0);
+                       error = tsleep((caddr_t)&fip->fi_readers,
+                           PCATCH | PSOCK, openstr, 0);
                        VOP_LOCK(vp);
                        if (error)
                                break;
                        VOP_LOCK(vp);
                        if (error)
                                break;
@@ -170,7 +177,7 @@ fifo_open (ap)
                        while (fip->fi_readers == 0) {
                                VOP_UNLOCK(vp);
                                error = tsleep((caddr_t)&fip->fi_writers,
                        while (fip->fi_readers == 0) {
                                VOP_UNLOCK(vp);
                                error = tsleep((caddr_t)&fip->fi_writers,
-                                       PSOCK, openstr, 0);
+                                   PCATCH | PSOCK, openstr, 0);
                                VOP_LOCK(vp);
                                if (error)
                                        break;
                                VOP_LOCK(vp);
                                if (error)
                                        break;
@@ -186,11 +193,14 @@ fifo_open (ap)
  * Vnode op for read
  */
 /* ARGSUSED */
  * Vnode op for read
  */
 /* ARGSUSED */
-fifo_read (ap)
-       struct vop_read_args *ap;
+fifo_read(ap)
+       struct vop_read_args /* {
+               struct vnode *a_vp;
+               struct uio *a_uio;
+               int  a_ioflag;
+               struct ucred *a_cred;
+       } */ *ap;
 {
 {
-       USES_VOP_LOCK;
-       USES_VOP_UNLOCK;
        register struct uio *uio = ap->a_uio;
        register struct socket *rso = ap->a_vp->v_fifoinfo->fi_readsock;
        int error, startresid;
        register struct uio *uio = ap->a_uio;
        register struct socket *rso = ap->a_vp->v_fifoinfo->fi_readsock;
        int error, startresid;
@@ -205,8 +215,8 @@ fifo_read (ap)
                rso->so_state |= SS_NBIO;
        startresid = uio->uio_resid;
        VOP_UNLOCK(ap->a_vp);
                rso->so_state |= SS_NBIO;
        startresid = uio->uio_resid;
        VOP_UNLOCK(ap->a_vp);
-       error = soreceive(rso, (struct mbuf **)0, uio, (int *)0,
-               (struct mbuf **)0, (struct mbuf **)0);
+       error = soreceive(rso, (struct mbuf **)0, uio, (struct mbuf **)0,
+           (struct mbuf **)0, (int *)0);
        VOP_LOCK(ap->a_vp);
        /*
         * Clear EOF indication after first such return.
        VOP_LOCK(ap->a_vp);
        /*
         * Clear EOF indication after first such return.
@@ -222,11 +232,14 @@ fifo_read (ap)
  * Vnode op for write
  */
 /* ARGSUSED */
  * Vnode op for write
  */
 /* ARGSUSED */
-fifo_write (ap)
-       struct vop_write_args *ap;
+fifo_write(ap)
+       struct vop_write_args /* {
+               struct vnode *a_vp;
+               struct uio *a_uio;
+               int  a_ioflag;
+               struct ucred *a_cred;
+       } */ *ap;
 {
 {
-       USES_VOP_LOCK;
-       USES_VOP_UNLOCK;
        struct socket *wso = ap->a_vp->v_fifoinfo->fi_writesock;
        int error;
 
        struct socket *wso = ap->a_vp->v_fifoinfo->fi_writesock;
        int error;
 
@@ -248,11 +261,17 @@ fifo_write (ap)
  * Device ioctl operation.
  */
 /* ARGSUSED */
  * Device ioctl operation.
  */
 /* ARGSUSED */
-fifo_ioctl (ap)
-       struct vop_ioctl_args *ap;
+fifo_ioctl(ap)
+       struct vop_ioctl_args /* {
+               struct vnode *a_vp;
+               int  a_command;
+               caddr_t  a_data;
+               int  a_fflag;
+               struct ucred *a_cred;
+               struct proc *a_p;
+       } */ *ap;
 {
        struct file filetmp;
 {
        struct file filetmp;
-       int error;
 
        if (ap->a_command == FIONBIO)
                return (0);
 
        if (ap->a_command == FIONBIO)
                return (0);
@@ -264,11 +283,16 @@ fifo_ioctl (ap)
 }
 
 /* ARGSUSED */
 }
 
 /* ARGSUSED */
-fifo_select (ap)
-       struct vop_select_args *ap;
+fifo_select(ap)
+       struct vop_select_args /* {
+               struct vnode *a_vp;
+               int  a_which;
+               int  a_fflags;
+               struct ucred *a_cred;
+               struct proc *a_p;
+       } */ *ap;
 {
        struct file filetmp;
 {
        struct file filetmp;
-       int error;
 
        if (ap->a_fflags & FREAD)
                filetmp.f_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_readsock;
 
        if (ap->a_fflags & FREAD)
                filetmp.f_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_readsock;
@@ -280,14 +304,21 @@ fifo_select (ap)
 /*
  * This is a noop, simply returning what one has been given.
  */
 /*
  * This is a noop, simply returning what one has been given.
  */
-fifo_bmap (ap)
-       struct vop_bmap_args *ap;
+fifo_bmap(ap)
+       struct vop_bmap_args /* {
+               struct vnode *a_vp;
+               daddr_t  a_bn;
+               struct vnode **a_vpp;
+               daddr_t *a_bnp;
+       } */ *ap;
 {
 
        if (ap->a_vpp != NULL)
                *ap->a_vpp = ap->a_vp;
        if (ap->a_bnp != NULL)
                *ap->a_bnp = ap->a_bn;
 {
 
        if (ap->a_vpp != NULL)
                *ap->a_vpp = ap->a_vp;
        if (ap->a_bnp != NULL)
                *ap->a_bnp = ap->a_bn;
+       if (ap->a_runp != NULL)
+               *ap->a_runp = 0;
        return (0);
 }
 
        return (0);
 }
 
@@ -295,16 +326,20 @@ fifo_bmap (ap)
  * At the moment we do not do any locking.
  */
 /* ARGSUSED */
  * At the moment we do not do any locking.
  */
 /* ARGSUSED */
-fifo_lock (ap)
-       struct vop_lock_args *ap;
+fifo_lock(ap)
+       struct vop_lock_args /* {
+               struct vnode *a_vp;
+       } */ *ap;
 {
 
        return (0);
 }
 
 /* ARGSUSED */
 {
 
        return (0);
 }
 
 /* ARGSUSED */
-fifo_unlock (ap)
-       struct vop_unlock_args *ap;
+fifo_unlock(ap)
+       struct vop_unlock_args /* {
+               struct vnode *a_vp;
+       } */ *ap;
 {
 
        return (0);
 {
 
        return (0);
@@ -314,8 +349,13 @@ fifo_unlock (ap)
  * Device close routine
  */
 /* ARGSUSED */
  * Device close routine
  */
 /* ARGSUSED */
-fifo_close (ap)
-       struct vop_close_args *ap;
+fifo_close(ap)
+       struct vop_close_args /* {
+               struct vnode *a_vp;
+               int  a_fflag;
+               struct ucred *a_cred;
+               struct proc *a_p;
+       } */ *ap;
 {
        register struct vnode *vp = ap->a_vp;
        register struct fifoinfo *fip = vp->v_fifoinfo;
 {
        register struct vnode *vp = ap->a_vp;
        register struct fifoinfo *fip = vp->v_fifoinfo;
@@ -344,8 +384,10 @@ fifo_close (ap)
 /*
  * Print out the contents of a fifo vnode.
  */
 /*
  * Print out the contents of a fifo vnode.
  */
-fifo_print (ap)
-       struct vop_print_args *ap;
+fifo_print(ap)
+       struct vop_print_args /* {
+               struct vnode *a_vp;
+       } */ *ap;
 {
 
        printf("tag VT_NON");
 {
 
        printf("tag VT_NON");
@@ -365,6 +407,33 @@ fifo_printinfo(vp)
                fip->fi_readers, fip->fi_writers);
 }
 
                fip->fi_readers, fip->fi_writers);
 }
 
+/*
+ * Return POSIX pathconf information applicable to fifo's.
+ */
+fifo_pathconf(ap)
+       struct vop_pathconf_args /* {
+               struct vnode *a_vp;
+               int a_name;
+               int *a_retval;
+       } */ *ap;
+{
+
+       switch (ap->a_name) {
+       case _PC_LINK_MAX:
+               *ap->a_retval = LINK_MAX;
+               return (0);
+       case _PC_PIPE_BUF:
+               *ap->a_retval = PIPE_BUF;
+               return (0);
+       case _PC_CHOWN_RESTRICTED:
+               *ap->a_retval = 1;
+               return (0);
+       default:
+               return (EINVAL);
+       }
+       /* NOTREACHED */
+}
+
 /*
  * Fifo failed operation
  */
 /*
  * Fifo failed operation
  */
@@ -378,8 +447,14 @@ fifo_ebadf()
  * Fifo advisory byte-level locks.
  */
 /* ARGSUSED */
  * Fifo advisory byte-level locks.
  */
 /* ARGSUSED */
-fifo_advlock (ap)
-       struct vop_advlock_args *ap;
+fifo_advlock(ap)
+       struct vop_advlock_args /* {
+               struct vnode *a_vp;
+               caddr_t  a_id;
+               int  a_op;
+               struct flock *a_fl;
+               int  a_flags;
+       } */ *ap;
 {
 
        return (EOPNOTSUPP);
 {
 
        return (EOPNOTSUPP);