]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blobdiff - lib/ext2fs/mkdir.c
libext2fs: create extent-based directories if the extents feature is enabled
[thirdparty/e2fsprogs.git] / lib / ext2fs / mkdir.c
index 86c65da95a0f957922b13f701e819b0e25075523..9b6b7996e3ccbce6cfc746a6aa9862bef97654df 100644 (file)
@@ -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
         */