1 /*
2  * COPYRIGHT:        See COPYRIGHT.TXT
3  * PROJECT:          Ext2 File System Driver for WinNT/2K/XP
4  * FILE:             lock.c
5  * PROGRAMMER:       Matt Wu <mattwu@163.com>
6  * HOMEPAGE:         http://www.ext2fsd.com
7  * UPDATE HISTORY:
8  *                   Copied from linux/lib/halfmd4.c
9  *                               linux/fs/ext3/hash.c
10  */
11 
12 /* INCLUDES *****************************************************************/
13 
14 #include "ext2fs.h"
15 
16 #ifdef EXT2_HTREE_INDEX
17 
18 #define DX_DEBUG 0
19 
20 #if DX_DEBUG
21 #define dxtrace(command) command
22 #else
23 #define dxtrace(command)
24 #endif
25 
26 #ifndef swap
27 #define swap(type, x, y) do { type z = x; x = y; y = z; } while (0)
28 #endif
29 
30 /* F, G and H are basic MD4 functions: selection, majority, parity */
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))
34 
35 /*
36  * The generic round function.  The application is so specific that
37  * we don't bother protecting all the arguments with parens, as is generally
38  * good macro practice, in favor of extra legibility.
39  * Rotation is separate from addition to prevent recomputation
40  */
41 #define ROUND(f, a, b, c, d, x, s)	\
42 	(a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s)))
43 #define K1 0
44 #define K2 013240474631
45 #define K3 015666365641
46 
47 /*
48  * Basic cut-down MD4 transform.  Returns only 32 bits of result.
49  */
half_md4_transform(__u32 buf[4],__u32 const in[8])50 __u32 half_md4_transform(__u32 buf[4], __u32 const in[8])
51 {
52     __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
53 
54     /* Round 1 */
55     ROUND(F, a, b, c, d, in[0] + K1,  3);
56     ROUND(F, d, a, b, c, in[1] + K1,  7);
57     ROUND(F, c, d, a, b, in[2] + K1, 11);
58     ROUND(F, b, c, d, a, in[3] + K1, 19);
59     ROUND(F, a, b, c, d, in[4] + K1,  3);
60     ROUND(F, d, a, b, c, in[5] + K1,  7);
61     ROUND(F, c, d, a, b, in[6] + K1, 11);
62     ROUND(F, b, c, d, a, in[7] + K1, 19);
63 
64     /* Round 2 */
65     ROUND(G, a, b, c, d, in[1] + K2,  3);
66     ROUND(G, d, a, b, c, in[3] + K2,  5);
67     ROUND(G, c, d, a, b, in[5] + K2,  9);
68     ROUND(G, b, c, d, a, in[7] + K2, 13);
69     ROUND(G, a, b, c, d, in[0] + K2,  3);
70     ROUND(G, d, a, b, c, in[2] + K2,  5);
71     ROUND(G, c, d, a, b, in[4] + K2,  9);
72     ROUND(G, b, c, d, a, in[6] + K2, 13);
73 
74     /* Round 3 */
75     ROUND(H, a, b, c, d, in[3] + K3,  3);
76     ROUND(H, d, a, b, c, in[7] + K3,  9);
77     ROUND(H, c, d, a, b, in[2] + K3, 11);
78     ROUND(H, b, c, d, a, in[6] + K3, 15);
79     ROUND(H, a, b, c, d, in[1] + K3,  3);
80     ROUND(H, d, a, b, c, in[5] + K3,  9);
81     ROUND(H, c, d, a, b, in[0] + K3, 11);
82     ROUND(H, b, c, d, a, in[4] + K3, 15);
83 
84     buf[0] += a;
85     buf[1] += b;
86     buf[2] += c;
87     buf[3] += d;
88 
89     return buf[1]; /* "most hashed" word */
90 }
91 
92 #define DELTA 0x9E3779B9
93 
TEA_transform(__u32 buf[4],__u32 const in[])94 static void TEA_transform(__u32 buf[4], __u32 const in[])
95 {
96     __u32	sum = 0;
97     __u32	b0 = buf[0], b1 = buf[1];
98     __u32	a = in[0], b = in[1], c = in[2], d = in[3];
99     int	n = 16;
100 
101     do {
102         sum += DELTA;
103         b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b);
104         b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d);
105     } while (--n);
106 
107     buf[0] += b0;
108     buf[1] += b1;
109 }
110 
111 
112 /* The old legacy hash */
dx_hack_hash_unsigned(const char * name,int len)113 static __u32 dx_hack_hash_unsigned(const char *name, int len)
114 {
115 	__u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
116 	const unsigned char *ucp = (const unsigned char *) name;
117 
118 	while (len--) {
119 		hash = hash1 + (hash0 ^ (((int) *ucp++) * 7152373));
120 
121 		if (hash & 0x80000000)
122 			hash -= 0x7fffffff;
123 		hash1 = hash0;
124 		hash0 = hash;
125 	}
126 	return hash0 << 1;
127 }
128 
dx_hack_hash_signed(const char * name,int len)129 static __u32 dx_hack_hash_signed(const char *name, int len)
130 {
131 	__u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
132 	const signed char *scp = (const signed char *) name;
133 
134 	while (len--) {
135 		hash = hash1 + (hash0 ^ (((int) *scp++) * 7152373));
136 
137 		if (hash & 0x80000000)
138 			hash -= 0x7fffffff;
139 		hash1 = hash0;
140 		hash0 = hash;
141 	}
142 	return hash0 << 1;
143 }
144 
str2hashbuf_signed(const char * msg,int len,__u32 * buf,int num)145 static void str2hashbuf_signed(const char *msg, int len, __u32 *buf, int num)
146 {
147 	__u32	pad, val;
148 	int	i;
149 	const signed char *scp = (const signed char *) msg;
150 
151 	pad = (__u32)len | ((__u32)len << 8);
152 	pad |= pad << 16;
153 
154 	val = pad;
155 	if (len > num*4)
156 		len = num * 4;
157 	for (i = 0; i < len; i++) {
158 		if ((i % 4) == 0)
159 			val = pad;
160 		val = ((int) scp[i]) + (val << 8);
161 		if ((i % 4) == 3) {
162 			*buf++ = val;
163 			val = pad;
164 			num--;
165 		}
166 	}
167 	if (--num >= 0)
168 		*buf++ = val;
169 	while (--num >= 0)
170 		*buf++ = pad;
171 }
172 
str2hashbuf_unsigned(const char * msg,int len,__u32 * buf,int num)173 static void str2hashbuf_unsigned(const char *msg, int len, __u32 *buf, int num)
174 {
175 	__u32	pad, val;
176 	int	i;
177 	const unsigned char *ucp = (const unsigned char *) msg;
178 
179 	pad = (__u32)len | ((__u32)len << 8);
180 	pad |= pad << 16;
181 
182 	val = pad;
183 	if (len > num*4)
184 		len = num * 4;
185 	for (i = 0; i < len; i++) {
186 		if ((i % 4) == 0)
187 			val = pad;
188 		val = ((int) ucp[i]) + (val << 8);
189 		if ((i % 4) == 3) {
190 			*buf++ = val;
191 			val = pad;
192 			num--;
193 		}
194 	}
195 	if (--num >= 0)
196 		*buf++ = val;
197 	while (--num >= 0)
198 		*buf++ = pad;
199 }
200 
201 
202 #endif /* EXT2_HTREE_INDEX */
203 
ext3_current_time(struct inode * in)204 __u32 ext3_current_time(struct inode *in)
205 {
206     LARGE_INTEGER   SysTime;
207     KeQuerySystemTime(&SysTime);
208 
209     return Ext2LinuxTime(SysTime);
210 }
211 
ext3_warning(struct super_block * sb,const char * function,char * fmt,...)212 void ext3_warning (struct super_block * sb, const char * function,
213                    char * fmt, ...)
214 {
215 #if DX_DEBUG
216     va_list args;
217 
218     va_start(args, fmt);
219     printk("EXT3-fs warning (device %s): %s: ",
220            sb->s_id, function);
221     printk(fmt, args);
222     printk("\n");
223     va_end(args);
224 #endif
225 }
226 
227 
228 /* ext3_bread is safe for meta-data blocks. it's not safe to read file data,
229    since file data is managed by file cache, not volume cache */
ext3_bread(struct ext2_icb * icb,struct inode * inode,unsigned long block,int * err)230 struct buffer_head *ext3_bread(struct ext2_icb *icb, struct inode *inode,
231                                            unsigned long block, int *err)
232 {
233     struct buffer_head * bh = NULL;
234     NTSTATUS    status = STATUS_SUCCESS;
235     ULONG       lbn = 0, num = 0;
236 
237     PEXT2_MCB   Mcb = CONTAINING_RECORD(inode, EXT2_MCB, Inode);
238 
239     /* for symlink file, read it's target instead */
240     if (NULL != Mcb && IsMcbSymLink(Mcb))
241         Mcb = Mcb->Target;
242     if (NULL == Mcb) {
243         *err = -EINVAL;
244         return NULL;
245     }
246 
247     /* mapping file offset to ext2 block */
248     if (INODE_HAS_EXTENT(&Mcb->Inode)) {
249         status = Ext2MapExtent(icb, inode->i_sb->s_priv,
250                                Mcb, block, FALSE,
251                                &lbn, &num);
252     } else {
253         status = Ext2MapIndirect(icb, inode->i_sb->s_priv,
254                                  Mcb, block, FALSE,
255                                  &lbn, &num);
256     }
257 
258     if (!NT_SUCCESS(status)) {
259         *err = Ext2LinuxError(status);
260         return bh;
261     }
262 
263     bh = sb_getblk(inode->i_sb, lbn);
264     if (!bh) {
265         *err = -ENOMEM;
266         return bh;
267     }
268     if (buffer_uptodate(bh))
269         return bh;
270 
271     *err = bh_submit_read(bh);
272     if (*err) {
273 	    __brelse(bh);
274 	    return NULL;
275     }
276     return bh;
277 }
278 
ext3_append(struct ext2_icb * icb,struct inode * inode,ext3_lblk_t * block,int * err)279 struct buffer_head *ext3_append(struct ext2_icb *icb, struct inode *inode,
280                                             ext3_lblk_t *block, int *err)
281 {
282     PEXT2_MCB   mcb = CONTAINING_RECORD(inode, EXT2_MCB, Inode);
283     PEXT2_FCB   dcb = mcb->Fcb;
284     NTSTATUS    status;
285 
286     ASSERT(dcb);
287     ASSERT(inode == dcb->Inode);
288 
289     /* allocate new block since there's no space for us */
290     *block = (ext3_lblk_t)(inode->i_size >> inode->i_sb->s_blocksize_bits);
291     dcb->Header.AllocationSize.QuadPart += dcb->Vcb->BlockSize;
292     status = Ext2ExpandFile(icb, dcb->Vcb, mcb, &(dcb->Header.AllocationSize));
293     if (NT_SUCCESS(status)) {
294 
295         /* update Dcb */
296         dcb->Header.ValidDataLength = dcb->Header.FileSize = dcb->Header.AllocationSize;
297         mcb->Inode.i_size = dcb->Header.AllocationSize.QuadPart;
298 
299         /* save parent directory's inode */
300         Ext2SaveInode(icb, dcb->Vcb, inode);
301     }
302 
303     return ext3_bread(icb, inode, *block, err);
304 }
305 
306 
ext3_inc_count(struct inode * inode)307 void ext3_inc_count(struct inode *inode)
308 {
309     inode->i_nlink++;
310 }
311 
ext3_dec_count(struct inode * inode)312 void ext3_dec_count(struct inode *inode)
313 {
314     inode->i_nlink--;
315 }
316 
ext3_type_by_mode(umode_t mode)317 unsigned char ext3_type_by_mode(umode_t mode)
318 {
319     unsigned char type = 0;
320 
321     switch (mode & S_IFMT) {
322     case S_IFREG:
323         type = EXT3_FT_REG_FILE;
324         break;
325     case S_IFDIR:
326         type = EXT3_FT_DIR;
327         break;
328     case S_IFCHR:
329         type =  EXT3_FT_CHRDEV;
330         break;
331     case S_IFBLK:
332         type = EXT3_FT_BLKDEV;
333         break;
334     case S_IFIFO:
335         type = EXT3_FT_FIFO;
336         break;
337     case S_IFSOCK:
338         type = EXT3_FT_SOCK;
339         break;
340     case S_IFLNK:
341         type = EXT3_FT_SYMLINK;
342     }
343 
344     return type;
345 };
346 
ext3_set_de_type(struct super_block * sb,struct ext3_dir_entry_2 * de,umode_t mode)347 void ext3_set_de_type(struct super_block *sb,
348                       struct ext3_dir_entry_2 *de,
349                       umode_t mode)
350 {
351     if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE))
352         de->file_type = ext3_type_by_mode(mode);
353 }
354 
355 /*
356  * ext3_mark_inode_dirty is somewhat expensive, so unlike ext2 we
357  * do not perform it in these functions.  We perform it at the call site,
358  * if it is needed.
359  */
ext3_mark_inode_dirty(struct ext2_icb * icb,struct inode * in)360 int ext3_mark_inode_dirty(struct ext2_icb *icb, struct inode *in)
361 {
362     if (Ext2SaveInode(icb, in->i_sb->s_priv, in))
363         return 0;
364 
365     return -ENOMEM;
366 }
367 
ext3_update_dx_flag(struct inode * inode)368 void ext3_update_dx_flag(struct inode *inode)
369 {
370     if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb,
371                                  EXT3_FEATURE_COMPAT_DIR_INDEX))
372         EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL;
373 }
374 
375 /*
376  * Add a new entry into a directory (leaf) block.  If de is non-NULL,
377  * it points to a directory entry which is guaranteed to be large
378  * enough for new directory entry.  If de is NULL, then
379  * add_dirent_to_buf will attempt search the directory block for
380  * space.  It will return -ENOSPC if no space is available, and -EIO
381  * and -EEXIST if directory entry already exists.
382  *
383  * NOTE!  bh is NOT released in the case where ENOSPC is returned.  In
384  * all other cases bh is released.
385  */
add_dirent_to_buf(struct ext2_icb * icb,struct dentry * dentry,struct inode * inode,struct ext3_dir_entry_2 * de,struct buffer_head * bh)386 int add_dirent_to_buf(struct ext2_icb *icb, struct dentry *dentry,
387                       struct inode *inode, struct ext3_dir_entry_2 *de,
388                       struct buffer_head *bh)
389 {
390     struct inode *dir = dentry->d_parent->d_inode;
391     const char	*name = dentry->d_name.name;
392     int		namelen = dentry->d_name.len;
393     unsigned int	offset = 0;
394     unsigned short	reclen;
395     int		nlen, rlen, err;
396     char		*top;
397 
398     reclen = EXT3_DIR_REC_LEN(namelen);
399     if (!de) {
400         de = (struct ext3_dir_entry_2 *)bh->b_data;
401         top = bh->b_data + dir->i_sb->s_blocksize - reclen;
402         while ((char *) de <= top) {
403             if (!ext3_check_dir_entry("ext3_add_entry", dir, de,
404                                       bh, offset)) {
405                 __brelse(bh);
406                 return -EIO;
407             }
408             if (ext3_match(namelen, name, de)) {
409                 __brelse(bh);
410                 return -EEXIST;
411             }
412             nlen = EXT3_DIR_REC_LEN(de->name_len);
413             rlen = ext3_rec_len_from_disk(de->rec_len);
414             if ((de->inode? rlen - nlen: rlen) >= reclen)
415                 break;
416             de = (struct ext3_dir_entry_2 *)((char *)de + rlen);
417             offset += rlen;
418         }
419         if ((char *) de > top)
420             return -ENOSPC;
421     }
422 
423     /* By now the buffer is marked for journaling */
424     nlen = EXT3_DIR_REC_LEN(de->name_len);
425     rlen = ext3_rec_len_from_disk(de->rec_len);
426     if (de->inode) {
427         struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen);
428         de1->rec_len = ext3_rec_len_to_disk(rlen - nlen);
429         de->rec_len = ext3_rec_len_to_disk(nlen);
430         de = de1;
431     }
432     de->file_type = EXT3_FT_UNKNOWN;
433     if (inode) {
434         de->inode = cpu_to_le32(inode->i_ino);
435         ext3_set_de_type(dir->i_sb, de, inode->i_mode);
436     } else
437         de->inode = 0;
438     de->name_len = (__u8)namelen;
439     memcpy(de->name, name, namelen);
440 
441     /*
442      * XXX shouldn't update any times until successful
443      * completion of syscall, but too many callers depend
444      * on this.
445      *
446      * XXX similarly, too many callers depend on
447      * ext4_new_inode() setting the times, but error
448      * recovery deletes the inode, so the worst that can
449      * happen is that the times are slightly out of date
450      * and/or different from the directory change time.
451      */
452     dir->i_mtime = dir->i_ctime = ext3_current_time(dir);
453     ext3_update_dx_flag(dir);
454     dir->i_version++;
455     ext3_mark_inode_dirty(icb, dir);
456     set_buffer_dirty(bh);
457     __brelse(bh);
458     return 0;
459 }
460 
461 #ifdef EXT2_HTREE_INDEX
462 
463 /*
464  * Returns the hash of a filename.  If len is 0 and name is NULL, then
465  * this function can be used to test whether or not a hash version is
466  * supported.
467  *
468  * The seed is an 4 longword (32 bits) "secret" which can be used to
469  * uniquify a hash.  If the seed is all zero's, then some default seed
470  * may be used.
471  *
472  * A particular hash version specifies whether or not the seed is
473  * represented, and whether or not the returned hash is 32 bits or 64
474  * bits.  32 bit hashes will return 0 for the minor hash.
475  */
ext3_dirhash(const char * name,int len,struct dx_hash_info * hinfo)476 int ext3_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
477 {
478     __u32	hash;
479     __u32	minor_hash = 0;
480     const char	*p;
481     int		i;
482     __u32 		in[8], buf[4];
483 
484 	void		(*str2hashbuf)(const char *, int, __u32 *, int) =
485 				str2hashbuf_signed;
486 
487     /* Initialize the default seed for the hash checksum functions */
488     buf[0] = 0x67452301;
489     buf[1] = 0xefcdab89;
490     buf[2] = 0x98badcfe;
491     buf[3] = 0x10325476;
492 
493 	/* Check to see if the seed is all zero's */
494 	if (hinfo->seed) {
495 		for (i = 0; i < 4; i++) {
496 			if (hinfo->seed[i])
497 				break;
498 		}
499 		if (i < 4)
500 			memcpy(buf, hinfo->seed, sizeof(buf));
501 	}
502 
503 	switch (hinfo->hash_version) {
504 	case DX_HASH_LEGACY_UNSIGNED:
505 		hash = dx_hack_hash_unsigned(name, len);
506 		break;
507 	case DX_HASH_LEGACY:
508 		hash = dx_hack_hash_signed(name, len);
509 		break;
510 	case DX_HASH_HALF_MD4_UNSIGNED:
511 		str2hashbuf = str2hashbuf_unsigned;
512 	case DX_HASH_HALF_MD4:
513 		p = name;
514 		while (len > 0) {
515 			(*str2hashbuf)(p, len, in, 8);
516 			half_md4_transform(buf, in);
517 			len -= 32;
518 			p += 32;
519 		}
520 		minor_hash = buf[2];
521 		hash = buf[1];
522 		break;
523 	case DX_HASH_TEA_UNSIGNED:
524 		str2hashbuf = str2hashbuf_unsigned;
525 	case DX_HASH_TEA:
526 		p = name;
527 		while (len > 0) {
528 			(*str2hashbuf)(p, len, in, 4);
529 			TEA_transform(buf, in);
530 			len -= 16;
531 			p += 16;
532 		}
533 		hash = buf[0];
534 		minor_hash = buf[1];
535 		break;
536 	default:
537 		hinfo->hash = 0;
538 		return -1;
539 	}
540 	hash = hash & ~1;
541 	if (hash == (EXT4_HTREE_EOF_32BIT << 1))
542 		hash = (EXT4_HTREE_EOF_32BIT - 1) << 1;
543 	hinfo->hash = hash;
544 	hinfo->minor_hash = minor_hash;
545 	return 0;
546 }
547 EXPORT_SYMBOL(ext3_dirhash);
548 
549 
550 /*
551  * These functions convert from the major/minor hash to an f_pos
552  * value.
553  *
554  * Currently we only use major hash numer.  This is unfortunate, but
555  * on 32-bit machines, the same VFS interface is used for lseek and
556  * llseek, so if we use the 64 bit offset, then the 32-bit versions of
557  * lseek/telldir/seekdir will blow out spectacularly, and from within
558  * the ext2 low-level routine, we don't know if we're being called by
559  * a 64-bit version of the system call or the 32-bit version of the
560  * system call.  Worse yet, NFSv2 only allows for a 32-bit readdir
561  * cookie.  Sigh.
562  */
563 #define hash2pos(major, minor)	(major >> 1)
564 #define pos2maj_hash(pos)	((pos << 1) & 0xffffffff)
565 #define pos2min_hash(pos)	(0)
566 
567 /*
568  * This structure holds the nodes of the red-black tree used to store
569  * the directory entry in hash order.
570  */
571 struct fname {
572     __u32		hash;
573     __u32		minor_hash;
574     struct rb_node	rb_hash;
575     struct fname	*next;
576     __u32		inode;
577     __u8		name_len;
578     __u8		file_type;
579     char		name[0];
580 };
581 
582 /*
583  * This functoin implements a non-recursive way of freeing all of the
584  * nodes in the red-black tree.
585  */
free_rb_tree_fname(struct rb_root * root)586 static void free_rb_tree_fname(struct rb_root *root)
587 {
588     struct rb_node	*n = root->rb_node;
589     struct rb_node	*parent;
590     struct fname	*fname;
591 
592     while (n) {
593         /* Do the node's children first */
594         if ((n)->rb_left) {
595             n = n->rb_left;
596             continue;
597         }
598         if (n->rb_right) {
599             n = n->rb_right;
600             continue;
601         }
602         /*
603          * The node has no children; free it, and then zero
604          * out parent's link to it.  Finally go to the
605          * beginning of the loop and try to free the parent
606          * node.
607          */
608         parent = rb_parent(n);
609         fname = rb_entry(n, struct fname, rb_hash);
610         while (fname) {
611             struct fname * old = fname;
612             fname = fname->next;
613             kfree (old);
614         }
615         if (!parent)
616             root->rb_node = NULL;
617         else if (parent->rb_left == n)
618             parent->rb_left = NULL;
619         else if (parent->rb_right == n)
620             parent->rb_right = NULL;
621         n = parent;
622     }
623     root->rb_node = NULL;
624 }
625 
626 
create_dir_info(loff_t pos)627 static struct dir_private_info *create_dir_info(loff_t pos)
628 {
629     struct dir_private_info *p;
630 
631     p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL);
632     if (!p)
633         return NULL;
634     p->root.rb_node = NULL;
635     p->curr_node = NULL;
636     p->extra_fname = NULL;
637     p->last_pos = 0;
638     p->curr_hash = (__u32)pos2maj_hash(pos);
639     p->curr_minor_hash = (__u32)pos2min_hash(pos);
640     p->next_hash = 0;
641     return p;
642 }
643 
ext3_htree_free_dir_info(struct dir_private_info * p)644 void ext3_htree_free_dir_info(struct dir_private_info *p)
645 {
646     free_rb_tree_fname(&p->root);
647     kfree(p);
648 }
649 
650 /*
651  * Given a directory entry, enter it into the fname rb tree.
652  */
ext3_htree_store_dirent(struct file * dir_file,__u32 hash,__u32 minor_hash,struct ext3_dir_entry_2 * dirent)653 int ext3_htree_store_dirent(struct file *dir_file, __u32 hash,
654                             __u32 minor_hash,
655                             struct ext3_dir_entry_2 *dirent)
656 {
657     struct rb_node **p, *parent = NULL;
658     struct fname * fname, *new_fn;
659     struct dir_private_info *info;
660     int extra_data = 0;
661     int len;
662 
663     info = (struct dir_private_info *) dir_file->private_data;
664     p = &info->root.rb_node;
665 
666     /* Create and allocate the fname structure */
667     if (dirent->file_type & EXT3_DIRENT_LUFID)
668         extra_data = ext3_get_dirent_data_len(dirent);
669 
670     len = sizeof(struct fname) + dirent->name_len + extra_data;
671     new_fn = kmalloc(len, GFP_KERNEL);
672     if (!new_fn)
673         return -ENOMEM;
674     memset(new_fn, 0, len);
675     new_fn->hash = hash;
676     new_fn->minor_hash = minor_hash;
677     new_fn->inode = le32_to_cpu(dirent->inode);
678     new_fn->name_len = dirent->name_len;
679     new_fn->file_type = dirent->file_type;
680     memcpy(&new_fn->name[0], &dirent->name[0],
681            dirent->name_len + extra_data);
682     new_fn->name[dirent->name_len] = 0;
683 
684     while (*p) {
685         parent = *p;
686         fname = rb_entry(parent, struct fname, rb_hash);
687 
688         /*
689          * If the hash and minor hash match up, then we put
690          * them on a linked list.  This rarely happens...
691          */
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;
696             return 0;
697         }
698 
699         if (new_fn->hash < fname->hash)
700             p = &(*p)->rb_left;
701         else if (new_fn->hash > fname->hash)
702             p = &(*p)->rb_right;
703         else if (new_fn->minor_hash < fname->minor_hash)
704             p = &(*p)->rb_left;
705         else /* if (new_fn->minor_hash > fname->minor_hash) */
706             p = &(*p)->rb_right;
707     }
708 
709     rb_link_node(&new_fn->rb_hash, parent, p);
710     rb_insert_color(&new_fn->rb_hash, &info->root);
711     return 0;
712 }
713 
714 static unsigned char ext3_filetype_table[] = {
715     DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK
716 };
717 
get_dtype(struct super_block * sb,int filetype)718 static unsigned char get_dtype(struct super_block *sb, int filetype)
719 {
720     if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) ||
721             (filetype >= EXT3_FT_MAX))
722         return DT_UNKNOWN;
723 
724     return (ext3_filetype_table[filetype]);
725 }
726 
727 /*
728  * This is a helper function for ext3_dx_readdir.  It calls filldir
729  * for all entres on the fname linked list.  (Normally there is only
730  * one entry on the linked list, unless there are 62 bit hash collisions.)
731  */
call_filldir(struct file * filp,void * cookie,filldir_t filldir,struct fname * fname)732 static int call_filldir(struct file * filp, void * cookie,
733                         filldir_t filldir, struct fname *fname)
734 {
735     struct dir_private_info *info = filp->private_data;
736     loff_t	curr_pos;
737     struct inode *inode = filp->f_dentry->d_inode;
738     struct super_block * sb;
739     int error;
740 
741     sb = inode->i_sb;
742 
743     if (!fname) {
744         printk("call_filldir: called with null fname?!?\n");
745         return 0;
746     }
747     curr_pos = hash2pos(fname->hash, fname->minor_hash);
748     while (fname) {
749         error = filldir(cookie, fname->name,
750                         fname->name_len, (ULONG)curr_pos,
751                         fname->inode, get_dtype(sb, fname->file_type));
752         if (error) {
753             filp->f_pos = curr_pos;
754             info->extra_fname = fname;
755             return error;
756         }
757         fname = fname->next;
758     }
759     return 0;
760 }
761 
762 struct fake_dirent
763 {
764     __le32 inode;
765     __le16 rec_len;
766     __u8 name_len;
767     __u8 file_type;
768 };
769 
770 struct dx_countlimit
771 {
772     __le16 limit;
773     __le16 count;
774 };
775 
776 struct dx_entry
777 {
778     __le32 hash;
779     __le32 block;
780 };
781 
782 /*
783  * dx_root_info is laid out so that if it should somehow get overlaid by a
784  * dirent the two low bits of the hash version will be zero.  Therefore, the
785  * hash version mod 4 should never be 0.  Sincerely, the paranoia department.
786  */
787 
788 struct dx_root
789 {
790     struct fake_dirent dot;
791     char dot_name[4];
792     struct fake_dirent dotdot;
793     char dotdot_name[4];
794     struct dx_root_info
795     {
796         __le32 reserved_zero;
797         __u8 hash_version;
798         __u8 info_length; /* 8 */
799         __u8 indirect_levels;
800         __u8 unused_flags;
801     }
802     info;
803     struct dx_entry	entries[0];
804 };
805 
806 struct dx_node
807 {
808     struct fake_dirent fake;
809     struct dx_entry	entries[0];
810 };
811 
812 
813 struct dx_frame
814 {
815     struct buffer_head *bh;
816     struct dx_entry *entries;
817     struct dx_entry *at;
818 };
819 
820 struct dx_map_entry
821 {
822     __u32 hash;
823     __u16 offs;
824     __u16 size;
825 };
826 
827 #if defined(__REACTOS__) && !defined(_MSC_VER)
828 struct ext3_dir_entry_2 *
829             do_split(struct ext2_icb *icb, struct inode *dir,
830                      struct buffer_head **bh,struct dx_frame *frame,
831                      struct dx_hash_info *hinfo, int *error);
832 #endif
833 
834 /*
835  * Future: use high four bits of block for coalesce-on-delete flags
836  * Mask them off for now.
837  */
838 
dx_get_block(struct dx_entry * entry)839 static inline unsigned dx_get_block (struct dx_entry *entry)
840 {
841     return le32_to_cpu(entry->block) & 0x00ffffff;
842 }
843 
dx_set_block(struct dx_entry * entry,unsigned value)844 static inline void dx_set_block (struct dx_entry *entry, unsigned value)
845 {
846     entry->block = cpu_to_le32(value);
847 }
848 
dx_get_hash(struct dx_entry * entry)849 static inline unsigned dx_get_hash (struct dx_entry *entry)
850 {
851     return le32_to_cpu(entry->hash);
852 }
853 
dx_set_hash(struct dx_entry * entry,unsigned value)854 static inline void dx_set_hash (struct dx_entry *entry, unsigned value)
855 {
856     entry->hash = cpu_to_le32(value);
857 }
858 
dx_get_count(struct dx_entry * entries)859 static inline unsigned dx_get_count (struct dx_entry *entries)
860 {
861     return le16_to_cpu(((struct dx_countlimit *) entries)->count);
862 }
863 
dx_get_limit(struct dx_entry * entries)864 static inline unsigned dx_get_limit (struct dx_entry *entries)
865 {
866     return le16_to_cpu(((struct dx_countlimit *) entries)->limit);
867 }
868 
dx_set_count(struct dx_entry * entries,unsigned value)869 static inline void dx_set_count (struct dx_entry *entries, unsigned value)
870 {
871     ((struct dx_countlimit *) entries)->count = cpu_to_le16(value);
872 }
873 
dx_set_limit(struct dx_entry * entries,unsigned value)874 static inline void dx_set_limit (struct dx_entry *entries, unsigned value)
875 {
876     ((struct dx_countlimit *) entries)->limit = cpu_to_le16(value);
877 }
878 
dx_root_limit(struct inode * dir,unsigned infosize)879 static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize)
880 {
881     unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) -
882                            EXT3_DIR_REC_LEN(2) - infosize;
883     return 0? 20: entry_space / sizeof(struct dx_entry);
884 }
885 
dx_node_limit(struct inode * dir)886 static inline unsigned dx_node_limit (struct inode *dir)
887 {
888     unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0);
889     return 0? 22: entry_space / sizeof(struct dx_entry);
890 }
891 
892 /*
893  * Debug
894  */
895 #if DX_DEBUG
dx_show_index(char * label,struct dx_entry * entries)896 static void dx_show_index (char * label, struct dx_entry *entries)
897 {
898     int i, n = dx_get_count (entries);
899     printk("%s index ", label);
900     for (i = 0; i < n; i++)
901     {
902         printk("%x->%u ", i? dx_get_hash(entries + i): 0, dx_get_block(entries + i));
903     }
904     printk("\n");
905 }
906 
907 struct stats
908 {
909     unsigned names;
910     unsigned space;
911     unsigned bcount;
912 };
913 
dx_show_leaf(struct ext2_icb * icb,struct dx_hash_info * hinfo,struct ext3_dir_entry_2 * de,int size,int show_names)914 struct stats dx_show_leaf(struct ext2_icb *icb, struct dx_hash_info *hinfo,
915                                       struct ext3_dir_entry_2 *de, int size, int show_names)
916 {
917     struct stats rc;
918     unsigned names = 0, space = 0;
919     char *base = (char *) de;
920     struct dx_hash_info h = *hinfo;
921 
922     printk("names: ");
923     while ((char *) de < base + size)
924     {
925         if (de->inode)
926         {
927             if (show_names)
928             {
929                 int len = de->name_len;
930                 char *name = de->name;
931                 while (len--) printk("%c", *name++);
932                 ext3_dirhash(de->name, de->name_len, &h);
933                 printk(":%x.%u ", h.hash,
934                        ((char *) de - base));
935             }
936             space += EXT3_DIR_REC_LEN(de->name_len);
937             names++;
938         }
939         de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
940     }
941     printk("(%i)\n", names);
942 
943     rc.names = names;
944     rc.space = space;
945     rc.bcount = 1;
946 
947     return rc;
948 }
949 
dx_show_entries(struct ext2_icb * icb,struct dx_hash_info * hinfo,struct inode * dir,struct dx_entry * entries,int levels)950 struct stats dx_show_entries(struct ext2_icb *icb, struct dx_hash_info *hinfo,
951                                          struct inode *dir, struct dx_entry *entries, int levels)
952 {
953     unsigned blocksize = dir->i_sb->s_blocksize;
954     unsigned count = dx_get_count (entries), names = 0, space = 0, i;
955     unsigned bcount = 0;
956     struct buffer_head *bh;
957     struct stats rc;
958     int err;
959 
960     printk("%i indexed blocks...\n", count);
961     for (i = 0; i < count; i++, entries++)
962     {
963         u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0;
964         u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash;
965         struct stats stats;
966         printk("%s%3u:%03u hash %8x/%8x ",levels?"":"   ", i, block, hash, range);
967         if (!(bh = ext3_bread (icb, dir, block, &err))) continue;
968         stats = levels?
969                 dx_show_entries(icb, hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1):
970                 dx_show_leaf(icb, hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0);
971         names += stats.names;
972         space += stats.space;
973         bcount += stats.bcount;
974         __brelse (bh);
975     }
976     if (bcount)
977         printk("%snames %u, fullness %u (%u%%)\n", levels?"":"   ",
978                names, space/bcount,(space/bcount)*100/blocksize);
979 
980     rc.names = names;
981     rc.space = space;
982     rc.bcount = 1;
983 
984     return rc;
985 }
986 #endif /* DX_DEBUG */
987 
988 
ext3_save_inode(struct ext2_icb * icb,struct inode * in)989 int ext3_save_inode ( struct ext2_icb *icb, struct inode *in)
990 {
991     return Ext2SaveInode(icb, in->i_sb->s_priv, in);
992 }
993 
994 /*
995  * Probe for a directory leaf block to search.
996  *
997  * dx_probe can return ERR_BAD_DX_DIR, which means there was a format
998  * error in the directory index, and the caller should fall back to
999  * searching the directory normally.  The callers of dx_probe **MUST**
1000  * check for this error code, and make sure it never gets reflected
1001  * back to userspace.
1002  */
1003 static struct dx_frame *
dx_probe(struct ext2_icb * icb,struct dentry * dentry,struct inode * dir,struct dx_hash_info * hinfo,struct dx_frame * frame_in,int * err)1004             dx_probe(struct ext2_icb *icb, struct dentry *dentry, struct inode *dir,
1005                      struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err)
1006 {
1007     unsigned count, indirect;
1008     struct dx_entry *at, *entries, *p, *q, *m;
1009     struct dx_root *root;
1010     struct buffer_head *bh;
1011     struct dx_frame *frame = frame_in;
1012     u32 hash;
1013 
1014     frame->bh = NULL;
1015     if (dentry)
1016         dir = dentry->d_parent->d_inode;
1017     if (!(bh = ext3_bread (icb, dir, 0, err)))
1018         goto fail;
1019     root = (struct dx_root *) bh->b_data;
1020     if (root->info.hash_version != DX_HASH_TEA &&
1021             root->info.hash_version != DX_HASH_HALF_MD4 &&
1022             root->info.hash_version != DX_HASH_LEGACY) {
1023         ext3_warning(dir->i_sb, __FUNCTION__,
1024                      "Unrecognised inode hash code %d",
1025                      root->info.hash_version);
1026         __brelse(bh);
1027         *err = ERR_BAD_DX_DIR;
1028         goto fail;
1029     }
1030     hinfo->hash_version = root->info.hash_version;
1031     hinfo->seed = EXT3_SB(dir->i_sb)->s_hash_seed;
1032     if (dentry)
1033         ext3_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo);
1034     hash = hinfo->hash;
1035 
1036     if (root->info.unused_flags & 1) {
1037         ext3_warning(dir->i_sb, __FUNCTION__,
1038                      "Unimplemented inode hash flags: %#06x",
1039                      root->info.unused_flags);
1040         brelse(bh);
1041         *err = ERR_BAD_DX_DIR;
1042         goto fail;
1043     }
1044 
1045     if ((indirect = root->info.indirect_levels) > 1) {
1046         ext3_warning(dir->i_sb, __FUNCTION__,
1047                      "Unimplemented inode hash depth: %#06x",
1048                      root->info.indirect_levels);
1049         brelse(bh);
1050         *err = ERR_BAD_DX_DIR;
1051         goto fail;
1052     }
1053 
1054     entries = (struct dx_entry *) (((char *)&root->info) +
1055                                    root->info.info_length);
1056 
1057     if (dx_get_limit(entries) != dx_root_limit(dir,
1058             root->info.info_length)) {
1059         ext3_warning(dir->i_sb, __FUNCTION__,
1060                      "dx entry: limit != root limit");
1061         brelse(bh);
1062         *err = ERR_BAD_DX_DIR;
1063         goto fail;
1064     }
1065 
1066     dxtrace(printk("Look up %x", hash));
1067     while (1)
1068     {
1069         count = dx_get_count(entries);
1070         if (!count || count > dx_get_limit(entries)) {
1071             ext3_warning(dir->i_sb, __FUNCTION__,
1072                          "dx entry: no count or count > limit");
1073             brelse(bh);
1074             *err = ERR_BAD_DX_DIR;
1075             goto fail2;
1076         }
1077 
1078         p = entries + 1;
1079         q = entries + count - 1;
1080         while (p <= q)
1081         {
1082             m = p + (q - p)/2;
1083             if (dx_get_hash(m) > hash)
1084                 q = m - 1;
1085             else
1086                 p = m + 1;
1087         }
1088 
1089         if (0) // linear search cross check
1090         {
1091             unsigned n = count - 1;
1092             at = entries;
1093             while (n--)
1094             {
1095                 if (dx_get_hash(++at) > hash)
1096                 {
1097                     at--;
1098                     break;
1099                 }
1100             }
1101             ASSERT(at == p - 1);
1102         }
1103 
1104         at = p - 1;
1105         frame->bh = bh;
1106         frame->entries = entries;
1107         frame->at = at;
1108         if (!indirect--) return frame;
1109         if (!(bh = ext3_bread(icb, dir, dx_get_block(at), err)))
1110             goto fail2;
1111         at = entries = ((struct dx_node *) bh->b_data)->entries;
1112         if (dx_get_limit(entries) != dx_node_limit (dir)) {
1113             ext3_warning(dir->i_sb, __FUNCTION__,
1114                          "dx entry: limit != node limit");
1115             brelse(bh);
1116             *err = ERR_BAD_DX_DIR;
1117             goto fail2;
1118         }
1119         frame++;
1120         frame->bh = NULL;
1121     }
1122 fail2:
1123     while (frame >= frame_in) {
1124         brelse(frame->bh);
1125         frame--;
1126     }
1127 fail:
1128     if (*err == ERR_BAD_DX_DIR)
1129         ext3_warning(dir->i_sb, __FUNCTION__,
1130                      "Corrupt dir inode %ld, running e2fsck is "
1131                      "recommended.", dir->i_ino);
1132     return NULL;
1133 }
1134 
dx_release(struct dx_frame * frames)1135 static void dx_release (struct dx_frame *frames)
1136 {
1137     if (frames[0].bh == NULL)
1138         return;
1139 
1140     if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels)
1141         brelse(frames[1].bh);
1142     brelse(frames[0].bh);
1143 }
1144 
1145 /*
1146  * This function increments the frame pointer to search the next leaf
1147  * block, and reads in the necessary intervening nodes if the search
1148  * should be necessary.  Whether or not the search is necessary is
1149  * controlled by the hash parameter.  If the hash value is even, then
1150  * the search is only continued if the next block starts with that
1151  * hash value.  This is used if we are searching for a specific file.
1152  *
1153  * If the hash value is HASH_NB_ALWAYS, then always go to the next block.
1154  *
1155  * This function returns 1 if the caller should continue to search,
1156  * or 0 if it should not.  If there is an error reading one of the
1157  * index blocks, it will a negative error code.
1158  *
1159  * If start_hash is non-null, it will be filled in with the starting
1160  * hash of the next page.
1161  */
ext3_htree_next_block(struct ext2_icb * icb,struct inode * dir,__u32 hash,struct dx_frame * frame,struct dx_frame * frames,__u32 * start_hash)1162 int ext3_htree_next_block(struct ext2_icb *icb, struct inode *dir,
1163                           __u32 hash, struct dx_frame *frame,
1164                           struct dx_frame *frames, __u32 *start_hash)
1165 {
1166     struct dx_frame *p;
1167     struct buffer_head *bh;
1168     int err, num_frames = 0;
1169     __u32 bhash;
1170 
1171     p = frame;
1172     /*
1173      * Find the next leaf page by incrementing the frame pointer.
1174      * If we run out of entries in the interior node, loop around and
1175      * increment pointer in the parent node.  When we break out of
1176      * this loop, num_frames indicates the number of interior
1177      * nodes need to be read.
1178      */
1179     while (1) {
1180         if (++(p->at) < p->entries + dx_get_count(p->entries))
1181             break;
1182         if (p == frames)
1183             return 0;
1184         num_frames++;
1185         p--;
1186     }
1187 
1188     /*
1189      * If the hash is 1, then continue only if the next page has a
1190      * continuation hash of any value.  This is used for readdir
1191      * handling.  Otherwise, check to see if the hash matches the
1192      * desired contiuation hash.  If it doesn't, return since
1193      * there's no point to read in the successive index pages.
1194      */
1195     bhash = dx_get_hash(p->at);
1196     if (start_hash)
1197         *start_hash = bhash;
1198     if ((hash & 1) == 0) {
1199         if ((bhash & ~1) != hash)
1200             return 0;
1201     }
1202     /*
1203      * If the hash is HASH_NB_ALWAYS, we always go to the next
1204      * block so no check is necessary
1205      */
1206     while (num_frames--) {
1207         if (!(bh = ext3_bread(icb, dir, dx_get_block(p->at), &err)))
1208             return err; /* Failure */
1209         p++;
1210         brelse (p->bh);
1211         p->bh = bh;
1212         p->at = p->entries = ((struct dx_node *) bh->b_data)->entries;
1213     }
1214     return 1;
1215 }
1216 
1217 /*
1218  * This function fills a red-black tree with information from a
1219  * directory block.  It returns the number directory entries loaded
1220  * into the tree.  If there is an error it is returned in err.
1221  */
htree_dirblock_to_tree(struct ext2_icb * icb,struct file * dir_file,struct inode * dir,int block,struct dx_hash_info * hinfo,__u32 start_hash,__u32 start_minor_hash)1222 int htree_dirblock_to_tree(struct ext2_icb *icb, struct file *dir_file,
1223                            struct inode *dir, int block,
1224                            struct dx_hash_info *hinfo,
1225                            __u32 start_hash, __u32 start_minor_hash)
1226 {
1227     struct buffer_head *bh;
1228     struct ext3_dir_entry_2 *de, *top;
1229     int err, count = 0;
1230 
1231     dxtrace(printk("In htree dirblock_to_tree: block %d\n", block));
1232     if (!(bh = ext3_bread (icb, dir, block, &err)))
1233         return err;
1234 
1235     de = (struct ext3_dir_entry_2 *) bh->b_data;
1236     top = (struct ext3_dir_entry_2 *) ((char *) de +
1237                                        dir->i_sb->s_blocksize -
1238                                        EXT3_DIR_REC_LEN(0));
1239     for (; de < top; de = ext3_next_entry(de)) {
1240         if (!ext3_check_dir_entry("htree_dirblock_to_tree", dir, de, bh,
1241                                   ((unsigned long)block<<EXT3_BLOCK_SIZE_BITS(dir->i_sb))
1242                                   + (unsigned long)((char *)de - bh->b_data))) {
1243             /* On error, skip the f_pos to the next block. */
1244             dir_file->f_pos = (dir_file->f_pos |
1245                                (dir->i_sb->s_blocksize - 1)) + 1;
1246             brelse (bh);
1247             return count;
1248         }
1249         ext3_dirhash(de->name, de->name_len, hinfo);
1250         if ((hinfo->hash < start_hash) ||
1251                 ((hinfo->hash == start_hash) &&
1252                  (hinfo->minor_hash < start_minor_hash)))
1253             continue;
1254         if (de->inode == 0)
1255             continue;
1256         if ((err = ext3_htree_store_dirent(dir_file,
1257                                            hinfo->hash, hinfo->minor_hash, de)) != 0) {
1258             brelse(bh);
1259             return err;
1260         }
1261         count++;
1262     }
1263     brelse(bh);
1264     return count;
1265 }
1266 
1267 /*
1268  * This function fills a red-black tree with information from a
1269  * directory.  We start scanning the directory in hash order, starting
1270  * at start_hash and start_minor_hash.
1271  *
1272  * This function returns the number of entries inserted into the tree,
1273  * or a negative error code.
1274  */
ext3_htree_fill_tree(struct ext2_icb * icb,struct file * dir_file,__u32 start_hash,__u32 start_minor_hash,__u32 * next_hash)1275 int ext3_htree_fill_tree(struct ext2_icb *icb, struct file *dir_file,
1276                          __u32 start_hash, __u32 start_minor_hash,
1277                          __u32 *next_hash)
1278 {
1279     struct dx_hash_info hinfo;
1280     struct ext3_dir_entry_2 *de;
1281     struct dx_frame frames[2], *frame;
1282     int block, err = 0;
1283     struct inode *dir;
1284     int count = 0;
1285     int ret;
1286     __u32 hashval;
1287 
1288     dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash,
1289                    start_minor_hash));
1290     dir = dir_file->f_dentry->d_inode;
1291     if (!(EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) {
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);
1296         *next_hash = ~0;
1297         return count;
1298     }
1299 
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);
1303     if (!frame)
1304         return err;
1305 
1306     /* Add '.' and '..' from the htree header */
1307     if (!start_hash && !start_minor_hash) {
1308         de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data;
1309         if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0)
1310             goto errout;
1311         count++;
1312     }
1313     if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) {
1314         de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data;
1315         de = ext3_next_entry(de);
1316         if ((err = ext3_htree_store_dirent(dir_file, 2, 0, de)) != 0)
1317             goto errout;
1318         count++;
1319     }
1320 
1321     while (1) {
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);
1325         if (ret < 0) {
1326             err = ret;
1327             goto errout;
1328         }
1329         count += ret;
1330         hashval = ~0;
1331         ret = ext3_htree_next_block(icb, dir, HASH_NB_ALWAYS,
1332                                     frame, frames, &hashval);
1333         *next_hash = hashval;
1334         if (ret < 0) {
1335             err = ret;
1336             goto errout;
1337         }
1338         /*
1339          * Stop if:  (a) there are no more entries, or
1340          * (b) we have inserted at least one entry and the
1341          * next hash value is not a continuation
1342          */
1343         if ((ret == 0) ||
1344                 (count && ((hashval & 1) == 0)))
1345             break;
1346     }
1347     dx_release(frames);
1348     dxtrace(printk("Fill tree: returned %d entries, next hash: %x\n",
1349                    count, *next_hash));
1350     return count;
1351 errout:
1352     dx_release(frames);
1353 
1354     return (err);
1355 }
1356 
1357 
1358 /*
1359  * Directory block splitting, compacting
1360  */
1361 
1362 /*
1363  * Create map of hash values, offsets, and sizes, stored at end of block.
1364  * Returns number of entries mapped.
1365  */
dx_make_map(struct ext3_dir_entry_2 * de,int size,struct dx_hash_info * hinfo,struct dx_map_entry * map_tail)1366 static int dx_make_map (struct ext3_dir_entry_2 *de, int size,
1367                         struct dx_hash_info *hinfo, struct dx_map_entry *map_tail)
1368 {
1369     int count = 0;
1370     char *base = (char *) de;
1371     struct dx_hash_info h = *hinfo;
1372 
1373     while ((char *) de < base + size)
1374     {
1375         if (de->name_len && de->inode) {
1376             ext3_dirhash(de->name, de->name_len, &h);
1377             map_tail--;
1378             map_tail->hash = h.hash;
1379             map_tail->offs = (u16) ((char *) de - base);
1380             map_tail->size = le16_to_cpu(de->rec_len);
1381             count++;
1382             cond_resched();
1383         }
1384         /* XXX: do we need to check rec_len == 0 case? -Chris */
1385         de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
1386     }
1387     return count;
1388 }
1389 
1390 /* Sort map by hash value */
dx_sort_map(struct dx_map_entry * map,unsigned count)1391 static void dx_sort_map (struct dx_map_entry *map, unsigned count)
1392 {
1393     struct dx_map_entry *p, *q, *top = map + count - 1;
1394     int more;
1395     /* Combsort until bubble sort doesn't suck */
1396     while (count > 2)
1397     {
1398         count = count*10/13;
1399         if (count - 9 < 2) /* 9, 10 -> 11 */
1400             count = 11;
1401         for (p = top, q = p - count; q >= map; p--, q--)
1402             if (p->hash < q->hash)
1403                 swap(struct dx_map_entry, *p, *q);
1404     }
1405     /* Garden variety bubble sort */
1406     do {
1407         more = 0;
1408         q = top;
1409         while (q-- > map)
1410         {
1411             if (q[1].hash >= q[0].hash)
1412                 continue;
1413             swap(struct dx_map_entry, *(q+1), *q);
1414             more = 1;
1415         }
1416     } while (more);
1417 }
1418 
dx_insert_block(struct dx_frame * frame,u32 hash,u32 block)1419 static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block)
1420 {
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);
1424 
1425     ASSERT(count < dx_get_limit(entries));
1426     ASSERT(old < entries + count);
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);
1431 }
1432 
1433 struct buffer_head *
ext3_dx_find_entry(struct ext2_icb * icb,struct dentry * dentry,struct ext3_dir_entry_2 ** res_dir,int * err)1434             ext3_dx_find_entry(struct ext2_icb *icb, struct dentry *dentry,
1435                                struct ext3_dir_entry_2 **res_dir, int *err)
1436 {
1437     struct super_block * sb;
1438     struct dx_hash_info	hinfo = {0};
1439     u32 hash;
1440     struct dx_frame frames[2], *frame;
1441     struct ext3_dir_entry_2 *de, *top;
1442     struct buffer_head *bh;
1443     unsigned long block;
1444     int retval;
1445     int namelen = dentry->d_name.len;
1446     const __u8 *name = dentry->d_name.name;
1447     struct inode *dir = dentry->d_parent->d_inode;
1448 
1449     sb = dir->i_sb;
1450     /* NFS may look up ".." - look at dx_root directory block */
1451     if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')) {
1452         if (!(frame = dx_probe(icb, dentry, NULL, &hinfo, frames, err)))
1453             return NULL;
1454     } else {
1455         frame = frames;
1456         frame->bh = NULL;			/* for dx_release() */
1457         frame->at = (struct dx_entry *)frames;	/* hack for zero entry*/
1458         dx_set_block(frame->at, 0);		/* dx_root block is 0 */
1459     }
1460     hash = hinfo.hash;
1461     do {
1462         block = dx_get_block(frame->at);
1463         if (!(bh = ext3_bread (icb, dir, block, err)))
1464             goto errout;
1465         de = (struct ext3_dir_entry_2 *) bh->b_data;
1466         top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize -
1467                                            EXT3_DIR_REC_LEN(0));
1468         for (; de < top; de = ext3_next_entry(de))
1469             if (ext3_match (namelen, name, de)) {
1470                 if (!ext3_check_dir_entry("ext3_find_entry",
1471                                           dir, de, bh,
1472                                           (block<<EXT3_BLOCK_SIZE_BITS(sb))
1473                                           + (unsigned long)((char *)de - bh->b_data))) {
1474                     brelse (bh);
1475                     goto errout;
1476                 }
1477                 *res_dir = de;
1478                 dx_release (frames);
1479                 return bh;
1480             }
1481         brelse (bh);
1482         /* Check to see if we should continue to search */
1483         retval = ext3_htree_next_block(icb, dir, hash, frame,
1484                                        frames, NULL);
1485         if (retval < 0) {
1486             ext3_warning(sb, __FUNCTION__,
1487                          "error reading index page in directory #%lu",
1488                          dir->i_ino);
1489             *err = retval;
1490             goto errout;
1491         }
1492     } while (retval == 1);
1493 
1494     *err = -ENOENT;
1495 errout:
1496     dxtrace(printk("%s not found\n", name));
1497     dx_release (frames);
1498     return NULL;
1499 }
1500 
ext3_dx_readdir(struct file * filp,filldir_t filldir,void * context)1501 int ext3_dx_readdir(struct file *filp, filldir_t filldir,
1502                     void * context)
1503 {
1504     struct dir_private_info *info = filp->private_data;
1505     struct inode *inode = filp->f_dentry->d_inode;
1506     struct fname *fname;
1507     PEXT2_FILLDIR_CONTEXT fc = context;
1508     int	ret;
1509 
1510     if (!info) {
1511         info = create_dir_info(filp->f_pos);
1512         if (!info)
1513             return -ENOMEM;
1514         filp->private_data = info;
1515     }
1516 
1517     if (filp->f_pos == EXT3_HTREE_EOF)
1518         return 0;	/* EOF */
1519 
1520     /* Some one has messed with f_pos; reset the world */
1521     if (info->last_pos != filp->f_pos) {
1522         free_rb_tree_fname(&info->root);
1523         info->curr_node = NULL;
1524         info->extra_fname = NULL;
1525         info->curr_hash = (__u32)pos2maj_hash(filp->f_pos);
1526         info->curr_minor_hash = (__u32)pos2min_hash(filp->f_pos);
1527     }
1528 
1529     /*
1530      * If there are any leftover names on the hash collision
1531      * chain, return them first.
1532      */
1533     if (info->extra_fname) {
1534         if (call_filldir(filp, context, filldir, info->extra_fname))
1535             goto finished;
1536         info->extra_fname = NULL;
1537         goto next_node;
1538     } else if (!info->curr_node)
1539         info->curr_node = rb_first(&info->root);
1540 
1541     while (1) {
1542         /*
1543          * Fill the rbtree if we have no more entries,
1544          * or the inode has changed since we last read in the
1545          * cached entries.
1546          */
1547         if ((!info->curr_node) ||
1548                 (filp->f_version != inode->i_version)) {
1549             info->curr_node = NULL;
1550             free_rb_tree_fname(&info->root);
1551             filp->f_version = inode->i_version;
1552             ret = ext3_htree_fill_tree(fc->efc_irp, filp, info->curr_hash,
1553                                        info->curr_minor_hash, &info->next_hash);
1554             if (ret < 0)
1555                 return ret;
1556             if (ret == 0) {
1557                 filp->f_pos = EXT3_HTREE_EOF;
1558                 break;
1559             }
1560             info->curr_node = rb_first(&info->root);
1561         }
1562 
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))
1567             break;
1568 next_node:
1569         info->curr_node = rb_next(info->curr_node);
1570         if (info->curr_node) {
1571             fname = rb_entry(info->curr_node, struct fname,
1572                              rb_hash);
1573             info->curr_hash = fname->hash;
1574             info->curr_minor_hash = fname->minor_hash;
1575         } else {
1576             if (info->next_hash == ~0) {
1577                 filp->f_pos = EXT3_HTREE_EOF;
1578                 break;
1579             }
1580             info->curr_hash = info->next_hash;
1581             info->curr_minor_hash = 0;
1582         }
1583     }
1584 finished:
1585     info->last_pos = filp->f_pos;
1586     return 0;
1587 }
1588 
ext3_release_dir(struct inode * inode,struct file * filp)1589 int ext3_release_dir (struct inode * inode, struct file * filp)
1590 {
1591     if (filp->private_data) {
1592         ext3_htree_free_dir_info(filp->private_data);
1593         filp->private_data = NULL;
1594     }
1595 
1596     return 0;
1597 }
1598 
1599 /* FIXME: Inspect the clang-cl code path */
1600 #if defined(__REACTOS__) && defined(__clang__)
1601 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);
1602 #endif
1603 
1604 /*
1605  * Returns 0 for success, or a negative error value
1606  */
ext3_dx_add_entry(struct ext2_icb * icb,struct dentry * dentry,struct inode * inode)1607 int ext3_dx_add_entry(struct ext2_icb *icb, struct dentry *dentry,
1608                       struct inode *inode)
1609 {
1610     struct dx_frame frames[2], *frame;
1611     struct dx_entry *entries, *at;
1612     struct dx_hash_info hinfo;
1613     struct buffer_head * bh;
1614     struct inode *dir = dentry->d_parent->d_inode;
1615     struct super_block * sb = dir->i_sb;
1616     struct ext3_dir_entry_2 *de;
1617     int err;
1618 
1619     frame = dx_probe(icb, dentry, NULL, &hinfo, frames, &err);
1620     if (!frame)
1621         return err;
1622     entries = frame->entries;
1623     at = frame->at;
1624 
1625     if (!(bh = ext3_bread(icb, dir, dx_get_block(frame->at), &err)))
1626         goto cleanup;
1627 
1628     err = add_dirent_to_buf(icb, dentry, inode, NULL, bh);
1629     if (err != -ENOSPC) {
1630         bh = NULL;
1631         goto cleanup;
1632     }
1633 
1634     /* Block full, should compress but for now just split */
1635     dxtrace(printk("using %u of %u node entries\n",
1636                    dx_get_count(entries), dx_get_limit(entries)));
1637     /* Need to split index? */
1638     if (dx_get_count(entries) == dx_get_limit(entries)) {
1639         u32 newblock;
1640         unsigned icount = dx_get_count(entries);
1641         int levels = (int)(frame - frames);
1642         struct dx_entry *entries2;
1643         struct dx_node *node2;
1644         struct buffer_head *bh2;
1645 
1646         if (levels && (dx_get_count(frames->entries) ==
1647                        dx_get_limit(frames->entries))) {
1648             ext3_warning(sb, __FUNCTION__,
1649                          "Directory index full!");
1650             err = -ENOSPC;
1651             goto cleanup;
1652         }
1653         bh2 = ext3_append (icb, dir, &newblock, &err);
1654         if (!(bh2))
1655             goto cleanup;
1656         node2 = (struct dx_node *)(bh2->b_data);
1657         entries2 = node2->entries;
1658         node2->fake.rec_len = cpu_to_le16(sb->s_blocksize);
1659         node2->fake.inode = 0;
1660 
1661         if (levels) {
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));
1665 
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));
1671 
1672             /* Which index block gets the new entry? */
1673             if ((unsigned int)(at - entries) >= icount1) {
1674                 frame->at = at = at - entries - icount1 + entries2;
1675                 frame->entries = entries = entries2;
1676                 swap(struct buffer_head *, frame->bh, bh2);
1677             }
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);
1683             brelse (bh2);
1684         } else {
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));
1689 
1690             /* Set up root */
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;
1694 
1695             /* Add new access path frame */
1696             frame = frames + 1;
1697             frame->at = at = at - entries + entries2;
1698             frame->entries = entries = entries2;
1699             frame->bh = bh2;
1700         }
1701         // ext3_journal_dirty_metadata(handle, frames[0].bh);
1702         set_buffer_dirty(frames[0].bh);
1703     }
1704     de = do_split(icb, dir, &bh, frame, &hinfo, &err);
1705     if (!de)
1706         goto cleanup;
1707     err = add_dirent_to_buf(icb, dentry, inode, de, bh);
1708     bh = NULL;
1709     goto cleanup;
1710 
1711 cleanup:
1712     if (bh)
1713         brelse(bh);
1714     dx_release(frames);
1715     return err;
1716 }
1717 
1718 /*
1719  * Move count entries from end of map between two memory locations.
1720  * Returns pointer to last entry moved.
1721  */
1722 struct ext3_dir_entry_2 *
dx_move_dirents(char * from,char * to,struct dx_map_entry * map,int count)1723             dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count)
1724 {
1725     unsigned rec_len = 0;
1726 
1727     while (count--) {
1728         struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs);
1729         rec_len = EXT3_DIR_REC_LEN(de->name_len);
1730         memcpy (to, de, rec_len);
1731         ((struct ext3_dir_entry_2 *) to)->rec_len =
1732             cpu_to_le16(rec_len);
1733         de->inode = 0;
1734         map++;
1735         to += rec_len;
1736     }
1737     return (struct ext3_dir_entry_2 *) (to - rec_len);
1738 }
1739 
1740 /*
1741  * Compact each dir entry in the range to the minimal rec_len.
1742  * Returns pointer to last entry in range.
1743  */
dx_pack_dirents(char * base,int size)1744 struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size)
1745 {
1746     struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base;
1747     unsigned rec_len = 0;
1748 
1749     prev = to = de;
1750     while ((char*)de < base + size) {
1751         next = (struct ext3_dir_entry_2 *) ((char *) de +
1752                                             le16_to_cpu(de->rec_len));
1753         if (de->inode && de->name_len) {
1754             rec_len = EXT3_DIR_REC_LEN(de->name_len);
1755             if (de > to)
1756                 memmove(to, de, rec_len);
1757             to->rec_len = cpu_to_le16(rec_len);
1758             prev = to;
1759             to = (struct ext3_dir_entry_2 *) (((char *) to) + rec_len);
1760         }
1761         de = next;
1762     }
1763     return prev;
1764 }
1765 
1766 /*
1767  * Split a full leaf block to make room for a new dir entry.
1768  * Allocate a new block, and move entries so that they are approx. equally full.
1769  * Returns pointer to de in block into which the new entry will be inserted.
1770  */
1771 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)1772             do_split(struct ext2_icb *icb, struct inode *dir,
1773                      struct buffer_head **bh,struct dx_frame *frame,
1774                      struct dx_hash_info *hinfo, int *error)
1775 {
1776     unsigned blocksize = dir->i_sb->s_blocksize;
1777     unsigned count, continued;
1778     struct buffer_head *bh2;
1779     u32 newblock;
1780     u32 hash2;
1781     struct dx_map_entry *map;
1782     char *data1 = (*bh)->b_data, *data2;
1783     unsigned split, move, size;
1784     struct ext3_dir_entry_2 *de = NULL, *de2;
1785     int	err, i;
1786 
1787     bh2 = ext3_append (icb, dir, &newblock, error);
1788     if (!(bh2)) {
1789         brelse(*bh);
1790         *bh = NULL;
1791         goto errout;
1792     }
1793 
1794     data2 = bh2->b_data;
1795 
1796     /* create map in the end of data2 block */
1797     map = (struct dx_map_entry *) (data2 + blocksize);
1798     count = dx_make_map ((struct ext3_dir_entry_2 *) data1,
1799                          blocksize, hinfo, map);
1800     map -= count;
1801     dx_sort_map (map, count);
1802     /* Split the existing block in the middle, size-wise */
1803     size = 0;
1804     move = 0;
1805     for (i = count-1; i >= 0; i--) {
1806         /* is more than half of this entry in 2nd half of the block? */
1807         if (size + map[i].size/2 > blocksize/2)
1808             break;
1809         size += map[i].size;
1810         move++;
1811     }
1812     /* map index at which we will split */
1813     split = count - move;
1814     hash2 = map[split].hash;
1815     continued = hash2 == map[split - 1].hash;
1816     dxtrace(printk("Split block %i at %x, %i/%i\n",
1817                    dx_get_block(frame->at), hash2, split, count-split));
1818 
1819     /* Fancy dance to stay within two buffers */
1820     de2 = dx_move_dirents(data1, data2, map + split, count - split);
1821     de = dx_pack_dirents(data1,blocksize);
1822     de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de);
1823     de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2);
1824     dxtrace(dx_show_leaf (icb, hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1));
1825     dxtrace(dx_show_leaf (icb, hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1));
1826 
1827     /* Which block gets the new entry? */
1828     if (hinfo->hash >= hash2)
1829     {
1830         swap(struct buffer_head *, *bh, bh2);
1831         de = de2;
1832     }
1833     dx_insert_block (frame, hash2 + continued, newblock);
1834     set_buffer_dirty(bh2);
1835     set_buffer_dirty(frame->bh);
1836 
1837     brelse (bh2);
1838     dxtrace(dx_show_index ("frame", frame->entries));
1839 errout:
1840     return de;
1841 }
1842 
1843 /*
1844  * This converts a one block unindexed directory to a 3 block indexed
1845  * directory, and adds the dentry to the indexed directory.
1846  */
make_indexed_dir(struct ext2_icb * icb,struct dentry * dentry,struct inode * inode,struct buffer_head * bh)1847 int make_indexed_dir(struct ext2_icb *icb, struct dentry *dentry,
1848                      struct inode *inode, struct buffer_head *bh)
1849 {
1850     struct inode	*dir = dentry->d_parent->d_inode;
1851     const char	*name = dentry->d_name.name;
1852     int		namelen = dentry->d_name.len;
1853     struct buffer_head *bh2;
1854     struct dx_root	*root;
1855     struct dx_frame	frames[2], *frame;
1856     struct dx_entry *entries;
1857     struct ext3_dir_entry_2	*de, *de2;
1858     char		*data1, *top;
1859     unsigned	len;
1860     int		retval;
1861     unsigned	blocksize;
1862     struct dx_hash_info hinfo;
1863     ext3_lblk_t  block;
1864     struct fake_dirent *fde;
1865 
1866     blocksize =  dir->i_sb->s_blocksize;
1867     dxtrace(printk("Creating index: inode %lu\n", dir->i_ino));
1868 
1869     root = (struct dx_root *) bh->b_data;
1870 
1871     /* The 0th block becomes the root, move the dirents out */
1872     fde = &root->dotdot;
1873     de = (struct ext3_dir_entry_2 *)((char *)fde +
1874                                      ext3_rec_len_from_disk(fde->rec_len));
1875     if ((char *) de >= (((char *) root) + blocksize)) {
1876         DEBUG(DL_ERR, ( "%s: invalid rec_len for '..' in inode %lu", __FUNCTION__,
1877                        dir->i_ino));
1878         brelse(bh);
1879         return -EIO;
1880     }
1881     len = (unsigned int)((char *) root + blocksize - (char *) de);
1882 
1883     /* Allocate new block for the 0th block's dirents */
1884     bh2 = ext3_append(icb, dir, &block, &retval);
1885     if (!(bh2)) {
1886         brelse(bh);
1887         return retval;
1888     }
1889     EXT3_I(dir)->i_flags |= EXT3_INDEX_FL;
1890     data1 = bh2->b_data;
1891 
1892     memcpy (data1, de, len);
1893     de = (struct ext3_dir_entry_2 *) data1;
1894     top = data1 + len;
1895     while ((char *)(de2 = ext3_next_entry(de)) < top)
1896         de = de2;
1897     de->rec_len = ext3_rec_len_to_disk(blocksize + (__u32)(data1 - (char *)de));
1898     /* Initialize the root; the dot dirents already exist */
1899     de = (struct ext3_dir_entry_2 *) (&root->dotdot);
1900     de->rec_len = ext3_rec_len_to_disk(blocksize - EXT3_DIR_REC_LEN(2));
1901     memset (&root->info, 0, sizeof(root->info));
1902     root->info.info_length = sizeof(root->info);
1903     root->info.hash_version = (__u8)(EXT3_SB(dir->i_sb)->s_def_hash_version);
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)));
1908 
1909     /* Initialize as for dx_probe */
1910     hinfo.hash_version = root->info.hash_version;
1911     hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed;
1912     ext3_dirhash(name, namelen, &hinfo);
1913     frame = frames;
1914     frame->entries = entries;
1915     frame->at = entries;
1916     frame->bh = bh;
1917     bh = bh2;
1918     /* bh and bh2 are to be marked as dirty in do_split */
1919     de = do_split(icb, dir, &bh, frame, &hinfo, &retval);
1920     dx_release (frames);
1921     if (!(de))
1922         return retval;
1923 
1924     return add_dirent_to_buf(icb, dentry, inode, de, bh);
1925 }
1926 
1927 #else /* EXT2_HTREE_INDEX */
1928 
ext3_release_dir(struct inode * inode,struct file * filp)1929 int ext3_release_dir (struct inode * inode, struct file * filp)
1930 {
1931     return 0;
1932 }
1933 
1934 #endif /* !EXT2_HTREE_INDEX */
1935 
1936 /*
1937  *	ext3_add_entry()
1938  *
1939  * adds a file entry to the specified directory, using the same
1940  * semantics as ext3_find_entry(). It returns NULL if it failed.
1941  *
1942  * NOTE!! The inode part of 'de' is left at 0 - which means you
1943  * may not sleep between calling this and putting something into
1944  * the entry, as someone else might have used it while you slept.
1945  */
ext3_add_entry(struct ext2_icb * icb,struct dentry * dentry,struct inode * inode)1946 int ext3_add_entry(struct ext2_icb *icb, struct dentry *dentry, struct inode *inode)
1947 {
1948     struct inode *dir = dentry->d_parent->d_inode;
1949     struct buffer_head *bh;
1950     struct ext3_dir_entry_2 *de;
1951     struct super_block *sb;
1952     int	retval;
1953 #ifdef EXT2_HTREE_INDEX
1954     int	dx_fallback=0;
1955 #endif
1956     unsigned blocksize;
1957     ext3_lblk_t block, blocks;
1958 
1959     sb = dir->i_sb;
1960     blocksize = sb->s_blocksize;
1961     if (!dentry->d_name.len)
1962         return -EINVAL;
1963 
1964 #ifdef EXT2_HTREE_INDEX
1965     if (is_dx(dir)) {
1966         retval = ext3_dx_add_entry(icb, dentry, inode);
1967         if (!retval || (retval != ERR_BAD_DX_DIR))
1968             return retval;
1969         EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL;
1970         dx_fallback++;
1971         ext3_save_inode(icb, dir);
1972     }
1973 #endif
1974 
1975     blocks = (ext3_lblk_t)(dir->i_size >> sb->s_blocksize_bits);
1976     for (block = 0; block < blocks; block++) {
1977         bh = ext3_bread(icb, dir, block, &retval);
1978         if (!bh)
1979             return retval;
1980         retval = add_dirent_to_buf(icb, dentry, inode, NULL, bh);
1981         if (retval != -ENOSPC)
1982             return retval;
1983 
1984 #ifdef EXT2_HTREE_INDEX
1985         if (blocks == 1 && !dx_fallback &&
1986                 EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX))
1987             return make_indexed_dir(icb, dentry, inode, bh);
1988 #endif
1989 
1990         brelse(bh);
1991     }
1992     bh = ext3_append(icb, dir, &block, &retval);
1993     if (!bh)
1994         return retval;
1995     de = (struct ext3_dir_entry_2 *) bh->b_data;
1996     de->inode = 0;
1997     de->rec_len = ext3_rec_len_to_disk(blocksize);
1998     return add_dirent_to_buf(icb, dentry, inode, de, bh);
1999 }
2000 
2001 /*
2002  * ext3_delete_entry deletes a directory entry by merging it with the
2003  * previous entry
2004  */
ext3_delete_entry(struct ext2_icb * icb,struct inode * dir,struct ext3_dir_entry_2 * de_del,struct buffer_head * bh)2005 int ext3_delete_entry(struct ext2_icb *icb, struct inode *dir,
2006                       struct ext3_dir_entry_2 *de_del,
2007                       struct buffer_head *bh)
2008 {
2009     struct ext3_dir_entry_2 *de, *pde = NULL;
2010     size_t i = 0;
2011 
2012     de = (struct ext3_dir_entry_2 *) bh->b_data;
2013     while (i < bh->b_size) {
2014         if (!ext3_check_dir_entry("ext3_delete_entry", dir, de, bh, i))
2015             return -EIO;
2016         if (de == de_del)  {
2017             if (pde)
2018                 pde->rec_len = ext3_rec_len_to_disk(
2019                                    ext3_rec_len_from_disk(pde->rec_len) +
2020                                    ext3_rec_len_from_disk(de->rec_len));
2021             else
2022                 de->inode = 0;
2023             dir->i_version++;
2024             /* ext3_journal_dirty_metadata(handle, bh); */
2025             set_buffer_dirty(bh);
2026             return 0;
2027         }
2028         i += ext3_rec_len_from_disk(de->rec_len);
2029         pde = de;
2030         de = ext3_next_entry(de);
2031     }
2032     return -ENOENT;
2033 }
2034 
2035 /*
2036  * routine to check that the specified directory is empty (for rmdir)
2037  */
ext3_is_dir_empty(struct ext2_icb * icb,struct inode * inode)2038 int ext3_is_dir_empty(struct ext2_icb *icb, struct inode *inode)
2039 {
2040     unsigned int offset;
2041     struct buffer_head *bh;
2042     struct ext3_dir_entry_2 *de, *de1;
2043     struct super_block *sb;
2044     int err = 0;
2045 
2046     sb = inode->i_sb;
2047     if (inode->i_size < EXT3_DIR_REC_LEN(1) + EXT3_DIR_REC_LEN(2) ||
2048             !(bh = ext3_bread(icb, inode, 0, &err))) {
2049         if (err)
2050             ext3_error(inode->i_sb, __FUNCTION__,
2051                        "error %d reading directory #%lu offset 0",
2052                        err, inode->i_ino);
2053         else
2054             ext3_warning(inode->i_sb, __FUNCTION__,
2055                          "bad directory (dir #%lu) - no data block",
2056                          inode->i_ino);
2057         return 1;
2058     }
2059     de = (struct ext3_dir_entry_2 *) bh->b_data;
2060     de1 = ext3_next_entry(de);
2061     if (le32_to_cpu(de->inode) != inode->i_ino ||
2062             !le32_to_cpu(de1->inode) ||
2063             strcmp(".", de->name) ||
2064             strcmp("..", de1->name)) {
2065         ext3_warning(inode->i_sb, "empty_dir",
2066                      "bad directory (dir #%lu) - no `.' or `..'",
2067                      inode->i_ino);
2068         brelse(bh);
2069         return 1;
2070     }
2071     offset = ext3_rec_len_from_disk(de->rec_len) +
2072              ext3_rec_len_from_disk(de1->rec_len);
2073     de = ext3_next_entry(de1);
2074     while (offset < inode->i_size) {
2075         if (!bh ||
2076                 (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) {
2077             err = 0;
2078             brelse(bh);
2079             bh = ext3_bread(icb, inode, offset >> EXT3_BLOCK_SIZE_BITS(sb), &err);
2080             if (!bh) {
2081                 if (err)
2082                     ext3_error(sb, __FUNCTION__, "error %d reading directory"
2083                                " #%lu offset %u", err, inode->i_ino, offset);
2084                 offset += sb->s_blocksize;
2085                 continue;
2086             }
2087             de = (struct ext3_dir_entry_2 *) bh->b_data;
2088         }
2089         if (!ext3_check_dir_entry("empty_dir", inode, de, bh, offset)) {
2090             de = (struct ext3_dir_entry_2 *)(bh->b_data +
2091                                              sb->s_blocksize);
2092             offset = (offset | (sb->s_blocksize - 1)) + 1;
2093             continue;
2094         }
2095         if (le32_to_cpu(de->inode)) {
2096             brelse(bh);
2097             return 0;
2098         }
2099         offset += ext3_rec_len_from_disk(de->rec_len);
2100         de = ext3_next_entry(de);
2101     }
2102     brelse(bh);
2103     return 1;
2104 }
2105 
2106 /*
2107  * Returns 0 if not found, -1 on failure, and 1 on success
2108  */
search_dirblock(struct buffer_head * bh,struct inode * dir,struct dentry * dentry,unsigned long offset,struct ext3_dir_entry_2 ** res_dir)2109 static inline int search_dirblock(struct buffer_head * bh,
2110                                   struct inode *dir,
2111                                   struct dentry *dentry,
2112                                   unsigned long offset,
2113                                   struct ext3_dir_entry_2 ** res_dir)
2114 {
2115     struct ext3_dir_entry_2 * de;
2116     char * dlimit;
2117     int de_len;
2118     const char *name = dentry->d_name.name;
2119     int namelen = dentry->d_name.len;
2120 
2121     de = (struct ext3_dir_entry_2 *) bh->b_data;
2122     dlimit = bh->b_data + dir->i_sb->s_blocksize;
2123     while ((char *) de < dlimit) {
2124         /* this code is executed quadratically often */
2125         /* do minimal checking `by hand' */
2126 
2127         if ((char *) de + namelen <= dlimit &&
2128                 ext3_match (namelen, name, de)) {
2129             /* found a match - just to be sure, do a full check */
2130             if (!ext3_check_dir_entry("ext3_find_entry",
2131                                       dir, de, bh, offset))
2132                 return -1;
2133             *res_dir = de;
2134             return 1;
2135         }
2136         /* prevent looping on a bad block */
2137         de_len = ext3_rec_len_from_disk(de->rec_len);
2138 
2139         if (de_len <= 0)
2140             return -1;
2141         offset += de_len;
2142         de = (struct ext3_dir_entry_2 *) ((char *) de + de_len);
2143     }
2144     return 0;
2145 }
2146 
2147 /*
2148  * define how far ahead to read directories while searching them.
2149  */
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))
2154 
2155 /*
2156  *	ext4_find_entry()
2157  *
2158  * finds an entry in the specified directory with the wanted name. It
2159  * returns the cache buffer in which the entry was found, and the entry
2160  * itself (as a parameter - res_dir). It does NOT read the inode of the
2161  * entry - you'll have to do that yourself if you want to.
2162  *
2163  * The returned buffer_head has ->b_count elevated.  The caller is expected
2164  * to brelse() it when appropriate.
2165  */
ext3_find_entry(struct ext2_icb * icb,struct dentry * dentry,struct ext3_dir_entry_2 ** res_dir)2166 struct buffer_head * ext3_find_entry (struct ext2_icb *icb,
2167                                                   struct dentry *dentry,
2168                                                   struct ext3_dir_entry_2 ** res_dir)
2169 {
2170     struct inode *dir = dentry->d_parent->d_inode;
2171     struct super_block *sb = dir->i_sb;
2172     struct buffer_head *bh_use[NAMEI_RA_SIZE];
2173     struct buffer_head *bh, *ret = NULL;
2174     ext3_lblk_t start, block, b;
2175     int ra_max = 0;		/* Number of bh's in the readahead
2176 				   buffer, bh_use[] */
2177     int ra_ptr = 0;		/* Current index into readahead
2178 				   buffer */
2179     int num = 0;
2180     ext3_lblk_t  nblocks;
2181     int i, err;
2182     int namelen = dentry->d_name.len;
2183 
2184     *res_dir = NULL;
2185     if (namelen > EXT3_NAME_LEN)
2186         return NULL;
2187 
2188 #ifdef EXT2_HTREE_INDEX
2189     if (icb->MajorFunction != IRP_MJ_CREATE && is_dx(dir)) {
2190         bh = ext3_dx_find_entry(icb, dentry, res_dir, &err);
2191         /*
2192          * On success, or if the error was file not found,
2193          * return.  Otherwise, fall back to doing a search the
2194          * old fashioned way.
2195          */
2196         if (bh || (err != ERR_BAD_DX_DIR))
2197             return bh;
2198         dxtrace(printk("ext4_find_entry: dx failed, "
2199                        "falling back\n"));
2200     }
2201 #endif
2202 
2203     nblocks = (ext3_lblk_t)(dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb));
2204     start = 0;
2205     block = start;
2206 restart:
2207     do {
2208         /*
2209          * We deal with the read-ahead logic here.
2210          */
2211         if (ra_ptr >= ra_max) {
2212             /* Refill the readahead buffer */
2213             ra_ptr = 0;
2214             b = block;
2215             for (ra_max = 0; ra_max < NAMEI_RA_SIZE; ra_max++) {
2216                 /*
2217                  * Terminate if we reach the end of the
2218                  * directory and must wrap, or if our
2219                  * search has finished at this block.
2220                  */
2221                 if (b >= nblocks || (num && block == start)) {
2222                     bh_use[ra_max] = NULL;
2223                     break;
2224                 }
2225                 num++;
2226                 bh = ext3_bread(icb, dir, b++, &err);
2227                 bh_use[ra_max] = bh;
2228             }
2229         }
2230         if ((bh = bh_use[ra_ptr++]) == NULL)
2231             goto next;
2232         wait_on_buffer(bh);
2233         if (!buffer_uptodate(bh)) {
2234             /* read error, skip block & hope for the best */
2235             ext3_error(sb, __FUNCTION__, "reading directory #%lu "
2236                        "offset %lu", dir->i_ino,
2237                        (unsigned long)block);
2238             brelse(bh);
2239             goto next;
2240         }
2241         i = search_dirblock(bh, dir, dentry,
2242                             block << EXT3_BLOCK_SIZE_BITS(sb), res_dir);
2243         if (i == 1) {
2244             ret = bh;
2245             goto cleanup_and_exit;
2246         } else {
2247             brelse(bh);
2248             if (i < 0)
2249                 goto cleanup_and_exit;
2250         }
2251 next:
2252         if (++block >= nblocks)
2253             block = 0;
2254     } while (block != start);
2255 
2256     /*
2257      * If the directory has grown while we were searching, then
2258      * search the last part of the directory before giving up.
2259      */
2260     block = nblocks;
2261     nblocks = (ext3_lblk_t)(dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb));
2262     if (block < nblocks) {
2263         start = 0;
2264         goto restart;
2265     }
2266 
2267 cleanup_and_exit:
2268     /* Clean up the read-ahead blocks */
2269     for (; ra_ptr < ra_max; ra_ptr++)
2270         brelse(bh_use[ra_ptr]);
2271     return ret;
2272 }
2273