Revert "pseudofs: defer initialization until first mount"
This reverts commit 65059dd2b6.
lindebugfs does he vast majority of its pseudofs initialization nearly
everywhere but pseudofs, so let's defer this to post-brsnching.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+14
-19
@@ -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); \
|
||||
|
||||
@@ -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 \
|
||||
|
||||
Reference in New Issue
Block a user