/* mkdir.c */
extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
const char *name);
+extern errcode_t ext2fs_mkdir2(ext2_filsys fs, ext2_ino_t parent,
+ ext2_ino_t ino, unsigned long flags,
+ int link_flags, const char *name,
+ ext2_ino_t *ret_ino);
/* mkjournal.c */
struct ext2fs_journal_params {
#define EXT2_FT_DIR 2
#endif
-errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
- const char *name)
+errcode_t ext2fs_mkdir2(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t ino,
+ unsigned long flags, int link_flags, const char *name,
+ ext2_ino_t *ret_ino)
{
ext2_extent_handle_t handle;
errcode_t retval;
struct ext2_inode parent_inode, inode;
- ext2_ino_t ino = inum;
ext2_ino_t scratch_ino;
blk64_t blk;
char *block = 0;
if (retval)
goto cleanup;
}
+ if (ret_ino)
+ *ret_ino = ino;
/*
* Allocate a data block for the directory
inode.i_size = fs->blocksize;
ext2fs_iblk_set(fs, &inode, 1);
}
+ inode.i_flags |= flags & (EXT2_FL_USER_MODIFIABLE & ~EXT4_EXTENTS_FL);
inode.i_links_count = 2;
/*
}
if (retval != EXT2_ET_FILE_NOT_FOUND)
goto cleanup;
- retval = ext2fs_link(fs, parent, name, ino, EXT2_FT_DIR);
+ retval = ext2fs_link(fs, parent, name, ino,
+ EXT2_FT_DIR | link_flags);
if (retval)
goto cleanup;
}
}
-
+errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t ino,
+ const char *name)
+{
+ return ext2fs_mkdir2(fs, parent, ino, 0, 0, name, NULL);
+}
} else
parent_ino = cwd;
- retval = ext2fs_mkdir(fs, parent_ino, 0, name);
- if (retval == EXT2_ET_DIR_NO_SPACE) {
- retval = ext2fs_expand_dir(fs, parent_ino);
- if (retval) {
- com_err(__func__, retval,
- _("while expanding directory"));
- return retval;
- }
- retval = ext2fs_mkdir(fs, parent_ino, 0, name);
- }
+ retval = ext2fs_mkdir2(fs, parent_ino, 0, 0,
+ link_append_flag, name, NULL);
if (retval)
- com_err("ext2fs_mkdir", retval,
+ com_err("ext2fs_mkdir2", retval,
_("while creating directory \"%s\""), name);
return retval;
}
*node_name = a;
- err = ext2fs_mkdir(fs, parent, 0, node_name);
- if (err == EXT2_ET_DIR_NO_SPACE) {
- err = ext2fs_expand_dir(fs, parent);
- if (err) {
- ret = translate_error(fs, parent, err);
- goto out2;
- }
-
- err = ext2fs_mkdir(fs, parent, 0, node_name);
- }
+ err = ext2fs_mkdir2(fs, parent, 0, 0, EXT2FS_LINK_EXPAND,
+ node_name, NULL);
if (err) {
ret = translate_error(fs, parent, err);
goto out2;