git: d3462294c1f0 - main - Revert "pseudofs: defer initialization until first mount"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 04 Sep 2025 12:52:36 UTC
The branch main has been updated by kevans:
URL: https://cgit.FreeBSD.org/src/commit/?id=d3462294c1f02ca20cc1869d618bde57559f5914
commit d3462294c1f02ca20cc1869d618bde57559f5914
Author: Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2025-09-04 12:48:18 +0000
Commit: Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2025-09-04 12:51:41 +0000
Revert "pseudofs: defer initialization until first mount"
This reverts commit 65059dd2b6f94e570acc645be82b8ea056316459.
lindebugfs does he vast majority of its pseudofs initialization nearly
everywhere but pseudofs, so let's defer this to post-brsnching.
---
sys/fs/pseudofs/pseudofs.c | 71 +++++--------------------------------------
sys/fs/pseudofs/pseudofs.h | 33 +++++++++-----------
sys/modules/pseudofs/Makefile | 4 +--
3 files changed, 24 insertions(+), 84 deletions(-)
diff --git a/sys/fs/pseudofs/pseudofs.c b/sys/fs/pseudofs/pseudofs.c
index 26a1dcd4ad39..7a4e67455214 100644
--- a/sys/fs/pseudofs/pseudofs.c
+++ b/sys/fs/pseudofs/pseudofs.c
@@ -40,18 +40,13 @@
#include <sys/mount.h>
#include <sys/mutex.h>
#include <sys/proc.h>
-#include <sys/refcount.h>
#include <sys/sbuf.h>
-#include <sys/sx.h>
#include <sys/sysctl.h>
#include <sys/vnode.h>
#include <fs/pseudofs/pseudofs.h>
#include <fs/pseudofs/pseudofs_internal.h>
-static int pfs_setup(struct pfs_info *pi, struct vfsconf *vfc);
-static int pfs_teardown(struct pfs_info *pi, struct vfsconf *vfc);
-
static MALLOC_DEFINE(M_PFSNODES, "pfs_nodes", "pseudofs nodes");
SYSCTL_NODE(_vfs, OID_AUTO, pfs, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
@@ -407,20 +402,10 @@ int
pfs_mount(struct pfs_info *pi, struct mount *mp)
{
struct statfs *sbp;
- int error = 0;
if (mp->mnt_flag & MNT_UPDATE)
return (EOPNOTSUPP);
- sx_xlock(&pi->pi_mountlock);
- if (pi->pi_root == NULL)
- error = pfs_setup(pi, mp->mnt_vfc);
- if (error == 0)
- refcount_acquire(&pi->pi_mounts);
- sx_xunlock(&pi->pi_mountlock);
- if (error != 0)
- return (error);
-
MNT_ILOCK(mp);
mp->mnt_flag |= MNT_LOCAL;
mp->mnt_kern_flag |= MNTK_NOMSYNC;
@@ -459,23 +444,10 @@ pfs_cmount(struct mntarg *ma, void *data, uint64_t flags)
int
pfs_unmount(struct mount *mp, int mntflags)
{
- struct pfs_info *pi;
int error;
error = vflush(mp, 0, (mntflags & MNT_FORCE) ? FORCECLOSE : 0,
curthread);
- if (error != 0)
- return (error);
-
- pi = (struct pfs_info *)mp->mnt_data;
- sx_xlock(&pi->pi_mountlock);
- if (!refcount_release_if_not_last(&pi->pi_mounts)) {
- error = pfs_teardown(pi, mp->mnt_vfc);
- if (error == 0)
- refcount_release(&pi->pi_mounts);
- }
- sx_xunlock(&pi->pi_mountlock);
-
return (error);
}
@@ -501,36 +473,11 @@ pfs_statfs(struct mount *mp, struct statfs *sbp)
return (0);
}
-/*
- * Initialize pseudofs synchronization bits. These will generally be needed
- * in order to avoid problems with parallel mounting of pseudofs consumers.
- */
-int
-pfs_vfsinit(struct pfs_info *pi, struct vfsconf *vfc)
-{
-
- sx_init(&pi->pi_mountlock, "pfs mountlock");
- refcount_init(&pi->pi_mounts, 0);
- return (0);
-}
-
-int
-pfs_vfsuninit(struct pfs_info *pi, struct vfsconf *vfc)
-{
-
- MPASS(pi->pi_root == NULL);
- sx_destroy(&pi->pi_mountlock);
-
- if (bootverbose)
- printf("%s unregistered\n", pi->pi_name);
- return (0);
-}
-
/*
* Initialize a pseudofs instance
*/
-static int
-pfs_setup(struct pfs_info *pi, struct vfsconf *vfc)
+int
+pfs_init(struct pfs_info *pi, struct vfsconf *vfc)
{
struct pfs_node *root;
int error;
@@ -560,20 +507,18 @@ pfs_setup(struct pfs_info *pi, struct vfsconf *vfc)
/*
* Destroy a pseudofs instance
*/
-static int
-pfs_teardown(struct pfs_info *pi, struct vfsconf *vfc)
+int
+pfs_uninit(struct pfs_info *pi, struct vfsconf *vfc)
{
int error;
- MPASS(pi->pi_root != NULL);
- error = (pi->pi_uninit)(pi, vfc);
- if (error != 0)
- return (error);
-
pfs_destroy(pi->pi_root);
pi->pi_root = NULL;
pfs_fileno_uninit(pi);
- return (0);
+ if (bootverbose)
+ printf("%s unregistered\n", pi->pi_name);
+ error = (pi->pi_uninit)(pi, vfc);
+ return (error);
}
/*
diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h
index e060f89b580f..2b08dcad978d 100644
--- a/sys/fs/pseudofs/pseudofs.h
+++ b/sys/fs/pseudofs/pseudofs.h
@@ -31,7 +31,6 @@
#ifndef _PSEUDOFS_H_INCLUDED
#define _PSEUDOFS_H_INCLUDED
-#include <sys/_sx.h>
#include <sys/jail.h>
/*
@@ -189,11 +188,9 @@ typedef int (*pfs_destroy_t)(PFS_DESTROY_ARGS);
/*
* pfs_info: describes a pseudofs instance
*
- * The pi_mutex is used to avoid using the global subr_unit lock for unrhdr, and
- * the pi_mountlock is used to coordinate initialization of the consumer
- * filesystem on first mount. The rest of struct pfs_info is only modified
- * during pi_init() and pi_uninit() of the consumer filesystem, which are fully
- * serialized.
+ * The pi_mutex is only used to avoid using the global subr_unit lock
+ * for unrhdr. The rest of struct pfs_info is only modified during
+ * vfs_init() and vfs_uninit() of the consumer filesystem.
*/
struct pfs_info {
char pi_name[PFS_FSNAMELEN];
@@ -201,11 +198,9 @@ struct pfs_info {
pfs_init_t pi_uninit;
/* members below this line are initialized at run time */
- struct sx pi_mountlock;
struct pfs_node *pi_root;
struct mtx pi_mutex;
struct unrhdr *pi_unrhdr;
- u_int pi_mounts;
};
/*
@@ -254,8 +249,8 @@ int pfs_unmount (struct mount *mp, int mntflags);
int pfs_root (struct mount *mp, int flags,
struct vnode **vpp);
int pfs_statfs (struct mount *mp, struct statfs *sbp);
-int pfs_vfsinit (struct pfs_info *pi, struct vfsconf *vfc);
-int pfs_vfsuninit (struct pfs_info *pi, struct vfsconf *vfc);
+int pfs_init (struct pfs_info *pi, struct vfsconf *vfc);
+int pfs_uninit (struct pfs_info *pi, struct vfsconf *vfc);
/*
* Directory structure construction and manipulation
@@ -282,9 +277,9 @@ int pfs_destroy (struct pfs_node *pn);
#define PSEUDOFS(name, version, flags) \
\
static struct pfs_info name##_info = { \
- .pi_name = #name, \
- .pi_init = name##_init, \
- .pi_uninit = name##_uninit, \
+ #name, \
+ name##_init, \
+ name##_uninit, \
}; \
\
static int \
@@ -293,22 +288,22 @@ _##name##_mount(struct mount *mp) { \
} \
\
static int \
-_##name##_vfsinit(struct vfsconf *vfc) { \
- return (pfs_vfsinit(&name##_info, vfc)); \
+_##name##_init(struct vfsconf *vfc) { \
+ return (pfs_init(&name##_info, vfc)); \
} \
\
static int \
-_##name##_vfsuninit(struct vfsconf *vfc) { \
- return (pfs_vfsuninit(&name##_info, vfc)); \
+_##name##_uninit(struct vfsconf *vfc) { \
+ return (pfs_uninit(&name##_info, vfc)); \
} \
\
static struct vfsops name##_vfsops = { \
.vfs_cmount = pfs_cmount, \
- .vfs_init = _##name##_vfsinit, \
+ .vfs_init = _##name##_init, \
.vfs_mount = _##name##_mount, \
.vfs_root = pfs_root, \
.vfs_statfs = pfs_statfs, \
- .vfs_uninit = _##name##_vfsuninit, \
+ .vfs_uninit = _##name##_uninit, \
.vfs_unmount = pfs_unmount, \
}; \
VFS_SET(name##_vfsops, name, VFCF_SYNTHETIC | flags); \
diff --git a/sys/modules/pseudofs/Makefile b/sys/modules/pseudofs/Makefile
index 3928c950ab70..cb92b8912c86 100644
--- a/sys/modules/pseudofs/Makefile
+++ b/sys/modules/pseudofs/Makefile
@@ -13,8 +13,8 @@ EXPORT_SYMS= pfs_cmount \
pfs_unmount \
pfs_root \
pfs_statfs \
- pfs_vfsinit \
- pfs_vfsuninit \
+ pfs_init \
+ pfs_uninit \
pfs_create_dir \
pfs_create_file \
pfs_create_link \