summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/fs/deadfs/dead_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/fs/deadfs/dead_vnops.c')
-rw-r--r--freebsd/sys/fs/deadfs/dead_vnops.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/freebsd/sys/fs/deadfs/dead_vnops.c b/freebsd/sys/fs/deadfs/dead_vnops.c
new file mode 100644
index 00000000..a3153aed
--- /dev/null
+++ b/freebsd/sys/fs/deadfs/dead_vnops.c
@@ -0,0 +1,159 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)dead_vnops.c 8.1 (Berkeley) 6/10/93
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/poll.h>
+#include <sys/vnode.h>
+
+/*
+ * Prototypes for dead operations on vnodes.
+ */
+static vop_lookup_t dead_lookup;
+static vop_open_t dead_open;
+static vop_getwritemount_t dead_getwritemount;
+static vop_rename_t dead_rename;
+static vop_unset_text_t dead_unset_text;
+
+struct vop_vector dead_vnodeops = {
+ .vop_default = &default_vnodeops,
+
+ .vop_access = VOP_EBADF,
+ .vop_advlock = VOP_EBADF,
+ .vop_bmap = VOP_EBADF,
+ .vop_create = VOP_PANIC,
+ .vop_getattr = VOP_EBADF,
+ .vop_getwritemount = dead_getwritemount,
+ .vop_inactive = VOP_NULL,
+ .vop_ioctl = VOP_EBADF,
+ .vop_link = VOP_PANIC,
+ .vop_lookup = dead_lookup,
+ .vop_mkdir = VOP_PANIC,
+ .vop_mknod = VOP_PANIC,
+ .vop_open = dead_open,
+ .vop_pathconf = VOP_EBADF, /* per pathconf(2) */
+ .vop_poll = dead_poll,
+ .vop_read = dead_read,
+ .vop_readdir = VOP_EBADF,
+ .vop_readlink = VOP_EBADF,
+ .vop_reclaim = VOP_NULL,
+ .vop_remove = VOP_PANIC,
+ .vop_rename = dead_rename,
+ .vop_rmdir = VOP_PANIC,
+ .vop_setattr = VOP_EBADF,
+ .vop_symlink = VOP_PANIC,
+ .vop_vptocnp = VOP_EBADF,
+ .vop_unset_text = dead_unset_text,
+ .vop_write = dead_write,
+};
+
+static int
+dead_getwritemount(struct vop_getwritemount_args *ap)
+{
+
+ *(ap->a_mpp) = NULL;
+ return (0);
+}
+
+/*
+ * Trivial lookup routine that always fails.
+ */
+static int
+dead_lookup(struct vop_lookup_args *ap)
+{
+
+ *ap->a_vpp = NULL;
+ return (ENOTDIR);
+}
+
+/*
+ * Open always fails as if device did not exist.
+ */
+static int
+dead_open(struct vop_open_args *ap)
+{
+
+ return (ENXIO);
+}
+
+int
+dead_read(struct vop_read_args *ap)
+{
+
+ /*
+ * Return EOF for tty devices, EIO for others
+ */
+ if ((ap->a_vp->v_vflag & VV_ISTTY) == 0)
+ return (EIO);
+ return (0);
+}
+
+int
+dead_write(struct vop_write_args *ap)
+{
+
+ return (EIO);
+}
+
+int
+dead_poll(struct vop_poll_args *ap)
+{
+
+ if (ap->a_events & ~POLLSTANDARD)
+ return (POLLNVAL);
+
+ /*
+ * Let the user find out that the descriptor is gone.
+ */
+ return (POLLHUP | ((POLLIN | POLLRDNORM) & ap->a_events));
+
+}
+
+static int
+dead_rename(struct vop_rename_args *ap)
+{
+
+ vop_rename_fail(ap);
+ return (EXDEV);
+}
+
+static int
+dead_unset_text(struct vop_unset_text_args *ap)
+{
+
+ return (0);
+}