2 * mkdir.c --- make a directory in the filesystem
4 * Copyright (C) 1994, 1995 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Library
8 * General Public License, version 2.
23 #include <sys/types.h>
33 errcode_t
ext2fs_mkdir(ext2_filsys fs
, ext2_ino_t parent
, ext2_ino_t inum
,
36 ext2_extent_handle_t handle
;
38 struct ext2_inode parent_inode
, inode
;
39 ext2_ino_t ino
= inum
;
40 ext2_ino_t scratch_ino
;
44 EXT2_CHECK_MAGIC(fs
, EXT2_ET_MAGIC_EXT2FS_FILSYS
);
47 * Allocate an inode, if necessary
50 retval
= ext2fs_new_inode(fs
, parent
, LINUX_S_IFDIR
| 0755,
57 * Allocate a data block for the directory
59 retval
= ext2fs_new_block2(fs
, 0, 0, &blk
);
64 * Create a scratch template for the directory
66 retval
= ext2fs_new_dir_block(fs
, ino
, parent
, &block
);
71 * Get the parent's inode, if necessary
74 retval
= ext2fs_read_inode(fs
, parent
, &parent_inode
);
78 memset(&parent_inode
, 0, sizeof(parent_inode
));
81 * Create the inode structure....
83 memset(&inode
, 0, sizeof(struct ext2_inode
));
84 inode
.i_mode
= LINUX_S_IFDIR
| (0777 & ~fs
->umask
);
85 inode
.i_uid
= inode
.i_gid
= 0;
86 ext2fs_iblk_set(fs
, &inode
, 1);
87 if (fs
->super
->s_feature_incompat
& EXT3_FEATURE_INCOMPAT_EXTENTS
)
88 inode
.i_flags
|= EXT4_EXTENTS_FL
;
90 inode
.i_block
[0] = blk
;
91 inode
.i_links_count
= 2;
92 inode
.i_size
= fs
->blocksize
;
95 * Write out the inode and inode data block
97 retval
= ext2fs_write_dir_block(fs
, blk
, block
);
100 retval
= ext2fs_write_new_inode(fs
, ino
, &inode
);
104 if (fs
->super
->s_feature_incompat
& EXT3_FEATURE_INCOMPAT_EXTENTS
) {
105 retval
= ext2fs_extent_open2(fs
, ino
, &inode
, &handle
);
108 retval
= ext2fs_extent_set_bmap(handle
, 0, blk
, 0);
109 ext2fs_extent_free(handle
);
115 * Link the directory into the filesystem hierarchy
118 retval
= ext2fs_lookup(fs
, parent
, name
, strlen(name
), 0,
121 retval
= EXT2_ET_DIR_EXISTS
;
125 if (retval
!= EXT2_ET_FILE_NOT_FOUND
)
127 retval
= ext2fs_link(fs
, parent
, name
, ino
, EXT2_FT_DIR
);
133 * Update parent inode's counts
136 parent_inode
.i_links_count
++;
137 retval
= ext2fs_write_inode(fs
, parent
, &parent_inode
);
143 * Update accounting....
145 ext2fs_block_alloc_stats2(fs
, blk
, +1);
146 ext2fs_inode_alloc_stats2(fs
, ino
, +1, 1);
150 ext2fs_free_mem(&block
);