コード例 #1
0
static int
make_root(struct v7fs_self *fs)
{
	struct v7fs_inode inode;
	struct v7fs_dirent *dir;
	int error;

	/* INO 1 badblk (don't used) */
	memset(&inode, 0, sizeof(inode));
	inode.inode_number = 1;
	inode.mode = V7FS_IFREG;	/* V7 manner */
	v7fs_inode_writeback(fs, &inode);

	/* INO 2 root */
	v7fs_ino_t ino;
	if ((error = v7fs_inode_allocate(fs, &ino))) {
		errno = error;
		warn("Can't allocate / inode");
		return error;
	}

	memset(&inode, 0, sizeof(inode));
	inode.inode_number = ino;
	inode.mode = 0777 | V7FS_IFDIR;
	inode.uid = 0;
	inode.gid = 0;
	inode.nlink = 2;	/* . + .. */
	inode.atime = inode.mtime = inode.ctime = time(0);

	/* root dirent. */
	v7fs_datablock_expand(fs, &inode, sizeof(*dir) * 2);
	v7fs_daddr_t blk = inode.addr[0];
	void *buf;
	if (!(buf = scratch_read(fs, blk))) {
		v7fs_inode_deallocate(fs, ino);
		errno = error = EIO;
		warn("Can't read / dirent.");
		return error;
	}
	dir = (struct v7fs_dirent *)buf; /*disk endian */

	strcpy(dir[0].name, ".");
	dir[0].inode_number = V7FS_VAL16(fs, ino);
	strcpy(dir[1].name, "..");
	dir[1].inode_number = V7FS_VAL16(fs, ino);
	if (!fs->io.write(fs->io.cookie, buf, blk)) {/*writeback */
		scratch_free(fs, buf);
		errno = error = EIO;
		warn("Can't write / dirent.");
		return error;
	}
	scratch_free(fs, buf);
	v7fs_inode_writeback(fs, &inode);
	if ((error = v7fs_superblock_writeback(fs))) {
		errno = error;
		warnx("Can't write superblock.");
	}

	return error;
}
コード例 #2
0
int
v7fs_sync(struct mount *mp, int waitfor, kauth_cred_t cred)
{
    struct v7fs_mount *v7fsmount = mp->mnt_data;
    struct v7fs_self *fs = v7fsmount->core;
    struct v7fs_node *v7fs_node;
    struct v7fs_inode *inode;
    struct vnode *v;
    int err, error;
    int retry_cnt;

    DPRINTF("\n");

    v7fs_superblock_writeback(fs);
    for (retry_cnt = 0; retry_cnt < 2; retry_cnt++) {
        error = 0;

        mutex_enter(&mntvnode_lock);
        for (v7fs_node = LIST_FIRST(&v7fsmount->v7fs_node_head);
                v7fs_node != NULL; v7fs_node = LIST_NEXT(v7fs_node, link)) {
            inode = &v7fs_node->inode;
            if (!v7fs_inode_allocated(inode)) {
                continue;
            }
            v = v7fs_node->vnode;
            mutex_enter(v->v_interlock);
            mutex_exit(&mntvnode_lock);
            err = vget(v, LK_EXCLUSIVE | LK_NOWAIT);
            if (err == 0) {
                err = VOP_FSYNC(v, cred, FSYNC_WAIT, 0, 0);
                vput(v);
            }
            if (err != 0)
                error = err;
            mutex_enter(&mntvnode_lock);
        }
        mutex_exit(&mntvnode_lock);

        if (error == 0)
            break;
    }

    return error;
}
コード例 #3
0
static int
partition_check(struct v7fs_self *fs)
{
	struct v7fs_superblock *sb = &fs->superblock;
	int error;

	if ((error = v7fs_superblock_load(fs))) {
		if (error != EINVAL) {
			/* Invalid superblock information is OK. */
			warnx("Can't read superblock sector.");
		}
	}
	sb->modified = 1;
	if ((error = v7fs_superblock_writeback(fs))) {
		if (errno == EROFS) {
			warnx("Overwriting disk label? ");
		}
		warnx("Can't write superblock sector.");
	}

	return error;
}