2 * dirblock.c --- directory block routines.
4 * Copyright (C) 1995, 1996 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Library
8 * General Public License, version 2.
23 errcode_t ext2fs_read_dir_block4(ext2_filsys fs, blk64_t block,
24 void *buf, int flags EXT2FS_ATTR((unused)),
30 retval = io_channel_read_blk64(fs->io, block, 1, buf);
34 if (!(fs->flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) &&
35 !ext2fs_dir_block_csum_verify(fs, ino,
36 (struct ext2_dir_entry *)buf))
39 #ifdef WORDS_BIGENDIAN
40 retval = ext2fs_dirent_swab_in(fs, buf, flags);
42 if (!retval && corrupt)
43 retval = EXT2_ET_DIR_CSUM_INVALID;
47 errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block,
48 void *buf, int flags EXT2FS_ATTR((unused)))
50 return ext2fs_read_dir_block4(fs, block, buf, flags, 0);
54 * Compute the dirdata length. This includes only optional extensions.
55 * Each extension has a bit set in the high 4 bits of
56 * de->file_type, and the extension length is the first byte in each entry.
58 int ext2_get_dirdata_field_size(struct ext2_dir_entry *de,
61 char *lenp = de->name + (de->name_len & EXT2_NAME_LEN) + 1 /* NUL */;
62 __u8 extra_data_flags = (de->name_len & ~(EXT2_FT_MASK << 8)) >> 12;
66 while ((extra_data_flags & dirdata_flags) != 0) {
67 if (extra_data_flags & 1) {
68 if (dirdata_flags & 1)
73 extra_data_flags >>= 1;
77 /* add NUL terminator byte to dirdata length */
78 return dlen + (dlen != 0);
81 int ext2_get_dirdata_size(struct ext2_dir_entry *de)
83 return ext2_get_dirdata_field_size(de, ~EXT2_FT_MASK);
86 errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
87 void *buf, int flags EXT2FS_ATTR((unused)))
89 return ext2fs_read_dir_block3(fs, block, buf, flags);
92 errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
95 return ext2fs_read_dir_block3(fs, block, buf, 0);
99 errcode_t ext2fs_write_dir_block4(ext2_filsys fs, blk64_t block,
100 void *inbuf, int flags EXT2FS_ATTR((unused)),
106 #ifdef WORDS_BIGENDIAN
107 retval = ext2fs_get_mem(fs->blocksize, &buf);
110 memcpy(buf, inbuf, fs->blocksize);
111 retval = ext2fs_dirent_swab_out(fs, buf, flags);
115 retval = ext2fs_dir_block_csum_set(fs, ino,
116 (struct ext2_dir_entry *)buf);
120 retval = io_channel_write_blk64(fs->io, block, 1, buf);
123 #ifdef WORDS_BIGENDIAN
124 ext2fs_free_mem(&buf);
129 errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block,
130 void *inbuf, int flags EXT2FS_ATTR((unused)))
132 return ext2fs_write_dir_block4(fs, block, inbuf, flags, 0);
135 errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
136 void *inbuf, int flags EXT2FS_ATTR((unused)))
138 return ext2fs_write_dir_block3(fs, block, inbuf, flags);
141 errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
144 return ext2fs_write_dir_block3(fs, block, inbuf, 0);