+ extern struct vnode *rootvp;
+ struct fs *fs;
+ struct mount *mp;
+ struct proc *p = curproc; /* XXX */
+ int error;
+
+ /*
+ * Get vnodes for swapdev and rootdev.
+ */
+ if ((error = bdevvp(swapdev, &swapdev_vp)) ||
+ (error = bdevvp(rootdev, &rootvp))) {
+ printf("lfs_mountroot: can't setup bdevvp's");
+ return (error);
+ }
+ if (error = vfs_rootmountalloc("lfs", "root_device", &mp))
+ return (error);
+ if (error = lfs_mountfs(rootvp, mp, p)) {
+ mp->mnt_vfc->vfc_refcount--;
+ vfs_unbusy(mp, p);
+ free(mp, M_MOUNT);
+ return (error);
+ }
+ simple_lock(&mountlist_slock);
+ CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
+ simple_unlock(&mountlist_slock);
+ (void)lfs_statfs(mp, &mp->mnt_stat, p);
+ vfs_unbusy(mp, p);
+ return (0);