Defer ukfs (and hence rump) init until after detaching from console.

Otherwise forking when detaching will nuke our potential precious
threads.
This commit is contained in:
pooka 2008-12-12 19:50:27 +00:00
parent 33a0d776c1
commit 710e4c1a30
1 changed files with 21 additions and 16 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: p2k.c,v 1.6 2008/11/14 13:43:20 pooka Exp $ */
/* $NetBSD: p2k.c,v 1.7 2008/12/12 19:50:27 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@ -138,21 +138,14 @@ p2k_run_fs(const char *vfsname, const char *devpath, const char *mountpath,
{
char typebuf[PUFFS_TYPELEN];
struct puffs_ops *pops;
struct puffs_usermount *pu;
struct puffs_usermount *pu = NULL;
struct puffs_node *pn_root;
struct vnode *rvp;
struct ukfs *ukfs;
struct ukfs *ukfs = NULL;
extern int puffs_fakecc;
int rv, sverrno;
int rv = -1, sverrno;
bool dodaemon;
rv = -1;
if (ukfs_init() == -1)
return -1;
ukfs = ukfs_mount(vfsname, devpath, mountpath, mntflags, arg, alen);
if (ukfs == NULL)
return -1;
PUFFSOP_INIT(pops);
PUFFSOP_SET(pops, p2k, fs, statvfs);
@ -204,10 +197,19 @@ p2k_run_fs(const char *vfsname, const char *devpath, const char *mountpath,
strlcat(typebuf, vfsname, sizeof(typebuf));
}
pu = puffs_init(pops, devpath, typebuf, ukfs_getmp(ukfs), puffs_flags);
pu = puffs_init(pops, devpath, typebuf, NULL, puffs_flags);
if (pu == NULL)
goto out;
if (dodaemon)
puffs_daemon(pu, 1, 1);
if (ukfs_init() == -1)
return -1;
ukfs = ukfs_mount(vfsname, devpath, mountpath, mntflags, arg, alen);
if (ukfs == NULL)
goto out;
rvp = ukfs_getrvp(ukfs);
pn_root = puffs_pn_new(pu, rvp);
puffs_setroot(pu, pn_root);
@ -217,16 +219,19 @@ p2k_run_fs(const char *vfsname, const char *devpath, const char *mountpath,
puffs_set_prepost(pu, makelwp, clearlwp);
if (dodaemon)
puffs_daemon(pu, 1, 1);
puffs_setspecific(pu, ukfs_getmp(ukfs));
if ((rv = puffs_mount(pu, mountpath, mntflags, rvp))== -1)
goto out;
rv = puffs_mainloop(pu);
puffs_exit(pu, 1);
pu = NULL;
out:
sverrno = errno;
ukfs_release(ukfs, UKFS_RELFLAG_NOUNMOUNT);
if (ukfs)
ukfs_release(ukfs, UKFS_RELFLAG_NOUNMOUNT);
if (pu)
puffs_cancel(pu, sverrno);
if (rv) {
errno = sverrno;
rv = -1;