Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_mountroot.c
Show First 20 Lines • Show All 357 Lines • ▼ Show 20 Lines | if (error) { | ||||
fspath = "/mnt"; | fspath = "/mnt"; | ||||
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, | NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, | ||||
fspath, td); | fspath, td); | ||||
error = namei(&nd); | error = namei(&nd); | ||||
} | } | ||||
if (!error) { | if (!error) { | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
error = (vp->v_type == VDIR) ? 0 : ENOTDIR; | error = (vp->v_type == VDIR) ? 0 : ENOTDIR; | ||||
if (!error) | if (!error && (vp->v_irflag & VIRF_BUFOBJ) != 0) | ||||
error = vinvalbuf(vp, V_SAVE, 0, 0); | error = vinvalbuf(vp, V_SAVE, 0, 0); | ||||
if (!error) { | if (!error) { | ||||
cache_purge(vp); | cache_purge(vp); | ||||
mporoot->mnt_vnodecovered = vp; | mporoot->mnt_vnodecovered = vp; | ||||
vp->v_mountedhere = mporoot; | vp->v_mountedhere = mporoot; | ||||
strlcpy(mporoot->mnt_stat.f_mntonname, | strlcpy(mporoot->mnt_stat.f_mntonname, | ||||
fspath, MNAMELEN); | fspath, MNAMELEN); | ||||
VOP_UNLOCK(vp); | VOP_UNLOCK(vp); | ||||
} else | } else | ||||
vput(vp); | vput(vp); | ||||
} | } | ||||
NDFREE(&nd, NDF_ONLY_PNBUF); | NDFREE(&nd, NDF_ONLY_PNBUF); | ||||
if (error) | if (error) | ||||
printf("mountroot: unable to remount previous root " | printf("mountroot: unable to remount previous root " | ||||
"under /.mount or /mnt (error %d)\n", error); | "under /.mount or /mnt (error %d)\n", error); | ||||
} | } | ||||
/* Remount devfs under /dev */ | /* Remount devfs under /dev */ | ||||
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, "/dev", td); | NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, "/dev", td); | ||||
error = namei(&nd); | error = namei(&nd); | ||||
if (!error) { | if (!error) { | ||||
vp = nd.ni_vp; | vp = nd.ni_vp; | ||||
error = (vp->v_type == VDIR) ? 0 : ENOTDIR; | error = (vp->v_type == VDIR) ? 0 : ENOTDIR; | ||||
if (!error) | if (!error && (vp->v_irflag & VIRF_BUFOBJ) != 0) | ||||
error = vinvalbuf(vp, V_SAVE, 0, 0); | error = vinvalbuf(vp, V_SAVE, 0, 0); | ||||
if (!error) { | if (!error) { | ||||
vpdevfs = mpdevfs->mnt_vnodecovered; | vpdevfs = mpdevfs->mnt_vnodecovered; | ||||
if (vpdevfs != NULL) { | if (vpdevfs != NULL) { | ||||
cache_purge(vpdevfs); | cache_purge(vpdevfs); | ||||
VI_LOCK(vpdevfs); | VI_LOCK(vpdevfs); | ||||
vn_irflag_unset_locked(vpdevfs, VIRF_MOUNTPOINT); | vn_irflag_unset_locked(vpdevfs, VIRF_MOUNTPOINT); | ||||
vpdevfs->v_mountedhere = NULL; | vpdevfs->v_mountedhere = NULL; | ||||
▲ Show 20 Lines • Show All 761 Lines • Show Last 20 Lines |