diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h --- a/sys/fs/pseudofs/pseudofs.h +++ b/sys/fs/pseudofs/pseudofs.h @@ -201,6 +201,7 @@ struct pfs_node *pi_root; struct mtx pi_mutex; struct unrhdr *pi_unrhdr; + bool pi_initialized; }; /* @@ -276,9 +277,9 @@ #define PSEUDOFS(name, version, flags) \ \ static struct pfs_info name##_info = { \ - #name, \ - name##_init, \ - name##_uninit, \ + .pi_name = #name, \ + .pi_init = name##_init, \ + .pi_uninit = name##_uninit, \ }; \ \ static int \ @@ -287,18 +288,12 @@ } \ \ static int \ -_##name##_init(struct vfsconf *vfc) { \ - return (pfs_init(&name##_info, vfc)); \ -} \ - \ -static int \ _##name##_uninit(struct vfsconf *vfc) { \ return (pfs_uninit(&name##_info, vfc)); \ } \ \ static struct vfsops name##_vfsops = { \ .vfs_cmount = pfs_cmount, \ - .vfs_init = _##name##_init, \ .vfs_mount = _##name##_mount, \ .vfs_root = pfs_root, \ .vfs_statfs = pfs_statfs, \ diff --git a/sys/fs/pseudofs/pseudofs.c b/sys/fs/pseudofs/pseudofs.c --- a/sys/fs/pseudofs/pseudofs.c +++ b/sys/fs/pseudofs/pseudofs.c @@ -382,10 +382,19 @@ pfs_mount(struct pfs_info *pi, struct mount *mp) { struct statfs *sbp; + int error; if (mp->mnt_flag & MNT_UPDATE) return (EOPNOTSUPP); + if (!pi->pi_initialized) { + error = pfs_init(pi, mp->mnt_vfc); + if (error != 0) + return (error); + + pi->pi_initialized = true; + } + MNT_ILOCK(mp); mp->mnt_flag |= MNT_LOCAL; mp->mnt_kern_flag |= MNTK_NOMSYNC; @@ -492,6 +501,10 @@ { int error; + /* Nothing to do if we were never mounted... */ + if (!pi->pi_initialized) + return (0); + pfs_destroy(pi->pi_root); pi->pi_root = NULL; pfs_fileno_uninit(pi);