1 /* vi: set sw=4 ts=4: */
3 * mkdir.c --- make a directory in the filesystem
5 * Copyright (C) 1994, 1995 Theodore Ts'o.
8 * This file may be redistributed under the terms of the GNU Public
24 #include <sys/types.h>
34 errcode_t
ext2fs_mkdir(ext2_filsys fs
, ext2_ino_t parent
, ext2_ino_t inum
,
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_block(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 inode
.i_blocks
= fs
->blocksize
/ 512;
87 inode
.i_block
[0] = blk
;
88 inode
.i_links_count
= 2;
89 inode
.i_ctime
= inode
.i_atime
= inode
.i_mtime
= time(NULL
);
90 inode
.i_size
= fs
->blocksize
;
93 * Write out the inode and inode data block
95 retval
= ext2fs_write_dir_block(fs
, blk
, block
);
98 retval
= ext2fs_write_new_inode(fs
, ino
, &inode
);
103 * Link the directory into the filesystem hierarchy
106 retval
= ext2fs_lookup(fs
, parent
, name
, strlen(name
), 0,
109 retval
= EXT2_ET_DIR_EXISTS
;
113 if (retval
!= EXT2_ET_FILE_NOT_FOUND
)
115 retval
= ext2fs_link(fs
, parent
, name
, ino
, EXT2_FT_DIR
);
121 * Update parent inode's counts
124 parent_inode
.i_links_count
++;
125 retval
= ext2fs_write_inode(fs
, parent
, &parent_inode
);
131 * Update accounting....
133 ext2fs_block_alloc_stats(fs
, blk
, +1);
134 ext2fs_inode_alloc_stats2(fs
, ino
, +1, 1);
137 ext2fs_free_mem(&block
);