2 * newdir.c --- create a new directory block
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.
27 * Create new directory block
29 errcode_t
ext2fs_new_dir_block(ext2_filsys fs
, ext2_ino_t dir_ino
,
30 ext2_ino_t parent_ino
, char **block
)
32 struct ext2_dir_entry
*dir
= NULL
;
37 struct ext2_dir_entry_tail
*t
;
40 EXT2_CHECK_MAGIC(fs
, EXT2_ET_MAGIC_EXT2FS_FILSYS
);
42 retval
= ext2fs_get_mem(fs
->blocksize
, &buf
);
45 memset(buf
, 0, fs
->blocksize
);
46 dir
= (struct ext2_dir_entry
*) buf
;
48 if (EXT2_HAS_RO_COMPAT_FEATURE(fs
->super
,
49 EXT4_FEATURE_RO_COMPAT_METADATA_CSUM
))
50 csum_size
= sizeof(struct ext2_dir_entry_tail
);
52 retval
= ext2fs_set_rec_len(fs
, fs
->blocksize
- csum_size
, dir
);
54 ext2fs_free_mem(&buf
);
59 if (fs
->super
->s_feature_incompat
&
60 EXT2_FEATURE_INCOMPAT_FILETYPE
)
61 filetype
= EXT2_FT_DIR
;
63 * Set up entry for '.'
66 ext2fs_dirent_set_name_len(dir
, 1);
67 ext2fs_dirent_set_file_type(dir
, filetype
);
69 rec_len
= (fs
->blocksize
- csum_size
) - EXT2_DIR_REC_LEN(1);
70 dir
->rec_len
= EXT2_DIR_REC_LEN(1);
73 * Set up entry for '..'
75 dir
= (struct ext2_dir_entry
*) (buf
+ dir
->rec_len
);
76 retval
= ext2fs_set_rec_len(fs
, rec_len
, dir
);
78 ext2fs_free_mem(&buf
);
81 dir
->inode
= parent_ino
;
82 ext2fs_dirent_set_name_len(dir
, 2);
83 ext2fs_dirent_set_file_type(dir
, filetype
);
90 t
= EXT2_DIRENT_TAIL(buf
, fs
->blocksize
);
91 ext2fs_initialize_dirent_tail(fs
, t
);