- * @(#)lfs_vnops.c 7.5 (Berkeley) %G%
- */
-
-#include "param.h"
-#include "systm.h"
-#include "dir.h"
-#include "user.h"
-#include "kernel.h"
-#include "file.h"
-#include "stat.h"
-#include "inode.h"
-#include "fs.h"
-#include "buf.h"
-#include "proc.h"
-#include "quota.h"
-#include "uio.h"
-#include "socket.h"
-#include "socketvar.h"
-#include "mount.h"
-
-extern struct fileops inodeops;
-struct file *getinode();
-
-/*
- * Change current working directory (``.'').
- */
-chdir()
-{
-
- chdirec(&u.u_cdir);
-}
-
-/*
- * Change notion of root (``/'') directory.
- */
-chroot()
-{
-
- if (suser())
- chdirec(&u.u_rdir);
-}
-
-/*
- * Common routine for chroot and chdir.
- */
-chdirec(ipp)
- register struct inode **ipp;
-{
- register struct inode *ip;
- struct a {
- char *fname;
- } *uap = (struct a *)u.u_ap;
- register struct nameidata *ndp = &u.u_nd;
-
- ndp->ni_nameiop = LOOKUP | FOLLOW;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->fname;
- ip = namei(ndp);
- if (ip == NULL)
- return;
- if ((ip->i_mode&IFMT) != IFDIR) {
- u.u_error = ENOTDIR;
- goto bad;
- }
- if (access(ip, IEXEC))
- goto bad;
- IUNLOCK(ip);
- if (*ipp)
- irele(*ipp);
- *ipp = ip;
- return;
-
-bad:
- iput(ip);
-}
-
-/*
- * Open system call.
- */
-open()
-{
- struct a {
- char *fname;
- int mode;
- int crtmode;
- } *uap = (struct a *) u.u_ap;
-
- copen(uap->mode-FOPEN, uap->crtmode, uap->fname);
-}
-
-/*
- * Creat system call.
- */
-creat()
-{
- struct a {
- char *fname;
- int fmode;
- } *uap = (struct a *)u.u_ap;
-
- copen(FWRITE|FCREAT|FTRUNC, uap->fmode, uap->fname);
-}
-
-/*
- * Common code for open and creat.
- * Check permissions, allocate an open file structure,
- * and call the device open routine if any.
- */
-copen(mode, arg, fname)
- register int mode;
- int arg;
- caddr_t fname;
-{
- register struct inode *ip;
- register struct file *fp;
- register struct nameidata *ndp = &u.u_nd;
- int indx;
-
- fp = falloc();
- if (fp == NULL)
- return;
- indx = u.u_r.r_val1;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = fname;
- if (mode&FCREAT) {
- if (mode & FEXCL)
- ndp->ni_nameiop = CREATE;
- else
- ndp->ni_nameiop = CREATE | FOLLOW;
- ip = namei(ndp);
- if (ip == NULL) {
- if (u.u_error)
- goto bad1;
- ip = maknode(arg&07777&(~ISVTX), ndp);
- if (ip == NULL)
- goto bad1;
- mode &= ~FTRUNC;
- } else {
- if (mode&FEXCL) {
- u.u_error = EEXIST;
- goto bad;
- }
- mode &= ~FCREAT;
- }
- } else {
- ndp->ni_nameiop = LOOKUP | FOLLOW;
- ip = namei(ndp);
- if (ip == NULL)
- goto bad1;
- }
- if ((ip->i_mode & IFMT) == IFSOCK) {
- u.u_error = EOPNOTSUPP;
- goto bad;
- }
- if ((mode&FCREAT) == 0) {
- if (mode&FREAD)
- if (access(ip, IREAD))
- goto bad;
- if (mode&(FWRITE|FTRUNC)) {
- if (access(ip, IWRITE))
- goto bad;
- if ((ip->i_mode&IFMT) == IFDIR) {
- u.u_error = EISDIR;
- goto bad;
- }
- }
- }
- if (mode&FTRUNC)
- itrunc(ip, (u_long)0);
- IUNLOCK(ip);
- fp->f_flag = mode&FMASK;
- fp->f_type = DTYPE_INODE;
- fp->f_ops = &inodeops;
- fp->f_data = (caddr_t)ip;
- if (setjmp(&u.u_qsave)) {
- if (u.u_error == 0)
- u.u_error = EINTR;
- u.u_ofile[indx] = NULL;
- closef(fp);
- return;
- }
- u.u_error = openi(ip, mode);
- if (u.u_error == 0)
- return;
- ILOCK(ip);
-bad:
- iput(ip);
-bad1:
- u.u_ofile[indx] = NULL;
- fp->f_count--;
-}
-
-/*
- * Mknod system call
- */
-mknod()
-{
- register struct inode *ip;
- register struct a {
- char *fname;
- int fmode;
- int dev;
- } *uap = (struct a *)u.u_ap;
- register struct nameidata *ndp = &u.u_nd;
-
- if (!suser())
- return;
- ndp->ni_nameiop = CREATE;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->fname;
- ip = namei(ndp);
- if (ip != NULL) {
- u.u_error = EEXIST;
- goto out;
- }
- if (u.u_error)
- return;
- ip = maknode(uap->fmode, ndp);
- if (ip == NULL)
- return;
- switch (ip->i_mode & IFMT) {
-
- case IFMT: /* used by badsect to flag bad sectors */
- case IFCHR:
- case IFBLK:
- if (uap->dev) {
- /*
- * Want to be able to use this to make badblock
- * inodes, so don't truncate the dev number.
- */
- ip->i_rdev = uap->dev;
- ip->i_flag |= IACC|IUPD|ICHG;
- }
- }
-
-out:
- iput(ip);
-}
-
-/*
- * link system call
- */
-link()
-{
- register struct inode *ip, *xp;
- register struct a {
- char *target;
- char *linkname;
- } *uap = (struct a *)u.u_ap;
- register struct nameidata *ndp = &u.u_nd;
-
- ndp->ni_nameiop = LOOKUP | FOLLOW;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->target;
- ip = namei(ndp); /* well, this routine is doomed anyhow */
- if (ip == NULL)
- return;
- if ((ip->i_mode&IFMT) == IFDIR && !suser()) {
- iput(ip);
- return;
- }
- if (ip->i_nlink == LINK_MAX - 1) {
- u.u_error = EMLINK;
- iput(ip);
- return;
- }
- ip->i_nlink++;
- ip->i_flag |= ICHG;
- iupdat(ip, &time, &time, 1);
- IUNLOCK(ip);
- ndp->ni_nameiop = CREATE;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = (caddr_t)uap->linkname;
- xp = namei(ndp);
- if (xp != NULL) {
- u.u_error = EEXIST;
- iput(xp);
- goto out;
- }
- if (u.u_error)
- goto out;
- if (ndp->ni_pdir->i_dev != ip->i_dev) {
- iput(ndp->ni_pdir);
- u.u_error = EXDEV;
- goto out;
- }
- u.u_error = direnter(ip, ndp);
-out:
- if (u.u_error) {
- ip->i_nlink--;
- ip->i_flag |= ICHG;
- }
- irele(ip);
-}
-
-/*
- * symlink -- make a symbolic link
- */
-symlink()
-{
- register struct a {
- char *target;
- char *linkname;
- } *uap = (struct a *)u.u_ap;
- register struct inode *ip;
- register char *tp;
- register c, nc;
- register struct nameidata *ndp = &u.u_nd;
-
- tp = uap->target;
- nc = 0;
- while (c = fubyte(tp)) {
- if (c < 0) {
- u.u_error = EFAULT;
- return;
- }
- tp++;
- nc++;
- }
- ndp->ni_nameiop = CREATE;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->linkname;
- ip = namei(ndp);
- if (ip) {
- iput(ip);
- u.u_error = EEXIST;
- return;
- }
- if (u.u_error)
- return;
- ip = maknode(IFLNK | 0777, ndp);
- if (ip == NULL)
- return;
- u.u_error = rdwri(UIO_WRITE, ip, uap->target, nc, (off_t)0, 0,
- (int *)0);
- /* handle u.u_error != 0 */
- iput(ip);
-}
-
-/*
- * Unlink system call.
- * Hard to avoid races here, especially
- * in unlinking directories.
- */
-unlink()
-{
- struct a {
- char *fname;
- } *uap = (struct a *)u.u_ap;
- register struct inode *ip, *dp;
- register struct nameidata *ndp = &u.u_nd;
-
- ndp->ni_nameiop = DELETE | LOCKPARENT;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->fname;
- ip = namei(ndp);
- if (ip == NULL)
- return;
- dp = ndp->ni_pdir;
- if ((ip->i_mode&IFMT) == IFDIR && !suser())
- goto out;
- /*
- * Don't unlink a mounted file.
- */
- if (ip->i_dev != dp->i_dev) {
- u.u_error = EBUSY;
- goto out;
- }
- if (ip->i_flag&ITEXT)
- xrele(ip); /* try once to free text */
- if (dirremove(ndp)) {
- ip->i_nlink--;
- ip->i_flag |= ICHG;
- }
-out:
- if (dp == ip)
- irele(ip);
- else
- iput(ip);
- iput(dp);
-}
-
-/*
- * Seek system call
- */
-lseek()
-{
- register struct file *fp;
- register struct a {
- int fd;
- off_t off;
- int sbase;
- } *uap = (struct a *)u.u_ap;
-
- GETF(fp, uap->fd);
- if (fp->f_type != DTYPE_INODE) {
- u.u_error = ESPIPE;
- return;
- }
- switch (uap->sbase) {
-
- case L_INCR:
- fp->f_offset += uap->off;
- break;
-
- case L_XTND:
- fp->f_offset = uap->off + ((struct inode *)fp->f_data)->i_size;
- break;
-
- case L_SET:
- fp->f_offset = uap->off;
- break;
-
- default:
- u.u_error = EINVAL;
- return;
- }
- u.u_r.r_off = fp->f_offset;
-}
-
-/*
- * Access system call
- */
-saccess()
-{
- register svuid, svgid;
- register struct inode *ip;
- register struct a {
- char *fname;
- int fmode;
- } *uap = (struct a *)u.u_ap;
- register struct nameidata *ndp = &u.u_nd;
-
- svuid = u.u_uid;
- svgid = u.u_gid;
- u.u_uid = u.u_ruid;
- u.u_gid = u.u_rgid;
- ndp->ni_nameiop = LOOKUP | FOLLOW;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->fname;
- ip = namei(ndp);
- if (ip != NULL) {
- if ((uap->fmode&R_OK) && access(ip, IREAD))
- goto done;
- if ((uap->fmode&W_OK) && access(ip, IWRITE))
- goto done;
- if ((uap->fmode&X_OK) && access(ip, IEXEC))
- goto done;
-done:
- iput(ip);
- }
- u.u_uid = svuid;
- u.u_gid = svgid;
-}
-
-/*
- * Stat system call. This version follows links.
- */
-stat()
-{
-
- stat1(FOLLOW);
-}
-
-/*
- * Lstat system call. This version does not follow links.
- */
-lstat()
-{
-
- stat1(NOFOLLOW);
-}
-
-stat1(follow)
- int follow;
-{
- register struct inode *ip;
- register struct a {
- char *fname;
- struct stat *ub;
- } *uap = (struct a *)u.u_ap;
- struct stat sb;
- register struct nameidata *ndp = &u.u_nd;
-
- ndp->ni_nameiop = LOOKUP | follow;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->fname;
- ip = namei(ndp);
- if (ip == NULL)
- return;
- (void) ino_stat(ip, &sb);
- iput(ip);
- u.u_error = copyout((caddr_t)&sb, (caddr_t)uap->ub, sizeof (sb));
-}
-
-/*
- * Return target name of a symbolic link
- */
-readlink()
-{
- register struct inode *ip;
- register struct a {
- char *name;
- char *buf;
- int count;
- } *uap = (struct a *)u.u_ap;
- register struct nameidata *ndp = &u.u_nd;
- int resid;
-
- ndp->ni_nameiop = LOOKUP;
- ndp->ni_segflg = UIO_USERSPACE;
- ndp->ni_dirp = uap->name;
- ip = namei(ndp);
- if (ip == NULL)
- return;
- if ((ip->i_mode&IFMT) != IFLNK) {
- u.u_error = EINVAL;
- goto out;
- }
- u.u_error = rdwri(UIO_READ, ip, uap->buf, uap->count, (off_t)0, 0,
- &resid);
-out:
- iput(ip);
- u.u_r.r_val1 = uap->count - resid;
-}
-
-/*
- * Change mode of a file given path name.
- */
-chmod()
-{
- struct inode *ip;
- struct a {
- char *fname;
- int fmode;
- } *uap = (struct a *)u.u_ap;
-
- if ((ip = owner(uap->fname, FOLLOW)) == NULL)
- return;
- u.u_error = chmod1(ip, uap->fmode);
- iput(ip);
-}
-
-/*
- * Change mode of a file given a file descriptor.
- */
-fchmod()
-{
- struct a {
- int fd;
- int fmode;
- } *uap = (struct a *)u.u_ap;
- register struct inode *ip;
- register struct file *fp;
-
- fp = getinode(uap->fd);
- if (fp == NULL)
- return;
- ip = (struct inode *)fp->f_data;
- if (u.u_uid != ip->i_uid && !suser())
- return;
- ILOCK(ip);
- u.u_error = chmod1(ip, uap->fmode);
- IUNLOCK(ip);
-}
-
-/*
- * Change the mode on a file.
- * Inode must be locked before calling.
- */
-chmod1(ip, mode)
- register struct inode *ip;
- register int mode;
-{
+ * %sccs.include.redist.c%
+ *
+ * @(#)lfs_vnops.c 8.2 (Berkeley) %G%
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/resourcevar.h>
+#include <sys/kernel.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/buf.h>
+#include <sys/proc.h>
+#include <sys/conf.h>
+#include <sys/mount.h>
+#include <sys/vnode.h>
+#include <sys/malloc.h>
+
+#include <vm/vm.h>
+
+#include <miscfs/specfs/specdev.h>
+#include <miscfs/fifofs/fifo.h>
+
+#include <ufs/ufs/quota.h>
+#include <ufs/ufs/inode.h>
+#include <ufs/ufs/dir.h>
+#include <ufs/ufs/ufsmount.h>
+#include <ufs/ufs/ufs_extern.h>
+
+#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_extern.h>
+
+/* Global vfs data structures for lfs. */
+int (**lfs_vnodeop_p)();
+struct vnodeopv_entry_desc lfs_vnodeop_entries[] = {
+ { &vop_default_desc, vn_default_error },
+ { &vop_lookup_desc, ufs_lookup }, /* lookup */
+ { &vop_create_desc, ufs_create }, /* create */
+ { &vop_mknod_desc, ufs_mknod }, /* mknod */
+ { &vop_open_desc, ufs_open }, /* open */
+ { &vop_close_desc, lfs_close }, /* close */
+ { &vop_access_desc, ufs_access }, /* access */
+ { &vop_getattr_desc, lfs_getattr }, /* getattr */
+ { &vop_setattr_desc, ufs_setattr }, /* setattr */
+ { &vop_read_desc, lfs_read }, /* read */
+ { &vop_write_desc, lfs_write }, /* write */
+ { &vop_ioctl_desc, ufs_ioctl }, /* ioctl */
+ { &vop_select_desc, ufs_select }, /* select */
+ { &vop_mmap_desc, ufs_mmap }, /* mmap */
+ { &vop_fsync_desc, lfs_fsync }, /* fsync */
+ { &vop_seek_desc, ufs_seek }, /* seek */
+ { &vop_remove_desc, ufs_remove }, /* remove */
+ { &vop_link_desc, ufs_link }, /* link */
+ { &vop_rename_desc, ufs_rename }, /* rename */
+ { &vop_mkdir_desc, ufs_mkdir }, /* mkdir */
+ { &vop_rmdir_desc, ufs_rmdir }, /* rmdir */
+ { &vop_symlink_desc, ufs_symlink }, /* symlink */
+ { &vop_readdir_desc, ufs_readdir }, /* readdir */
+ { &vop_readlink_desc, ufs_readlink }, /* readlink */
+ { &vop_abortop_desc, ufs_abortop }, /* abortop */
+ { &vop_inactive_desc, ufs_inactive }, /* inactive */
+ { &vop_reclaim_desc, ufs_reclaim }, /* reclaim */
+ { &vop_lock_desc, ufs_lock }, /* lock */
+ { &vop_unlock_desc, ufs_unlock }, /* unlock */
+ { &vop_bmap_desc, ufs_bmap }, /* bmap */
+ { &vop_strategy_desc, ufs_strategy }, /* strategy */
+ { &vop_print_desc, ufs_print }, /* print */
+ { &vop_islocked_desc, ufs_islocked }, /* islocked */
+ { &vop_pathconf_desc, ufs_pathconf }, /* pathconf */
+ { &vop_advlock_desc, ufs_advlock }, /* advlock */
+ { &vop_blkatoff_desc, lfs_blkatoff }, /* blkatoff */
+ { &vop_valloc_desc, lfs_valloc }, /* valloc */
+ { &vop_vfree_desc, lfs_vfree }, /* vfree */
+ { &vop_truncate_desc, lfs_truncate }, /* truncate */
+ { &vop_update_desc, lfs_update }, /* update */
+ { &vop_bwrite_desc, lfs_bwrite }, /* bwrite */
+ { (struct vnodeop_desc*)NULL, (int(*)())NULL }
+};
+struct vnodeopv_desc lfs_vnodeop_opv_desc =
+ { &lfs_vnodeop_p, lfs_vnodeop_entries };
+
+int (**lfs_specop_p)();
+struct vnodeopv_entry_desc lfs_specop_entries[] = {
+ { &vop_default_desc, vn_default_error },
+ { &vop_lookup_desc, spec_lookup }, /* lookup */
+ { &vop_create_desc, spec_create }, /* create */
+ { &vop_mknod_desc, spec_mknod }, /* mknod */
+ { &vop_open_desc, spec_open }, /* open */
+ { &vop_close_desc, ufsspec_close }, /* close */
+ { &vop_access_desc, ufs_access }, /* access */
+ { &vop_getattr_desc, lfs_getattr }, /* getattr */
+ { &vop_setattr_desc, ufs_setattr }, /* setattr */
+ { &vop_read_desc, ufsspec_read }, /* read */
+ { &vop_write_desc, ufsspec_write }, /* write */
+ { &vop_ioctl_desc, spec_ioctl }, /* ioctl */
+ { &vop_select_desc, spec_select }, /* select */
+ { &vop_mmap_desc, spec_mmap }, /* mmap */
+ { &vop_fsync_desc, spec_fsync }, /* fsync */
+ { &vop_seek_desc, spec_seek }, /* seek */
+ { &vop_remove_desc, spec_remove }, /* remove */
+ { &vop_link_desc, spec_link }, /* link */
+ { &vop_rename_desc, spec_rename }, /* rename */
+ { &vop_mkdir_desc, spec_mkdir }, /* mkdir */
+ { &vop_rmdir_desc, spec_rmdir }, /* rmdir */
+ { &vop_symlink_desc, spec_symlink }, /* symlink */
+ { &vop_readdir_desc, spec_readdir }, /* readdir */
+ { &vop_readlink_desc, spec_readlink }, /* readlink */
+ { &vop_abortop_desc, spec_abortop }, /* abortop */
+ { &vop_inactive_desc, ufs_inactive }, /* inactive */
+ { &vop_reclaim_desc, ufs_reclaim }, /* reclaim */
+ { &vop_lock_desc, ufs_lock }, /* lock */
+ { &vop_unlock_desc, ufs_unlock }, /* unlock */
+ { &vop_bmap_desc, spec_bmap }, /* bmap */
+ { &vop_strategy_desc, spec_strategy }, /* strategy */
+ { &vop_print_desc, ufs_print }, /* print */
+ { &vop_islocked_desc, ufs_islocked }, /* islocked */
+ { &vop_pathconf_desc, spec_pathconf }, /* pathconf */
+ { &vop_advlock_desc, spec_advlock }, /* advlock */
+ { &vop_blkatoff_desc, spec_blkatoff }, /* blkatoff */
+ { &vop_valloc_desc, spec_valloc }, /* valloc */
+ { &vop_vfree_desc, lfs_vfree }, /* vfree */
+ { &vop_truncate_desc, spec_truncate }, /* truncate */
+ { &vop_update_desc, lfs_update }, /* update */
+ { &vop_bwrite_desc, lfs_bwrite }, /* bwrite */
+ { (struct vnodeop_desc*)NULL, (int(*)())NULL }
+};
+struct vnodeopv_desc lfs_specop_opv_desc =
+ { &lfs_specop_p, lfs_specop_entries };
+
+#ifdef FIFO
+int (**lfs_fifoop_p)();
+struct vnodeopv_entry_desc lfs_fifoop_entries[] = {
+ { &vop_default_desc, vn_default_error },
+ { &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_close_desc, ufsfifo_close }, /* close */
+ { &vop_access_desc, ufs_access }, /* access */
+ { &vop_getattr_desc, lfs_getattr }, /* getattr */
+ { &vop_setattr_desc, ufs_setattr }, /* setattr */
+ { &vop_read_desc, ufsfifo_read }, /* read */
+ { &vop_write_desc, ufsfifo_write }, /* write */
+ { &vop_ioctl_desc, fifo_ioctl }, /* ioctl */
+ { &vop_select_desc, fifo_select }, /* select */
+ { &vop_mmap_desc, fifo_mmap }, /* mmap */
+ { &vop_fsync_desc, fifo_fsync }, /* fsync */
+ { &vop_seek_desc, fifo_seek }, /* seek */
+ { &vop_remove_desc, fifo_remove }, /* remove */
+ { &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_symlink_desc, fifo_symlink }, /* symlink */
+ { &vop_readdir_desc, fifo_readdir }, /* readdir */
+ { &vop_readlink_desc, fifo_readlink }, /* readlink */
+ { &vop_abortop_desc, fifo_abortop }, /* abortop */
+ { &vop_inactive_desc, ufs_inactive }, /* inactive */
+ { &vop_reclaim_desc, ufs_reclaim }, /* reclaim */
+ { &vop_lock_desc, ufs_lock }, /* lock */
+ { &vop_unlock_desc, ufs_unlock }, /* unlock */
+ { &vop_bmap_desc, fifo_bmap }, /* bmap */
+ { &vop_strategy_desc, fifo_strategy }, /* strategy */
+ { &vop_print_desc, ufs_print }, /* print */
+ { &vop_islocked_desc, ufs_islocked }, /* islocked */
+ { &vop_pathconf_desc, fifo_pathconf }, /* pathconf */
+ { &vop_advlock_desc, fifo_advlock }, /* advlock */
+ { &vop_blkatoff_desc, fifo_blkatoff }, /* blkatoff */
+ { &vop_valloc_desc, fifo_valloc }, /* valloc */
+ { &vop_vfree_desc, lfs_vfree }, /* vfree */
+ { &vop_truncate_desc, fifo_truncate }, /* truncate */
+ { &vop_update_desc, lfs_update }, /* update */
+ { &vop_bwrite_desc, lfs_bwrite }, /* bwrite */
+ { (struct vnodeop_desc*)NULL, (int(*)())NULL }
+};
+struct vnodeopv_desc lfs_fifoop_opv_desc =
+ { &lfs_fifoop_p, lfs_fifoop_entries };
+#endif /* FIFO */