[PATCH] Implement Fullfs file system

Ice Cream <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <SE1P216MB14777E31B91053D2FFC6C17CF3392@SE1P216MB1477.KORP216.PROD.OUTLOOK.COM>
(Resubmitting since it went unnoticed last time)
This patch implements the basic Fullfs file system where writes
fail with ENOSPC, as described here:
https://wiki.netbsd.org/projects/project/fullfs/

-- IC
fullfs.diff (text/x-patch, 31.1 KB)
diff --git a/distrib/sets/lists/base/mi b/distrib/sets/lists/base/mi
index fe14a819cd9f..e70342028a72 100644
--- a/distrib/sets/lists/base/mi
+++ b/distrib/sets/lists/base/mi
@@ -414,6 +414,7 @@
 ./sbin/mount_fdesc				base-miscfs-root
 ./sbin/mount_ffs				base-sysutil-root
 ./sbin/mount_filecore				base-filecorefs-root
+./sbin/mount_full				base-miscfs-root
 ./sbin/mount_hfs				base-hfs-root
 ./sbin/mount_hfsp				base-obsolete		obsolete
 ./sbin/mount_kernfs				base-sysutil-root
@@ -1114,6 +1115,7 @@
 ./usr/include/miscfs				base-c-usr
 ./usr/include/miscfs/fdesc			base-c-usr
 ./usr/include/miscfs/fifofs			base-c-usr
+./usr/include/miscfs/fullfs			base-c-usr
 ./usr/include/miscfs/genfs			base-c-usr
 ./usr/include/miscfs/kernfs			base-c-usr
 ./usr/include/miscfs/nullfs			base-c-usr
diff --git a/distrib/sets/lists/comp/mi b/distrib/sets/lists/comp/mi
index b8952f060b89..530e97226710 100644
--- a/distrib/sets/lists/comp/mi
+++ b/distrib/sets/lists/comp/mi
@@ -2670,6 +2670,7 @@
 ./usr/include/milter/mfdef.h			comp-obsolete		obsolete
 ./usr/include/miscfs/fdesc/fdesc.h		comp-c-include
 ./usr/include/miscfs/fifofs/fifo.h		comp-c-include
+./usr/include/miscfs/fullfs/full.h		comp-c-include
 ./usr/include/miscfs/genfs/genfs.h		comp-c-include
 ./usr/include/miscfs/genfs/genfs_node.h		comp-c-include
 ./usr/include/miscfs/genfs/layer.h		comp-c-include
diff --git a/distrib/sets/lists/man/mi b/distrib/sets/lists/man/mi
index ec52c3c82aed..b08803cc8911 100644
--- a/distrib/sets/lists/man/mi
+++ b/distrib/sets/lists/man/mi
@@ -6210,6 +6210,7 @@
 ./usr/share/man/html8/mount_fdesc.html		man-miscfs-htmlman	html
 ./usr/share/man/html8/mount_ffs.html		man-sysutil-htmlman	html
 ./usr/share/man/html8/mount_filecore.html	man-filecorefs-htmlman	html
+./usr/share/man/html8/mount_full.html		man-miscfs-htmlman	html
 ./usr/share/man/html8/mount_hfs.html		man-hfs-htmlman		html
 ./usr/share/man/html8/mount_kernfs.html		man-sysutil-htmlman	html
 ./usr/share/man/html8/mount_lfs.html		man-sysutil-htmlman	html
@@ -9599,6 +9600,7 @@
 ./usr/share/man/man8/mount_fdesc.8		man-miscfs-man		.man
 ./usr/share/man/man8/mount_ffs.8		man-sysutil-man		.man
 ./usr/share/man/man8/mount_filecore.8		man-filecorefs-man	.man
+./usr/share/man/man8/mount_full.8		man-miscfs-man		.man
 ./usr/share/man/man8/mount_hfs.8		man-hfs-man		.man
 ./usr/share/man/man8/mount_hfsp.8		man-obsolete		obsolete
 ./usr/share/man/man8/mount_kernfs.8		man-sysutil-man		.man
diff --git a/sbin/Makefile b/sbin/Makefile
index 8cc5125b95c9..2f3036fcfd8a 100644
--- a/sbin/Makefile
+++ b/sbin/Makefile
@@ -33,6 +33,7 @@ SUBDIR+= mount_ext2fs
 SUBDIR+= mount_fdesc
 SUBDIR+= mount_filecore
 SUBDIR+= mount_ffs
