From: Theodore Ts'o Date: Fri, 10 Jun 2011 17:58:18 +0000 (-0400) Subject: libext2fs: create extent-based directories if the extents feature is enabled X-Git-Tag: v1.42-WIP-0702~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1afb468b9a80031b39eab37272709f45727fb221;p=thirdparty%2Fe2fsprogs.git libext2fs: create extent-based directories if the extents feature is enabled This allows mke2fs to create the root and lost+found directories using extents. Signed-off-by: "Theodore Ts'o" --- diff --git a/lib/ext2fs/mkdir.c b/lib/ext2fs/mkdir.c index 86c65da95..9b6b7996e 100644 --- a/lib/ext2fs/mkdir.c +++ b/lib/ext2fs/mkdir.c @@ -33,6 +33,7 @@ errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum, const char *name) { + ext2_extent_handle_t handle; errcode_t retval; struct ext2_inode parent_inode, inode; ext2_ino_t ino = inum; @@ -83,8 +84,10 @@ errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum, inode.i_mode = LINUX_S_IFDIR | (0777 & ~fs->umask); inode.i_uid = inode.i_gid = 0; ext2fs_iblk_set(fs, &inode, 1); - /* FIXME-64 */ - inode.i_block[0] = blk; + if (fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS) + inode.i_flags |= EXT4_EXTENTS_FL; + else + inode.i_block[0] = blk; inode.i_links_count = 2; inode.i_size = fs->blocksize; @@ -98,6 +101,16 @@ errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum, if (retval) goto cleanup; + if (fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS) { + retval = ext2fs_extent_open2(fs, ino, &inode, &handle); + if (retval) + goto cleanup; + retval = ext2fs_extent_set_bmap(handle, 0, blk, 0); + ext2fs_extent_free(handle); + if (retval) + goto cleanup; + } + /* * Link the directory into the filesystem hierarchy */