Exemplo n.º 1
0
static int
ext2_mountroot()
{
#if !defined(__FreeBSD__)
    extern struct vnode *rootvp;
#endif
    register struct ext2_sb_info *fs;
    register struct mount *mp;
#if defined(__FreeBSD__)
    struct proc *p = curproc;
#else
    struct proc *p = get_proc();	/* XXX */
#endif
    struct ufsmount *ump;
    u_int size;
    int error;

    /*
     * Get vnodes for swapdev and rootdev.
     */
    if (bdevvp(swapdev, &swapdev_vp) || bdevvp(rootdev, &rootvp))
        panic("ext2_mountroot: can't setup bdevvp's");

    mp = bsd_malloc((u_long)sizeof(struct mount), M_MOUNT, M_WAITOK);
    bzero((char *)mp, (u_long)sizeof(struct mount));
    mp->mnt_op = &ext2fs_vfsops;
    mp->mnt_flag = MNT_RDONLY;
    if (error = ext2_mountfs(rootvp, mp, p)) {
        bsd_free(mp, M_MOUNT);
        return (error);
    }
    if (error = vfs_lock(mp)) {
        (void)ext2_unmount(mp, 0, p);
        bsd_free(mp, M_MOUNT);
        return (error);
    }
#if defined(__FreeBSD__)
    CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
#else
    TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
#endif
    mp->mnt_flag |= MNT_ROOTFS;
    mp->mnt_vnodecovered = NULLVP;
    ump = VFSTOUFS(mp);
    fs = ump->um_e2fs;
    bzero(fs->fs_fsmnt, sizeof(fs->fs_fsmnt));
    fs->fs_fsmnt[0] = '/';
    bcopy((caddr_t)fs->fs_fsmnt, (caddr_t)mp->mnt_stat.f_mntonname,
          MNAMELEN);
    (void) copystr(ROOTNAME, mp->mnt_stat.f_mntfromname, MNAMELEN - 1,
                   &size);
    bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size);
    (void)ext2_statfs(mp, &mp->mnt_stat, p);
    vfs_unlock(mp);
    inittodr(fs->s_es->s_wtime);		/* this helps to set the time */
    return (0);
}
Exemplo n.º 2
0
static int
ext2_mountroot()
{
	register struct ext2_sb_info *fs;
	register struct mount *mp;
	struct proc *p = curproc;
	struct ufsmount *ump;
	u_int size;
	int error;
	
	if ((error = bdevvp(rootdev, &rootvp))) {
		printf("ext2_mountroot: can't find rootvp\n");
		return (error);
	}
	mp = bsd_malloc((u_long)sizeof(struct mount), M_MOUNT, M_WAITOK);
	bzero((char *)mp, (u_long)sizeof(struct mount));
	mp->mnt_op = &ext2fs_vfsops;
	mp->mnt_flag = MNT_RDONLY;
	if (error = ext2_mountfs(rootvp, mp, p)) {
		bsd_free(mp, M_MOUNT);
		return (error);
	}
	if (error = vfs_lock(mp)) {
		(void)ext2_unmount(mp, 0, p);
		bsd_free(mp, M_MOUNT);
		return (error);
	}
	TAILQ_INSERT_HEAD(&mountlist, mp, mnt_list);
	mp->mnt_flag |= MNT_ROOTFS;
	mp->mnt_vnodecovered = NULLVP;
	ump = VFSTOUFS(mp);
	fs = ump->um_e2fs;
	bzero(fs->fs_fsmnt, sizeof(fs->fs_fsmnt));
	fs->fs_fsmnt[0] = '/';
	bcopy((caddr_t)fs->fs_fsmnt, (caddr_t)mp->mnt_stat.f_mntonname,
	    MNAMELEN);
	(void) copystr(ROOTNAME, mp->mnt_stat.f_mntfromname, MNAMELEN - 1,
	    &size);
	bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size);
	(void)ext2_statfs(mp, &mp->mnt_stat, p);
	vfs_unlock(mp);
	inittodr(fs->s_es->s_wtime);		/* this helps to set the time */
	return (0);
}
Exemplo n.º 3
0
static int
zfs_mountroot(vfs_t *vfsp, enum whymountroot why)
{
	int error = 0;
	int ret = 0;
	static int zfsrootdone = 0;
	zfsvfs_t *zfsvfs = NULL;
	znode_t *zp = NULL;
	vnode_t *vp = NULL;

	ASSERT(vfsp);

	/*
	 * The filesystem that we mount as root is defined in
	 * /etc/system using the zfsroot variable.  The value defined
	 * there is copied early in startup code to zfs_bootpath
	 * (defined in modsysfile.c).
	 */
	if (why == ROOT_INIT) {
		if (zfsrootdone++)
			return (EBUSY);

		/*
		 * This needs to be done here, so that when we return from
		 * mountroot, the vfs resource name will be set correctly.
		 */
		if (snprintf(rootfs.bo_name, BO_MAXOBJNAME, "%s", zfs_bootpath)
		    >= BO_MAXOBJNAME)
			return (ENAMETOOLONG);

		if (error = vfs_lock(vfsp))
			return (error);

		if (error = zfs_domount(vfsp, zfs_bootpath, CRED()))
			goto out;

		zfsvfs = (zfsvfs_t *)vfsp->vfs_data;
		ASSERT(zfsvfs);
		if (error = zfs_zget(zfsvfs, zfsvfs->z_root, &zp))
			goto out;

		vp = ZTOV(zp);
		mutex_enter(&vp->v_lock);
		vp->v_flag |= VROOT;
		mutex_exit(&vp->v_lock);
		rootvp = vp;

		/*
		 * The zfs_zget call above returns with a hold on vp, we release
		 * it here.
		 */
		VN_RELE(vp);

		/*
		 * Mount root as readonly initially, it will be remouted
		 * read/write by /lib/svc/method/fs-usr.
		 */
		readonly_changed_cb(vfsp->vfs_data, B_TRUE);
		vfs_add((struct vnode *)0, vfsp,
		    (vfsp->vfs_flag & VFS_RDONLY) ? MS_RDONLY : 0);
out:
		vfs_unlock(vfsp);
		ret = (error) ? error : 0;
		return (ret);

	} else if (why == ROOT_REMOUNT) {

		readonly_changed_cb(vfsp->vfs_data, B_FALSE);
		vfsp->vfs_flag |= VFS_REMOUNT;
		return (zfs_refresh_properties(vfsp));

	} else if (why == ROOT_UNMOUNT) {
		zfs_unregister_callbacks((zfsvfs_t *)vfsp->vfs_data);
		(void) zfs_sync(vfsp, 0, 0);
		return (0);
	}

	/*
	 * if "why" is equal to anything else other than ROOT_INIT,
	 * ROOT_REMOUNT, or ROOT_UNMOUNT, we do not support it.
	 */
	return (ENOTSUP);
}