+SUBDIR+= mount_full
 SUBDIR+= mount_hfs
 SUBDIR+= mount_kernfs
 SUBDIR+= mount_lfs
diff --git a/sbin/mount_full/Makefile b/sbin/mount_full/Makefile
new file mode 100644
index 000000000000..7c3790d28c0f
--- /dev/null
+++ b/sbin/mount_full/Makefile
@@ -0,0 +1,17 @@
+#	$NetBSD: Makefile,v 1.13 2020/07/26 08:20:22 mlelstv Exp $
+#	@(#)Makefile	8.3 (Berkeley) 3/27/94
+
+.include <bsd.own.mk>
+
+PROG=	mount_full
+SRCS=	mount_full.c pathadj.c
+MAN=	mount_full.8
+
+MOUNT=  ${NETBSDSRCDIR}/sbin/mount
+CPPFLAGS+= -I${NETBSDSRCDIR}/sys -I${MOUNT}
+.PATH:  ${MOUNT}
+
+DPADD+=${LIBUTIL}
+LDADD+=-lutil
+
+.include <bsd.prog.mk>
diff --git a/sbin/mount_full/mount_full.8 b/sbin/mount_full/mount_full.8
new file mode 100644
index 000000000000..d59d41deda9b
--- /dev/null
+++ b/sbin/mount_full/mount_full.8
@@ -0,0 +1,12 @@
+.Dd March 28, 2024
+.Dt MOUNT_FULL 8
+.Os
+.Sh NAME
+.Nm mount_full
+.Nd a filesystem where writes fail with disk
+full
+.Sh SYNOPSIS
+.Nm
+.Op Fl o Ar options
+.Ar target
+.Ar mount-point
diff --git a/sbin/mount_full/mount_full.c b/sbin/mount_full/mount_full.c
new file mode 100644
index 000000000000..507a1c2a2f94
--- /dev/null
+++ b/sbin/mount_full/mount_full.c
@@ -0,0 +1,127 @@
+/*	$NetBSD: mount_null.c,v 1.21 2020/07/26 08:20:22 mlelstv Exp $	*/
+
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software donated to Berkeley by
+ * Jan-Simon Pendry.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1992, 1993, 1994\
+ The Regents of the University of California.  All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)mount_null.c	8.6 (Berkeley) 4/26/95";
+#else
+__RCSID("$NetBSD: mount_null.c,v 1.21 2020/07/26 08:20:22 mlelstv Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <miscfs/fullfs/full.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <mntopts.h>
+
+#include "mountprog.h"
+
+static const struct mntopt mopts[] = {
+	MOPT_STDOPTS,
+	MOPT_GETARGS,
+	MOPT_NULL,
+};
+
+int	mount_full(int argc, char **argv);
+__dead static void	usage(void);
+
+#ifndef MOUNT_NOMAIN
+int
+main(int argc, char **argv)
+{
+	return mount_full(argc, argv);
+}
+#endif
+
+int
+mount_full(int argc, char *argv[])
+{
+	struct full_args args;
+	int ch, mntflags;
+	char target[MAXPATHLEN], canon_dir[MAXPATHLEN];
+	mntoptparse_t mp;
+
+	mntflags = 0;
+	while ((ch = getopt(argc, argv, "o:")) != -1)
+		switch(ch) {
+		case 'o':
+			mp = getmntopts(optarg, mopts, &mntflags, 0);
+			if (mp == NULL)
+				err(1, "getmntopts");
+			freemntopts(mp);
+			break;
+		case '?':
+		default:
+			usage();
+		}
+	argc -= optind;
+	argv += optind;
+
+	if (argc != 2)
+		usage();
+
+	pathadj(argv[0], target);
+	pathadj(argv[1], canon_dir);
+
+	if (strcmp(target, canon_dir) == 0)
+		errx(1, "%s (%s) and %s (%s) are identical paths",
+		    argv[0], target, argv[1], canon_dir);
+
+	args.la.target = target;
+
+	if (mount(MOUNT_FULL, canon_dir, mntflags, &args, sizeof args) == -1)
+		err(1, "%s on %s", target, canon_dir);
+	exit(0);
+}
+
+static void
+usage(void)
+{
+	(void)fprintf(stderr,
+		"usage: mount_full [-o options] target_fs mount_point\n");
+	exit(1);
+}
diff --git a/sys/compat/linux/common/linux_misc.c b/sys/compat/linux/common/linux_misc.c
index 25c02fc07014..5c5de3df9660 100644
--- a/sys/compat/linux/common/linux_misc.c
+++ b/sys/compat/linux/common/linux_misc.c
@@ -149,6 +149,7 @@ const struct linux_mnttypes linux_fstypes[] = {
 	{ MOUNT_MSDOS,		LINUX_MSDOS_SUPER_MAGIC		},
 	{ MOUNT_LFS,		LINUX_DEFAULT_SUPER_MAGIC	},
 	{ MOUNT_FDESC,		LINUX_DEFAULT_SUPER_MAGIC	},
+	{ MOUNT_FULL,		LINUX_DEFAULT_SUPER_MAGIC	},
 	{ MOUNT_NULL,		LINUX_DEFAULT_SUPER_MAGIC	},
 	{ MOUNT_OVERLAY,	LINUX_DEFAULT_SUPER_MAGIC	},
 	{ MOUNT_UMAP,		LINUX_DEFAULT_SUPER_MAGIC	},
diff --git a/sys/conf/files b/sys/conf/files
index e6a86dcce628..0871cb89bf87 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1567,6 +1567,7 @@ include "fs/union/files.union"
 include "fs/v7fs/files.v7fs"
 include "fs/autofs/files.autofs"
 include "miscfs/fdesc/files.fdesc"
+include "miscfs/fullfs/files.fullfs"
 include "miscfs/kernfs/files.kernfs"
 include "miscfs/nullfs/files.nullfs"
 include "miscfs/overlay/files.overlay"
diff --git a/sys/conf/filesystems.config b/sys/conf/filesystems.config
index aea8bb6110bd..d2ce57d9b761 100644
--- a/sys/conf/filesystems.config
+++ b/sys/conf/filesystems.config
@@ -12,6 +12,7 @@ file-system	EXT2FS		# second extended file system (linux)
 file-system	FDESC		# /dev/fd
 file-system 	FFS		# UFS
 #file-system	FILECORE	# Acorn filecore file system
+file-system	FULLFS		# fullfs file system
 #file-system	HFS		# experimental - Apple HFS+ (read-only)
 file-system	KERNFS		# /kern
 file-system	LFS		# log-structured file system
diff --git a/sys/miscfs/Makefile b/sys/miscfs/Makefile
index 9ba12575c96c..61f6c9ff3f08 100644
--- a/sys/miscfs/Makefile
+++ b/sys/miscfs/Makefile
@@ -1,6 +1,6 @@
 #	$NetBSD: Makefile,v 1.10 2015/05/06 15:57:08 hannken Exp $
 
-SUBDIR=	fdesc fifofs genfs kernfs nullfs overlay procfs specfs umapfs
+SUBDIR=	fdesc fifofs fullfs genfs kernfs nullfs overlay procfs specfs umapfs
 
 INCSDIR= /usr/include/miscfs
 
diff --git a/sys/miscfs/fullfs/Makefile b/sys/miscfs/fullfs/Makefile
new file mode 100644
index 000000000000..7a162414933f
--- /dev/null
+++ b/sys/miscfs/fullfs/Makefile
@@ -0,0 +1,7 @@
+#	$NetBSD: Makefile,v 1.1 1998/06/12 23:23:02 cgd Exp $
+
+INCSDIR= /usr/include/miscfs/fullfs
+
+INCS=	full.h
+
+.include <bsd.kinc.mk>
diff --git a/sys/miscfs/fullfs/files.fullfs b/sys/miscfs/fullfs/files.fullfs
new file mode 100644
index 000000000000..c4e9350cc632
--- /dev/null
+++ b/sys/miscfs/fullfs/files.fullfs
@@ -0,0 +1,7 @@
+#	$NetBSD: files.fullfs,v 1.5 2014/10/12 03:52:30 uebayasi Exp $
+
+deffs	FULLFS
+
+define	fullfs: vfs, layerfs
+file	miscfs/fullfs/full_vfsops.c	fullfs
+file	miscfs/fullfs/full_vnops.c	fullfs
diff --git a/sys/miscfs/fullfs/full.h b/sys/miscfs/fullfs/full.h
new file mode 100644
index 000000000000..5b45e7de57a3
--- /dev/null
+++ b/sys/miscfs/fullfs/full.h
@@ -0,0 +1,117 @@
+/*	$NetBSD: full.h,v 1.20 2017/04/11 07:51:37 hannken Exp $	*/
+
+/*
+ * Copyright (c) 1999 National Aeronautics & Space Administration
+ * All rights reserved.
+ *
+ * This software was written by William Studenmund of the
+ * Numerical Aerospace Simulation Facility, NASA Ames Research Center.
+ *
+ * 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 National Aeronautics & Space Administration
+ *    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 NATIONAL AERONAUTICS & SPACE ADMINISTRATION
+ * ``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 ADMINISTRATION OR CONTRIB-
+ * UTORS 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.
+ */
+
+/*
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software donated to Berkeley by
+ * Jan-Simon Pendry.
+ *
+ * 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.
+ *
+ *	from: Id: lofs.h,v 1.8 1992/05/30 10:05:43 jsp Exp
+ *	@(#)full.h	8.2 (Berkeley) 1/21/94
+ */
+
+#ifndef _MISCFS_FULLFS_H_
+#define _MISCFS_FULLFS_H_
+
+#include <miscfs/genfs/layer.h>
+
+struct full_args {
+	struct	layer_args	la;	/* generic layerfs args */
+};
+#define	fulla_target	la.target
+#define	fulla_export	la.export
+
+#ifdef _KERNEL
+struct full_mount {
+	struct	layer_mount	lm;	/* generic layerfs mount stuff */
+};
+#define	fullm_rootvp		lm.layerm_rootvp
+#define	fullm_export		lm.layerm_export
+#define	fullm_flags		lm.layerm_flags
+#define	fullm_size		lm.layerm_size
+#define	fullm_tag		lm.layerm_tag
+#define	fullm_bypass		lm.layerm_bypass
+#define	fullm_alloc		lm.layerm_alloc
+#define	fullm_vnodeop_p		lm.layerm_vnodeop_p
+#define	fullm_node_hashtbl	lm.layerm_node_hashtbl
+#define	fullm_node_hash		lm.layerm_node_hash
+#define	fullm_hashlock		lm.layerm_hashlock
+
+/*
+ * A cache of vnode references
+ */
+struct full_node {
+	struct	layer_node	ln;
+};
+#define	full_hash	ln.layer_hash
+#define	full_lowervp	ln.layer_lowervp
+#define	full_vnode	ln.layer_vnode
+#define	full_flags	ln.layer_flags
+
+#define	MOUNTTOFULLMOUNT(mp) ((struct full_mount *)((mp)->mnt_data))
+
+extern int (**full_vnodeop_p)(void *);
+extern struct vfsops fullfs_vfsops;
+
+void fullfs_init(void);
+
+#endif /* _KERNEL */
+#endif /* _MISCFS_FULLFS_H_ */
diff --git a/sys/miscfs/fullfs/full_vfsops.c b/sys/miscfs/fullfs/full_vfsops.c
new file mode 100644
index 000000000000..14873cbe03e6
--- /dev/null
+++ b/sys/miscfs/fullfs/full_vfsops.c
@@ -0,0 +1,282 @@
+/*	$NetBSD: full_vfsops.c,v 1.101 2023/02/06 10:32:58 hannken Exp $	*/
+
+/*
+ * Copyright (c) 1999 National Aeronautics & Space Administration
+ * All rights reserved.
+ *
+ * This software was written by William Studenmund of the
+ * Numerical Aerospace Simulation Facility, NASA Ames Research Center.
+ *
+ * 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 National Aeronautics & Space Administration
+ *    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 NATIONAL AERONAUTICS & SPACE ADMINISTRATION
+ * ``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 ADMINISTRATION OR CONTRIB-
+ * UTORS 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.
+ */
+
+/*
+ * Copyright (c) 1992, 1993, 1995
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software donated to Berkeley by
+ * Jan-Simon Pendry.
+ *
+ * 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.
+ *
+ *	from: Id: lofs_vfsops.c,v 1.9 1992/05/30 10:26:24 jsp Exp
+ *	from: @(#)lofs_vfsops.c	1.2 (Berkeley) 6/18/92
+ *	@(#)null_vfsops.c	8.7 (Berkeley) 5/14/95
+ */
+
+/*
+ * Null file-system: VFS operations.
+ *
+ * See full_vnops.c for a description.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: full_vfsops.c,v 1.101 2023/02/06 10:32:58 hannken Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysctl.h>
+#include <sys/vnode.h>
+#include <sys/mount.h>
+#include <sys/namei.h>
+#include <sys/module.h>
+
+#include <miscfs/fullfs/full.h>
+#include <miscfs/genfs/layer_extern.h>
+
+MODULE(MODULE_CLASS_VFS, full, "layerfs");
+
+VFS_PROTOS(fullfs);
+
+int
+fullfs_mount(struct mount *mp, const char *path, void *data, size_t *data_len)
+{
+	struct vnode *lowerrootvp, *vp;
+	struct full_args *args = data;
+	struct full_mount *nmp;
+	struct layer_mount *lmp;
+	struct pathbuf *pb;
+	struct nameidata nd;
+	int error;
+
+	if (args == NULL)
+		return EINVAL;
+	if (*data_len < sizeof(*args))
+		return EINVAL;
+
+	if (mp->mnt_flag & MNT_GETARGS) {
+		lmp = MOUNTTOLAYERMOUNT(mp);
+		if (lmp == NULL)
+			return EIO;
+		args->la.target = NULL;
+		*data_len = sizeof(*args);
+		return 0;
+	}
+
+	/* Update is not supported. */
+	if (mp->mnt_flag & MNT_UPDATE)
+		return EOPNOTSUPP;
+
+	/* Find the lower vnode and lock it. */
+	error = pathbuf_copyin(args->la.target, &pb);
+	if (error) {
+		return error;
+	}
+	NDINIT(&nd, LOOKUP, FOLLOW|LOCKLEAF, pb);
+	if ((error = namei(&nd)) != 0) {
+		pathbuf_destroy(pb);
+		return error;
+	}
+	lowerrootvp = nd.ni_vp;
+	pathbuf_destroy(pb);
+
+	/* Create the mount point. */
+	nmp = kmem_zalloc(sizeof(struct full_mount), KM_SLEEP);
+	mp->mnt_data = nmp;
+	mp->mnt_iflag |= lowerrootvp->v_mount->mnt_iflag & IMNT_MPSAFE;
+	mp->mnt_iflag |= lowerrootvp->v_mount->mnt_iflag & IMNT_SHRLOOKUP;
+
+	/*
+	 * Make sure that the mount point is sufficiently initialized
+	 * that the node create call will work.
+	 */
+	vfs_getnewfsid(mp);
+	error = vfs_set_lowermount(mp, lowerrootvp->v_mount);
+	if (error) {
+		vput(lowerrootvp);
+		kmem_free(nmp, sizeof(struct full_mount));
+		return error;
+	}
+
+	nmp->fullm_size = sizeof(struct full_node);
+	nmp->fullm_tag = VT_FULL;
+	nmp->fullm_bypass = layer_bypass;
+	nmp->fullm_vnodeop_p = full_vnodeop_p;
+
+	/* Setup a full node for root vnode. */
+	VOP_UNLOCK(lowerrootvp);
+	error = layer_node_create(mp, lowerrootvp, &vp);
+	if (error) {
+		vrele(lowerrootvp);
+		kmem_free(nmp, sizeof(struct full_mount));
+		return error;
+	}
+	/*
+	 * Keep a held reference to the root vnode.  It will be released on
+	 * umount.  Note: fullfs is MP-safe.
+	 */
+	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+	vp->v_vflag |= VV_ROOT;
+	nmp->fullm_rootvp = vp;
+	VOP_UNLOCK(vp);
+
+	error = set_statvfs_info(path, UIO_USERSPACE, args->la.target,
+	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, curlwp);
+	if (error)
+		return error;
+
+	if (mp->mnt_lower->mnt_flag & MNT_LOCAL)
+		mp->mnt_flag |= MNT_LOCAL;
+	return 0;
+}
+
+int
+fullfs_unmount(struct mount *mp, int mntflags)
+{
+	struct full_mount *nmp = MOUNTTOFULLMOUNT(mp);
+	struct vnode *full_rootvp = nmp->fullm_rootvp;
+	int error, flags = 0;
+
+	if (mntflags & MNT_FORCE)
+		flags |= FORCECLOSE;
+
+	if (vrefcnt(full_rootvp) > 1 && (mntflags & MNT_FORCE) == 0)
+		return EBUSY;
+
+	if ((error = vflush(mp, full_rootvp, flags)) != 0)
+		return error;
+
+	/* Eliminate all activity and release the vnode. */
+	vgone(full_rootvp);
+
+	/* Finally, destroy the mount point structures. */
+	kmem_free(mp->mnt_data, sizeof(struct full_mount));
+	mp->mnt_data = NULL;
+	return 0;
+}
+
+extern const struct vnodeopv_desc full_vnodeop_opv_desc;
+
+const struct vnodeopv_desc * const fullfs_vnodeopv_descs[] = {
+	&full_vnodeop_opv_desc,
+	NULL,
+};
+
+struct vfsops fullfs_vfsops = {
+	.vfs_name = MOUNT_FULL,
+	.vfs_min_mount_data = sizeof (struct full_args),
+	.vfs_mount = fullfs_mount,
+	.vfs_start = layerfs_start,
+	.vfs_unmount = fullfs_unmount,
+	.vfs_root = layerfs_root,
+	.vfs_quotactl = layerfs_quotactl,
+	.vfs_statvfs = layerfs_statvfs,
+	.vfs_sync = layerfs_sync,
+	.vfs_loadvnode = layerfs_loadvnode,
+	.vfs_vget = layerfs_vget,
+	.vfs_fhtovp = layerfs_fhtovp,
+	.vfs_vptofh = layerfs_vptofh,
+	.vfs_init = layerfs_init,
+	.vfs_done = layerfs_done,
+	.vfs_snapshot = layerfs_snapshot,
+	.vfs_extattrctl = vfs_stdextattrctl,
+	.vfs_suspendctl = layerfs_suspendctl,
+	.vfs_renamelock_enter = layerfs_renamelock_enter,
+	.vfs_renamelock_exit = layerfs_renamelock_exit,
+	.vfs_fsync = (void *)eopnotsupp,
+	.vfs_opv_descs = fullfs_vnodeopv_descs
+};
+
+SYSCTL_SETUP(fullfs_sysctl_setup, "fullfs sysctl")
+{
+
+	sysctl_createv(clog, 0, NULL, NULL,
+	    CTLFLAG_PERMANENT,
+	    CTLTYPE_NODE, "full",
+	    SYSCTL_DESCR("Fullfs file system"),
+	    NULL, 0, NULL, 0,
+	    CTL_VFS, 9, CTL_EOL);
+	/*
+	 * XXX the "9" above could be dynamic, thereby eliminating
+	 * one more instance of the "number to vfs" mapping problem,
+	 * but "9" is the order as taken from sys/mount.h
+	 */
+}
+
+static int
+full_modcmd(modcmd_t cmd, void *arg)
+{
+	int error;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		error = vfs_attach(&fullfs_vfsops);
+		if (error != 0)
+			break;
+		break;
+	case MODULE_CMD_FINI:
+		error = vfs_detach(&fullfs_vfsops);
+		if (error != 0)
+			break;
+		break;
+	default:
+		error = ENOTTY;
+		break;
+	}
+	return error;
+}
diff --git a/sys/miscfs/fullfs/full_vnops.c b/sys/miscfs/fullfs/full_vnops.c
new file mode 100644
index 000000000000..e55cafc85aa4
--- /dev/null
+++ b/sys/miscfs/fullfs/full_vnops.c
@@ -0,0 +1,139 @@
+/*	$NetBSD: full_vnops.c,v 1.43 2020/05/16 18:31:51 christos Exp $	*/
+
+/*
+ * Copyright (c) 1999 National Aeronautics & Space Administration
+ * All rights reserved.
+ *
+ * This software was written by William Studenmund of the
+ * Numerical Aerospace Simulation Facility, NASA Ames Research Center.
+ *
+ * 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 National Aeronautics & Space Administration
+ *    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 NATIONAL AERONAUTICS & SPACE ADMINISTRATION
+ * ``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 ADMINISTRATION OR CONTRIB-
+ * UTORS 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.
+ */
+
+/*
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * John Heidemann of the UCLA Ficus project.
+ *
+ * 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.
+ *
+ *	@(#)null_vnops.c	8.6 (Berkeley) 5/27/95
+ *
+ * Ancestors:
+ *	@(#)lofs_vnops.c	1.2 (Berkeley) 6/18/92
+ *      Id: lofs_vnops.c,v 1.11 1992/05/30 10:05:43 jsp Exp jsp
+ *	...and...
+ *	@(#)null_vnodeops.c 1.20 92/07/07 UCLA Ficus project
+ */
+
+/*
+ * Null file-system.
+ *
+ * Implemented using layerfs, see layer_vnops.c for a description.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: full_vnops.c,v 1.43 2020/05/16 18:31:51 christos Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/vnode.h>
+
+#include <miscfs/genfs/genfs.h>
+#include <miscfs/genfs/layer_extern.h>
+#include <miscfs/fullfs/full.h>
+
+int full_create(void *);
+
+/*
+ * Global VFS data structures.
+ */
+
+int (**full_vnodeop_p)(void *);
+
+const struct vnodeopv_entry_desc full_vnodeop_entries[] = {
+	{ &vop_default_desc,	layer_bypass },
+
+	{ &vop_lookup_desc,	layer_lookup },
+	{ &vop_setattr_desc,	layer_setattr },
+	{ &vop_getattr_desc,	layer_getattr },
+	{ &vop_access_desc,	layer_access },
+	{ &vop_accessx_desc,	genfs_accessx },
+	{ &vop_fsync_desc,	layer_fsync },
+	{ &vop_inactive_desc,	layer_inactive },
+	{ &vop_reclaim_desc,	layer_reclaim },
+	{ &vop_print_desc,	layer_print },
+	{ &vop_remove_desc,	layer_remove },
+	{ &vop_rename_desc,	layer_rename },
+	{ &vop_revoke_desc,	layer_revoke },
+	{ &vop_rmdir_desc,	layer_rmdir },
+
+	{ &vop_open_desc,	layer_open },	/* mount option handling */
+	{ &vop_close_desc,	layer_close },
+
+	{ &vop_bmap_desc,	layer_bmap },
+	{ &vop_getpages_desc,	layer_getpages },
+	{ &vop_putpages_desc,	layer_putpages },
+
+	{ &vop_create_desc,	full_create },
+
+	{ NULL, NULL }
+};
+
+const struct vnodeopv_desc full_vnodeop_opv_desc = {
+	&full_vnodeop_p, full_vnodeop_entries
+};
+
+/* Reject all writes */
+int
+full_create(void *v)
+{
+	return ENOSPC;
+}
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index 1903fcd3c697..55ac71f161a4 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -72,6 +72,7 @@
 #define	MOUNT_MSDOS	"msdos"		/* MSDOS Filesystem */
 #define	MOUNT_LFS	"lfs"		/* Log-based Filesystem */
 #define	MOUNT_FDESC	"fdesc"		/* File Descriptor Filesystem */
