+/*
+ * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * @(#)ffs_vnops.c 7.39 (Berkeley) %G%
+ */
+
+#include "param.h"
+#include "systm.h"
+#include "user.h"
+#include "kernel.h"
+#include "file.h"
+#include "stat.h"
+#include "buf.h"
+#include "proc.h"
+#include "socket.h"
+#include "socketvar.h"
+#include "conf.h"
+#include "mount.h"
+#include "vnode.h"
+#include "specdev.h"
+#include "../ufs/quota.h"
+#include "../ufs/inode.h"
+#include "../ufs/fs.h"
+
+/*
+ * Global vfs data structures for ufs
+ */
+
+int ufs_lookup(),
+ ufs_create(),
+ ufs_mknod(),
+ ufs_open(),
+ ufs_close(),
+ ufs_access(),
+ ufs_getattr(),
+ ufs_setattr(),
+ ufs_read(),
+ ufs_write(),
+ ufs_ioctl(),
+ ufs_select(),
+ ufs_mmap(),
+ ufs_fsync(),
+ ufs_seek(),
+ ufs_remove(),
+ ufs_link(),
+ ufs_rename(),
+ ufs_mkdir(),
+ ufs_rmdir(),
+ ufs_symlink(),
+ ufs_readdir(),
+ ufs_readlink(),
+ ufs_abortop(),
+ ufs_inactive(),
+ ufs_reclaim(),
+ ufs_lock(),
+ ufs_unlock(),
+ ufs_bmap(),
+ ufs_strategy(),
+ ufs_print(),
+ ufs_islocked();
+
+struct vnodeops ufs_vnodeops = {
+ ufs_lookup, /* lookup */
+ ufs_create, /* create */
+ ufs_mknod, /* mknod */
+ ufs_open, /* open */
+ ufs_close, /* close */
+ ufs_access, /* access */
+ ufs_getattr, /* getattr */
+ ufs_setattr, /* setattr */
+ ufs_read, /* read */
+ ufs_write, /* write */
+ ufs_ioctl, /* ioctl */
+ ufs_select, /* select */
+ ufs_mmap, /* mmap */
+ ufs_fsync, /* fsync */
+ ufs_seek, /* seek */
+ ufs_remove, /* remove */
+ ufs_link, /* link */
+ ufs_rename, /* rename */
+ ufs_mkdir, /* mkdir */
+ ufs_rmdir, /* rmdir */
+ ufs_symlink, /* symlink */
+ ufs_readdir, /* readdir */
+ ufs_readlink, /* readlink */
+ ufs_abortop, /* abortop */
+ ufs_inactive, /* inactive */
+ ufs_reclaim, /* reclaim */
+ ufs_lock, /* lock */
+ ufs_unlock, /* unlock */
+ ufs_bmap, /* bmap */
+ ufs_strategy, /* strategy */
+ ufs_print, /* print */
+ ufs_islocked, /* islocked */
+};
+
+int spec_lookup(),
+ spec_open(),
+ ufsspec_read(),
+ ufsspec_write(),
+ spec_strategy(),
+ spec_bmap(),
+ spec_ioctl(),
+ spec_select(),
+ ufsspec_close(),
+ spec_badop(),
+ spec_nullop();
+
+struct vnodeops spec_inodeops = {
+ spec_lookup, /* lookup */
+ spec_badop, /* create */
+ spec_badop, /* mknod */
+ spec_open, /* open */
+ ufsspec_close, /* close */
+ ufs_access, /* access */
+ ufs_getattr, /* getattr */
+ ufs_setattr, /* setattr */
+ ufsspec_read, /* read */
+ ufsspec_write, /* write */
+ spec_ioctl, /* ioctl */
+ spec_select, /* select */
+ spec_badop, /* mmap */
+ spec_nullop, /* fsync */
+ spec_badop, /* seek */
+ spec_badop, /* remove */
+ spec_badop, /* link */
+ spec_badop, /* rename */
+ spec_badop, /* mkdir */
+ spec_badop, /* rmdir */
+ spec_badop, /* symlink */
+ spec_badop, /* readdir */
+ spec_badop, /* readlink */
+ spec_badop, /* abortop */
+ ufs_inactive, /* inactive */
+ ufs_reclaim, /* reclaim */
+ ufs_lock, /* lock */
+ ufs_unlock, /* unlock */
+ spec_bmap, /* bmap */
+ spec_strategy, /* strategy */
+ ufs_print, /* print */
+ ufs_islocked, /* islocked */
+};
+
+#ifdef FIFO
+int fifo_lookup(),
+ fifo_open(),
+ ufsfifo_read(),
+ ufsfifo_write(),
+ fifo_bmap(),
+ fifo_ioctl(),
+ fifo_select(),
+ ufsfifo_close(),
+ fifo_print(),
+ fifo_badop(),
+ fifo_nullop();
+
+struct vnodeops fifo_inodeops = {
+ fifo_lookup, /* lookup */
+ fifo_badop, /* create */
+ fifo_badop, /* mknod */
+ fifo_open, /* open */
+ ufsfifo_close, /* close */
+ ufs_access, /* access */
+ ufs_getattr, /* getattr */
+ ufs_setattr, /* setattr */
+ ufsfifo_read, /* read */
+ ufsfifo_write, /* write */
+ fifo_ioctl, /* ioctl */
+ fifo_select, /* select */
+ fifo_badop, /* mmap */
+ fifo_nullop, /* fsync */
+ fifo_badop, /* seek */
+ fifo_badop, /* remove */
+ fifo_badop, /* link */
+ fifo_badop, /* rename */
+ fifo_badop, /* mkdir */
+ fifo_badop, /* rmdir */
+ fifo_badop, /* symlink */
+ fifo_badop, /* readdir */
+ fifo_badop, /* readlink */
+ fifo_badop, /* abortop */
+ ufs_inactive, /* inactive */
+ ufs_reclaim, /* reclaim */
+ ufs_lock, /* lock */
+ ufs_unlock, /* unlock */
+ fifo_bmap, /* bmap */
+ fifo_badop, /* strategy */
+ ufs_print, /* print */
+ ufs_islocked, /* islocked */
+};
+#endif /* FIFO */
+
+enum vtype iftovt_tab[16] = {
+ VNON, VFIFO, VCHR, VNON, VDIR, VNON, VBLK, VNON,
+ VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VBAD,
+};
+int vttoif_tab[9] = {
+ 0, IFREG, IFDIR, IFBLK, IFCHR, IFLNK, IFSOCK, IFIFO, IFMT,
+};
+
+/*
+ * Create a regular file
+ */
+ufs_create(ndp, vap)
+ struct nameidata *ndp;
+ struct vattr *vap;
+{
+ struct inode *ip;
+ int error;
+
+ if (error = maknode(MAKEIMODE(vap->va_type, vap->va_mode), ndp, &ip))
+ return (error);
+ ndp->ni_vp = ITOV(ip);
+ return (0);