16#ifdef EXT2_HTREE_INDEX
21#define dxtrace(command) command
23#define dxtrace(command)
27#define swap(type, x, y) do { type z = x; x = y; y = z; } while (0)
31#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
32#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z)))
33#define H(x, y, z) ((x) ^ (y) ^ (z))
41#define ROUND(f, a, b, c, d, x, s) \
42 (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s)))
44#define K2 013240474631
45#define K3 015666365641
92#define DELTA 0x9E3779B9
104 b1 += ((b0 << 4)+
c) ^ (b0+
sum) ^ ((b0 >> 5)+
d);
113static __u32 dx_hack_hash_unsigned(
const char *
name,
int len)
115 __u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
116 const unsigned char *ucp = (
const unsigned char *)
name;
119 hash = hash1 + (hash0 ^ (((
int) *ucp++) * 7152373));
121 if (
hash & 0x80000000)
129static __u32 dx_hack_hash_signed(
const char *
name,
int len)
131 __u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
132 const signed char *scp = (
const signed char *)
name;
135 hash = hash1 + (hash0 ^ (((
int) *scp++) * 7152373));
137 if (
hash & 0x80000000)
149 const signed char *scp = (
const signed char *)
msg;
157 for (
i = 0;
i <
len;
i++) {
177 const unsigned char *ucp = (
const unsigned char *)
msg;
185 for (
i = 0;
i <
len;
i++) {
219 printk(
"EXT3-fs warning (device %s): %s: ",
268 if (buffer_uptodate(bh))
291 dcb->Header.AllocationSize.QuadPart += dcb->
Vcb->
BlockSize;
296 dcb->Header.ValidDataLength = dcb->Header.FileSize = dcb->Header.AllocationSize;
297 mcb->
Inode.i_size = dcb->Header.AllocationSize.QuadPart;
319 unsigned char type = 0;
372 EXT3_I(
inode)->i_flags &= ~EXT3_INDEX_FL;
394 unsigned short reclen;
414 if ((de->
inode? rlen - nlen: rlen) >= reclen)
419 if ((
char *) de >
top)
456 set_buffer_dirty(bh);
461#ifdef EXT2_HTREE_INDEX
476int ext3_dirhash(
const char *
name,
int len,
struct dx_hash_info *hinfo)
479 __u32 minor_hash = 0;
495 for (
i = 0;
i < 4;
i++) {
503 switch (hinfo->hash_version) {
511 str2hashbuf = str2hashbuf_unsigned;
515 (*str2hashbuf)(
p,
len,
in, 8);
516 half_md4_transform(
buf,
in);
524 str2hashbuf = str2hashbuf_unsigned;
528 (*str2hashbuf)(
p,
len,
in, 4);
529 TEA_transform(
buf,
in);
541 if (
hash == (EXT4_HTREE_EOF_32BIT << 1))
542 hash = (EXT4_HTREE_EOF_32BIT - 1) << 1;
544 hinfo->minor_hash = minor_hash;
563#define hash2pos(major, minor) (major >> 1)
564#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff)
565#define pos2min_hash(pos) (0)
586static void free_rb_tree_fname(
struct rb_root *
root)
609 fname =
rb_entry(
n,
struct fname, rb_hash);
611 struct fname * old = fname;
619 else if (
parent->rb_right ==
n)
627static struct dir_private_info *create_dir_info(
loff_t pos)
629 struct dir_private_info *
p;
634 p->root.rb_node =
NULL;
636 p->extra_fname =
NULL;
639 p->curr_minor_hash = (
__u32)pos2min_hash(
pos);
644void ext3_htree_free_dir_info(
struct dir_private_info *
p)
646 free_rb_tree_fname(&
p->root);
653int ext3_htree_store_dirent(
struct file *dir_file,
__u32 hash,
658 struct fname * fname, *new_fn;
659 struct dir_private_info *
info;
664 p = &
info->root.rb_node;
670 len =
sizeof(
struct fname) +
dirent->name_len + extra_data;
676 new_fn->minor_hash = minor_hash;
678 new_fn->name_len =
dirent->name_len;
679 new_fn->file_type =
dirent->file_type;
681 dirent->name_len + extra_data);
682 new_fn->name[
dirent->name_len] = 0;
692 if ((new_fn->hash == fname->hash) &&
693 (new_fn->minor_hash == fname->minor_hash)) {
694 new_fn->next = fname->next;
695 fname->next = new_fn;
699 if (new_fn->hash < fname->hash)
701 else if (new_fn->hash > fname->hash)
703 else if (new_fn->minor_hash < fname->minor_hash)
714static unsigned char ext3_filetype_table[] = {
724 return (ext3_filetype_table[
filetype]);
732static int call_filldir(
struct file * filp,
void *
cookie,
744 printk(
"call_filldir: called with null fname?!?\n");
747 curr_pos = hash2pos(fname->hash, fname->minor_hash);
750 fname->name_len, (
ULONG)curr_pos,
751 fname->inode, get_dtype(
sb, fname->file_type));
753 filp->
f_pos = curr_pos;
754 info->extra_fname = fname;
790 struct fake_dirent dot;
792 struct fake_dirent dotdot;
799 __u8 indirect_levels;
803 struct dx_entry entries[0];
808 struct fake_dirent fake;
809 struct dx_entry entries[0];
816 struct dx_entry *entries;
827#if defined(__REACTOS__) && !defined(_MSC_VER)
831 struct dx_hash_info *hinfo,
int *
error);
839static inline unsigned dx_get_block (
struct dx_entry *
entry)
844static inline void dx_set_block (
struct dx_entry *
entry,
unsigned value)
849static inline unsigned dx_get_hash (
struct dx_entry *
entry)
854static inline void dx_set_hash (
struct dx_entry *
entry,
unsigned value)
859static inline unsigned dx_get_count (
struct dx_entry *entries)
864static inline unsigned dx_get_limit (
struct dx_entry *entries)
869static inline void dx_set_count (
struct dx_entry *entries,
unsigned value)
874static inline void dx_set_limit (
struct dx_entry *entries,
unsigned value)
879static inline unsigned dx_root_limit (
struct inode *
dir,
unsigned infosize)
883 return 0? 20: entry_space /
sizeof(
struct dx_entry);
886static inline unsigned dx_node_limit (
struct inode *
dir)
889 return 0? 22: entry_space /
sizeof(
struct dx_entry);
896static void dx_show_index (
char *
label,
struct dx_entry *entries)
898 int i,
n = dx_get_count (entries);
900 for (
i = 0;
i <
n;
i++)
902 printk(
"%x->%u ",
i? dx_get_hash(entries +
i): 0, dx_get_block(entries +
i));
914struct stats dx_show_leaf(
struct ext2_icb *icb,
struct dx_hash_info *hinfo,
919 char *
base = (
char *) de;
920 struct dx_hash_info
h = *hinfo;
934 ((
char *) de -
base));
950struct stats dx_show_entries(
struct ext2_icb *icb,
struct dx_hash_info *hinfo,
953 unsigned blocksize =
dir->i_sb->s_blocksize;
961 for (
i = 0;
i <
count;
i++, entries++)
963 u32 block = dx_get_block(entries),
hash =
i? dx_get_hash(entries): 0;
969 dx_show_entries(icb, hinfo,
dir, ((
struct dx_node *) bh->
b_data)->entries,
levels - 1):
971 names += stats.names;
972 space += stats.space;
973 bcount += stats.bcount;
977 printk(
"%snames %u, fullness %u (%u%%)\n",
levels?
"":
" ",
1003static struct dx_frame *
1005 struct dx_hash_info *hinfo,
struct dx_frame *frame_in,
int *
err)
1008 struct dx_entry *at, *entries, *
p, *
q, *
m;
1009 struct dx_root *
root;
1011 struct dx_frame *frame = frame_in;
1024 "Unrecognised inode hash code %d",
1025 root->info.hash_version);
1027 *
err = ERR_BAD_DX_DIR;
1030 hinfo->hash_version =
root->info.hash_version;
1031 hinfo->seed =
EXT3_SB(
dir->i_sb)->s_hash_seed;
1036 if (
root->info.unused_flags & 1) {
1038 "Unimplemented inode hash flags: %#06x",
1039 root->info.unused_flags);
1041 *
err = ERR_BAD_DX_DIR;
1047 "Unimplemented inode hash depth: %#06x",
1048 root->info.indirect_levels);
1050 *
err = ERR_BAD_DX_DIR;
1054 entries = (
struct dx_entry *) (((
char *)&
root->info) +
1055 root->info.info_length);
1057 if (dx_get_limit(entries) != dx_root_limit(
dir,
1058 root->info.info_length)) {
1060 "dx entry: limit != root limit");
1062 *
err = ERR_BAD_DX_DIR;
1069 count = dx_get_count(entries);
1070 if (!
count ||
count > dx_get_limit(entries)) {
1072 "dx entry: no count or count > limit");
1074 *
err = ERR_BAD_DX_DIR;
1083 if (dx_get_hash(
m) >
hash)
1095 if (dx_get_hash(++at) >
hash)
1106 frame->entries = entries;
1111 at = entries = ((
struct dx_node *) bh->
b_data)->entries;
1112 if (dx_get_limit(entries) != dx_node_limit (
dir)) {
1114 "dx entry: limit != node limit");
1116 *
err = ERR_BAD_DX_DIR;
1123 while (frame >= frame_in) {
1128 if (*
err == ERR_BAD_DX_DIR)
1130 "Corrupt dir inode %ld, running e2fsck is "
1131 "recommended.",
dir->i_ino);
1135static void dx_release (
struct dx_frame *frames)
1137 if (frames[0].bh ==
NULL)
1140 if (((
struct dx_root *) frames[0].bh->
b_data)->info.indirect_levels)
1164 struct dx_frame *frames,
__u32 *start_hash)
1168 int err, num_frames = 0;
1180 if (++(
p->at) <
p->entries + dx_get_count(
p->entries))
1195 bhash = dx_get_hash(
p->at);
1197 *start_hash = bhash;
1198 if ((
hash & 1) == 0) {
1199 if ((bhash & ~1) !=
hash)
1206 while (num_frames--) {
1212 p->at =
p->entries = ((
struct dx_node *) bh->
b_data)->entries;
1222int htree_dirblock_to_tree(
struct ext2_icb *icb,
struct file *dir_file,
1224 struct dx_hash_info *hinfo,
1231 dxtrace(
printk(
"In htree dirblock_to_tree: block %d\n",
block));
1237 dir->i_sb->s_blocksize -
1242 + (
unsigned long)((
char *)de - bh->
b_data))) {
1245 (
dir->i_sb->s_blocksize - 1)) + 1;
1250 if ((hinfo->hash < start_hash) ||
1251 ((hinfo->hash == start_hash) &&
1252 (hinfo->minor_hash < start_minor_hash)))
1256 if ((
err = ext3_htree_store_dirent(dir_file,
1257 hinfo->hash, hinfo->minor_hash, de)) != 0) {
1275int ext3_htree_fill_tree(
struct ext2_icb *icb,
struct file *dir_file,
1279 struct dx_hash_info hinfo;
1281 struct dx_frame frames[2], *frame;
1288 dxtrace(
printk(
"In htree_fill_tree, start hash: %x:%x\n", start_hash,
1292 hinfo.hash_version =
EXT3_SB(
dir->i_sb)->s_def_hash_version;
1293 hinfo.seed =
EXT3_SB(
dir->i_sb)->s_hash_seed;
1294 count = htree_dirblock_to_tree(icb, dir_file,
dir, 0, &hinfo,
1295 start_hash, start_minor_hash);
1300 hinfo.hash = start_hash;
1301 hinfo.minor_hash = 0;
1302 frame = dx_probe(icb,
NULL, dir_file->
f_dentry->d_inode, &hinfo, frames, &
err);
1307 if (!start_hash && !start_minor_hash) {
1309 if ((
err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0)
1313 if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) {
1316 if ((
err = ext3_htree_store_dirent(dir_file, 2, 0, de)) != 0)
1322 block = dx_get_block(frame->at);
1323 ret = htree_dirblock_to_tree(icb, dir_file,
dir,
block, &hinfo,
1324 start_hash, start_minor_hash);
1331 ret = ext3_htree_next_block(icb,
dir, HASH_NB_ALWAYS,
1332 frame, frames, &hashval);
1333 *next_hash = hashval;
1344 (
count && ((hashval & 1) == 0)))
1348 dxtrace(
printk(
"Fill tree: returned %d entries, next hash: %x\n",
1349 count, *next_hash));
1367 struct dx_hash_info *hinfo,
struct dx_map_entry *map_tail)
1370 char *
base = (
char *) de;
1371 struct dx_hash_info
h = *hinfo;
1378 map_tail->hash =
h.hash;
1379 map_tail->offs = (
u16) ((
char *) de -
base);
1391static void dx_sort_map (
struct dx_map_entry *
map,
unsigned count)
1402 if (
p->hash <
q->hash)
1403 swap(
struct dx_map_entry, *
p, *
q);
1413 swap(
struct dx_map_entry, *(
q+1), *
q);
1419static void dx_insert_block(
struct dx_frame *frame,
u32 hash,
u32 block)
1421 struct dx_entry *entries = frame->entries;
1422 struct dx_entry *old = frame->at, *
new = old + 1;
1423 unsigned int count = dx_get_count(entries);
1427 memmove(
new + 1,
new, (
char *)(entries +
count) - (
char *)(
new));
1428 dx_set_hash(
new,
hash);
1429 dx_set_block(
new,
block);
1430 dx_set_count(entries,
count + 1);
1438 struct dx_hash_info hinfo = {0};
1440 struct dx_frame frames[2], *frame;
1443 unsigned long block;
1452 if (!(frame = dx_probe(icb,
dentry,
NULL, &hinfo, frames,
err)))
1457 frame->at = (
struct dx_entry *)frames;
1458 dx_set_block(frame->at, 0);
1462 block = dx_get_block(frame->at);
1473 + (
unsigned long)((
char *)de - bh->
b_data))) {
1478 dx_release (frames);
1483 retval = ext3_htree_next_block(icb,
dir,
hash, frame,
1487 "error reading index page in directory #%lu",
1492 }
while (retval == 1);
1497 dx_release (frames);
1506 struct fname *fname;
1517 if (filp->
f_pos == EXT3_HTREE_EOF)
1522 free_rb_tree_fname(&
info->root);
1533 if (
info->extra_fname) {
1534 if (call_filldir(filp,
context, filldir,
info->extra_fname))
1538 }
else if (!
info->curr_node)
1547 if ((!
info->curr_node) ||
1550 free_rb_tree_fname(&
info->root);
1552 ret = ext3_htree_fill_tree(
fc->efc_irp, filp,
info->curr_hash,
1553 info->curr_minor_hash, &
info->next_hash);
1557 filp->
f_pos = EXT3_HTREE_EOF;
1563 fname =
rb_entry(
info->curr_node,
struct fname, rb_hash);
1564 info->curr_hash = fname->hash;
1565 info->curr_minor_hash = fname->minor_hash;
1566 if (call_filldir(filp,
context, filldir, fname))
1570 if (
info->curr_node) {
1573 info->curr_hash = fname->hash;
1574 info->curr_minor_hash = fname->minor_hash;
1576 if (
info->next_hash == ~0) {
1577 filp->
f_pos = EXT3_HTREE_EOF;
1581 info->curr_minor_hash = 0;
1600#if defined(__REACTOS__) && defined(__clang__)
1610 struct dx_frame frames[2], *frame;
1611 struct dx_entry *entries, *at;
1612 struct dx_hash_info hinfo;
1622 entries = frame->entries;
1635 dxtrace(
printk(
"using %u of %u node entries\n",
1636 dx_get_count(entries), dx_get_limit(entries)));
1638 if (dx_get_count(entries) == dx_get_limit(entries)) {
1640 unsigned icount = dx_get_count(entries);
1642 struct dx_entry *entries2;
1643 struct dx_node *node2;
1646 if (
levels && (dx_get_count(frames->entries) ==
1647 dx_get_limit(frames->entries))) {
1649 "Directory index full!");
1656 node2 = (
struct dx_node *)(bh2->
b_data);
1657 entries2 = node2->entries;
1659 node2->fake.inode = 0;
1662 unsigned icount1 = icount/2, icount2 = icount - icount1;
1663 unsigned hash2 = dx_get_hash(entries + icount1);
1664 dxtrace(
printk(
"Split index %i/%i\n", icount1, icount2));
1666 memcpy ((
char *) entries2, (
char *) (entries + icount1),
1667 icount2 *
sizeof(
struct dx_entry));
1668 dx_set_count (entries, icount1);
1669 dx_set_count (entries2, icount2);
1670 dx_set_limit (entries2, dx_node_limit(
dir));
1673 if ((
unsigned int)(at - entries) >= icount1) {
1674 frame->at = at = at - entries - icount1 + entries2;
1675 frame->entries = entries = entries2;
1678 dx_insert_block (frames + 0, hash2, newblock);
1679 dxtrace(dx_show_index (
"node", frames[1].entries));
1680 dxtrace(dx_show_index (
"node",
1681 ((
struct dx_node *) bh2->
b_data)->entries));
1682 set_buffer_dirty(bh2);
1685 dxtrace(
printk(
"Creating second level index...\n"));
1686 memcpy((
char *) entries2, (
char *) entries,
1687 icount *
sizeof(
struct dx_entry));
1688 dx_set_limit(entries2, dx_node_limit(
dir));
1691 dx_set_count(entries, 1);
1692 dx_set_block(entries + 0, newblock);
1693 ((
struct dx_root *) frames[0].bh->
b_data)->info.indirect_levels = 1;
1697 frame->at = at = at - entries + entries2;
1698 frame->entries = entries = entries2;
1702 set_buffer_dirty(frames[0].bh);
1723 dx_move_dirents(
char *
from,
char *to,
struct dx_map_entry *
map,
int count)
1774 struct dx_hash_info *hinfo,
int *
error)
1776 unsigned blocksize =
dir->i_sb->s_blocksize;
1777 unsigned count, continued;
1781 struct dx_map_entry *
map;
1797 map = (
struct dx_map_entry *) (
data2 + blocksize);
1799 blocksize, hinfo,
map);
1815 continued = hash2 ==
map[
split - 1].hash;
1816 dxtrace(
printk(
"Split block %i at %x, %i/%i\n",
1821 de = dx_pack_dirents(
data1,blocksize);
1828 if (hinfo->hash >= hash2)
1833 dx_insert_block (frame, hash2 + continued, newblock);
1834 set_buffer_dirty(bh2);
1835 set_buffer_dirty(frame->bh);
1838 dxtrace(dx_show_index (
"frame", frame->entries));
1854 struct dx_root *
root;
1855 struct dx_frame frames[2], *frame;
1856 struct dx_entry *entries;
1862 struct dx_hash_info hinfo;
1864 struct fake_dirent *fde;
1866 blocksize =
dir->i_sb->s_blocksize;
1867 dxtrace(
printk(
"Creating index: inode %lu\n",
dir->i_ino));
1872 fde = &
root->dotdot;
1875 if ((
char *) de >= (((
char *)
root) + blocksize)) {
1881 len = (
unsigned int)((
char *)
root + blocksize - (
char *) de);
1902 root->info.info_length =
sizeof(
root->info);
1904 entries =
root->entries;
1905 dx_set_block(entries, 1);
1906 dx_set_count(entries, 1);
1907 dx_set_limit(entries, dx_root_limit(
dir,
sizeof(
root->info)));
1910 hinfo.hash_version =
root->info.hash_version;
1911 hinfo.seed =
EXT3_SB(
dir->i_sb)->s_hash_seed;
1914 frame->entries = entries;
1915 frame->at = entries;
1919 de =
do_split(icb,
dir, &bh, frame, &hinfo, &retval);
1920 dx_release (frames);
1953#ifdef EXT2_HTREE_INDEX
1960 blocksize =
sb->s_blocksize;
1964#ifdef EXT2_HTREE_INDEX
1967 if (!retval || (retval != ERR_BAD_DX_DIR))
1969 EXT3_I(
dir)->i_flags &= ~EXT3_INDEX_FL;
1971 ext3_save_inode(icb,
dir);
1984#ifdef EXT2_HTREE_INDEX
1985 if (
blocks == 1 && !dx_fallback &&
2013 while (i < bh->b_size) {
2025 set_buffer_dirty(bh);
2051 "error %d reading directory #%lu offset 0",
2055 "bad directory (dir #%lu) - no data block",
2066 "bad directory (dir #%lu) - no `.' or `..'",
2074 while (offset < inode->i_size) {
2076 (
void *) de >= (
void *) (bh->
b_data+
sb->s_blocksize)) {
2122 dlimit = bh->
b_data +
dir->i_sb->s_blocksize;
2123 while ((
char *) de < dlimit) {
2127 if ((
char *) de +
namelen <= dlimit &&
2150#define NAMEI_RA_CHUNKS 2
2151#define NAMEI_RA_BLOCKS 4
2152#define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
2153#define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b))
2188#ifdef EXT2_HTREE_INDEX
2196 if (bh || (
err != ERR_BAD_DX_DIR))
2198 dxtrace(
printk(
"ext4_find_entry: dx failed, "
2211 if (ra_ptr >= ra_max) {
2222 bh_use[ra_max] =
NULL;
2227 bh_use[ra_max] = bh;
2230 if ((bh = bh_use[ra_ptr++]) ==
NULL)
2233 if (!buffer_uptodate(bh)) {
2236 "offset %lu",
dir->i_ino,
2237 (
unsigned long)
block);
2245 goto cleanup_and_exit;
2249 goto cleanup_and_exit;
2252 if (++
block >= nblocks)
2262 if (
block < nblocks) {
2269 for (; ra_ptr < ra_max; ra_ptr++)
int strcmp(const char *String1, const char *String2)
void restart(int argc, const char *argv[])
#define G(r, i, a, b, c, d)
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
static LPSTR * split(LPSTR s, LPINT args)
#define NT_SUCCESS(StatCode)
BOOL next_node(stream_t *stream, strbuf_t *buf)
static void cleanup(void)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
static void rb_link_node(struct rb_node *node, struct rb_node *parent, struct rb_node **rb_link)
struct rb_node * rb_first(struct rb_root *)
struct rb_node * rb_next(struct rb_node *)
void rb_insert_color(struct rb_node *, struct rb_root *)
#define rb_entry(ptr, type, member)
#define KeQuerySystemTime(t)
#define IsMcbSymLink(Mcb)
struct ext3_dir_entry_2 * do_split(struct ext2_icb *icb, struct inode *dir, struct buffer_head **bh, struct dx_frame *frame, struct dx_hash_info *hinfo, int *error)
struct buffer_head * ext3_dx_find_entry(struct ext2_icb *, struct dentry *dentry, struct ext3_dir_entry_2 **res_dir, int *err)
int ext3_check_dir_entry(const char *function, struct inode *dir, struct ext3_dir_entry_2 *de, struct buffer_head *bh, unsigned long offset)
BOOLEAN Ext2SaveInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode)
int ext3_dx_readdir(struct file *filp, filldir_t filldir, void *context)
NTSTATUS Ext2MapExtent(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONG Index, IN BOOLEAN Alloc, OUT PULONG Block, OUT PULONG Number)
ULONG Ext2LinuxTime(IN LARGE_INTEGER SysTime)
NTSTATUS Ext2ExpandFile(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB Vcb, PEXT2_MCB Mcb, PLARGE_INTEGER Size)
NTSTATUS Ext2MapIndirect(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONG Index, IN BOOLEAN bAlloc, OUT PULONG pBlock, OUT PULONG Number)
struct ext3_dir_entry_2 * ext3_next_entry(struct ext3_dir_entry_2 *p)
int(* filldir_t)(void *, const char *, int, unsigned long, __u32, unsigned)
int Ext2LinuxError(NTSTATUS Status)
#define DX_HASH_LEGACY_UNSIGNED
#define EXT3_FEATURE_INCOMPAT_FILETYPE
static __le16 ext3_rec_len_to_disk(unsigned len)
#define EXT3_DIRENT_LUFID
#define EXT3_FEATURE_COMPAT_DIR_INDEX
#define EXT3_DIR_REC_LEN(len)
#define EXT3_HAS_COMPAT_FEATURE(sb, mask)
#define EXT3_HAS_INCOMPAT_FEATURE(sb, mask)
static unsigned ext3_rec_len_from_disk(__le16 dlen)
#define DX_HASH_TEA_UNSIGNED
#define EXT3_BLOCK_SIZE_BITS(s)
#define DX_HASH_HALF_MD4_UNSIGNED
static int ext3_get_dirent_data_len(struct ext3_dir_entry_2 *de)
#define INODE_HAS_EXTENT(i)
IN PVCB IN ULONG IN OUT PULONG IN BOOLEAN OUT PLARGE_MCB Mcb
GLuint GLuint GLsizei GLenum type
GLuint GLuint GLsizei count
GLdouble GLdouble GLdouble GLdouble q
GLdouble GLdouble GLdouble GLdouble top
GLboolean GLboolean GLboolean b
GLenum GLuint GLenum GLsizei const GLchar * buf
GLboolean GLboolean GLboolean GLboolean a
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
unsigned char ext3_type_by_mode(umode_t mode)
__u32 ext3_current_time(struct inode *in)
int ext3_mark_inode_dirty(struct ext2_icb *icb, struct inode *in)
struct buffer_head * ext3_find_entry(struct ext2_icb *icb, struct dentry *dentry, struct ext3_dir_entry_2 **res_dir)
int ext3_is_dir_empty(struct ext2_icb *icb, struct inode *inode)
void ext3_warning(struct super_block *sb, const char *function, char *fmt,...)
struct buffer_head * ext3_bread(struct ext2_icb *icb, struct inode *inode, unsigned long block, int *err)
int ext3_add_entry(struct ext2_icb *icb, struct dentry *dentry, struct inode *inode)
void ext3_dec_count(struct inode *inode)
static int search_dirblock(struct buffer_head *bh, struct inode *dir, struct dentry *dentry, unsigned long offset, struct ext3_dir_entry_2 **res_dir)
int ext3_release_dir(struct inode *inode, struct file *filp)
struct buffer_head * ext3_append(struct ext2_icb *icb, struct inode *inode, ext3_lblk_t *block, int *err)
int ext3_delete_entry(struct ext2_icb *icb, struct inode *dir, struct ext3_dir_entry_2 *de_del, struct buffer_head *bh)
void ext3_set_de_type(struct super_block *sb, struct ext3_dir_entry_2 *de, umode_t mode)
void ext3_update_dx_flag(struct inode *inode)
int add_dirent_to_buf(struct ext2_icb *icb, struct dentry *dentry, struct inode *inode, struct ext3_dir_entry_2 *de, struct buffer_head *bh)
void ext3_inc_count(struct inode *inode)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
#define kmalloc(size, gfp)
static void wait_on_buffer(struct buffer_head *bh)
int bh_submit_read(struct buffer_head *bh)
static struct buffer_head * sb_getblk(struct super_block *sb, sector_t block)
static void brelse(struct buffer_head *bh)
void __brelse(struct buffer_head *)
static const WCHAR label[]
static CRYPT_DATA_BLOB b1[]
static int sum(int x_, int y_)
static unsigned __int64 next
FD_TYPE file_type(FDSC **curr, char *fixed)
struct dentry::@718 d_name
struct super_block * i_sb
#define CONTAINING_RECORD(address, type, field)
static unsigned int block