+#define	MOUNT_FULL	"full"		/* FS where writes fail with disk full */
 #define	MOUNT_NULL	"null"		/* Minimal Filesystem Layer */
 #define	MOUNT_OVERLAY	"overlay"	/* Minimal Overlay Filesystem Layer */
 #define	MOUNT_UMAP	"umap"	/* User/Group Identifier Remapping Filesystem */
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index e0796d2cf6d0..1b046ce53d06 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -103,7 +103,7 @@ enum vtagtype	{
 	VT_AFS, VT_ISOFS, VT_UNION, VT_ADOSFS, VT_EXT2FS, VT_CODA,
 	VT_FILECORE, VT_NTFS, VT_VFS, VT_OVERLAY, VT_SMBFS, VT_PTYFS,
 	VT_TMPFS, VT_UDF, VT_SYSVBFS, VT_PUFFS, VT_HFS, VT_EFS, VT_ZFS,
-	VT_RUMP, VT_NILFS, VT_V7FS, VT_CHFS, VT_AUTOFS
+	VT_RUMP, VT_NILFS, VT_V7FS, VT_CHFS, VT_AUTOFS, VT_FULL
 };
 
 #define	VNODE_TAGS \
@@ -112,7 +112,7 @@ enum vtagtype	{
     "VT_AFS", "VT_ISOFS", "VT_UNION", "VT_ADOSFS", "VT_EXT2FS", "VT_CODA", \
     "VT_FILECORE", "VT_NTFS", "VT_VFS", "VT_OVERLAY", "VT_SMBFS", "VT_PTYFS", \
     "VT_TMPFS", "VT_UDF", "VT_SYSVBFS", "VT_PUFFS", "VT_HFS", "VT_EFS", \
-    "VT_ZFS", "VT_RUMP", "VT_NILFS", "VT_V7FS", "VT_CHFS", "VT_AUTOFS"
+    "VT_ZFS", "VT_RUMP", "VT_NILFS", "VT_V7FS", "VT_CHFS", "VT_AUTOFS", "VT_FULL"
 
 #if defined(_KERNEL) || defined(_KMEMUSER)
 struct vnode;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.