static errcode_t mk_hugefile(ext2_filsys fs, blk64_t num,
                             ext2_ino_t dir, unsigned long idx, ext2_ino_t *ino)

{
    errcode_t		retval;
    struct ext2_inode	inode;

    retval = ext2fs_new_inode(fs, 0, LINUX_S_IFREG, NULL, ino);
    if (retval)
        return retval;

    memset(&inode, 0, sizeof(struct ext2_inode));
    inode.i_mode = LINUX_S_IFREG | (0666 & ~fs->umask);
    inode.i_links_count = 1;
    inode.i_uid = uid & 0xFFFF;
    ext2fs_set_i_uid_high(inode, (uid >> 16) & 0xffff);
    inode.i_gid = gid & 0xFFFF;
    ext2fs_set_i_gid_high(inode, (gid >> 16) & 0xffff);

    retval = ext2fs_write_new_inode(fs, *ino, &inode);
    if (retval)
        return retval;

    ext2fs_inode_alloc_stats2(fs, *ino, +1, 0);

    if (EXT2_HAS_INCOMPAT_FEATURE(fs->super,
                                  EXT3_FEATURE_INCOMPAT_EXTENTS))
        inode.i_flags |= EXT4_EXTENTS_FL;
    retval = ext2fs_fallocate(fs,
                              EXT2_FALLOCATE_FORCE_INIT |
                              EXT2_FALLOCATE_ZERO_BLOCKS,
                              *ino, &inode, goal, 0, num);
    if (retval)
        return retval;
    retval = ext2fs_inode_size_set(fs, &inode, num * fs->blocksize);
    if (retval)
        return retval;

    retval = ext2fs_write_inode(fs, *ino, &inode);
    if (retval)
        goto errout;

    if (idx_digits)
        sprintf(fn_numbuf, "%0*lu", idx_digits, idx);
    else if (num_files > 1)
        sprintf(fn_numbuf, "%lu", idx);

retry:
    retval = ext2fs_link(fs, dir, fn_buf, *ino, EXT2_FT_REG_FILE);
    if (retval == EXT2_ET_DIR_NO_SPACE) {
        retval = ext2fs_expand_dir(fs, dir);
        if (retval)
            goto errout;
        goto retry;
    }

errout:
    return retval;
}
Exemple #2
0
/*
 * This function creates a journal using direct I/O routines.
 */
static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
				     blk_t num_blocks, blk64_t goal, int flags)
{
	char			*buf;
	errcode_t		retval;
	struct ext2_inode	inode;
	unsigned long long	inode_size;
	int			falloc_flags = EXT2_FALLOCATE_FORCE_INIT;
	blk64_t			zblk;

	if ((retval = ext2fs_create_journal_superblock(fs, num_blocks, flags,
						       &buf)))
		return retval;

	if ((retval = ext2fs_read_bitmaps(fs)))
		goto out2;

	if ((retval = ext2fs_read_inode(fs, journal_ino, &inode)))
		goto out2;

	if (inode.i_blocks > 0) {
		retval = EEXIST;
		goto out2;
	}

	if (goal == ~0ULL)
		goal = get_midpoint_journal_block(fs);

	if (ext2fs_has_feature_extents(fs->super))
		inode.i_flags |= EXT4_EXTENTS_FL;

	if (!(flags & EXT2_MKJOURNAL_LAZYINIT))
		falloc_flags |= EXT2_FALLOCATE_ZERO_BLOCKS;

	inode_size = (unsigned long long)fs->blocksize * num_blocks;
	inode.i_mtime = inode.i_ctime = fs->now ? fs->now : time(0);
	inode.i_links_count = 1;
	inode.i_mode = LINUX_S_IFREG | 0600;
	retval = ext2fs_inode_size_set(fs, &inode, inode_size);
	if (retval)
		goto out2;

	retval = ext2fs_fallocate(fs, falloc_flags, journal_ino,
				  &inode, goal, 0, num_blocks);
	if (retval)
		goto out2;

	if ((retval = ext2fs_write_new_inode(fs, journal_ino, &inode)))
		goto out2;

	retval = ext2fs_bmap2(fs, journal_ino, &inode, NULL, 0, 0, NULL, &zblk);
	if (retval)
		goto out2;

	retval = io_channel_write_blk64(fs->io, zblk, 1, buf);
	if (retval)
		goto out2;

	memcpy(fs->super->s_jnl_blocks, inode.i_block, EXT2_N_BLOCKS*4);
	fs->super->s_jnl_blocks[15] = inode.i_size_high;
	fs->super->s_jnl_blocks[16] = inode.i_size;
	fs->super->s_jnl_backup_type = EXT3_JNL_BACKUP_BLOCKS;
	ext2fs_mark_super_dirty(fs);

out2:
	ext2fs_free_mem(&buf);
	return retval;
}