aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/namei.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/namei.c')
-rw-r--r--fs/ext4/namei.c830
1 files changed, 415 insertions, 415 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 906731a20f1a..956b38113f62 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/fs/ext3/namei.c 2 * linux/fs/ext4/namei.c
3 * 3 *
4 * Copyright (C) 1992, 1993, 1994, 1995 4 * Copyright (C) 1992, 1993, 1994, 1995
5 * Remy Card (card@masi.ibp.fr) 5 * Remy Card (card@masi.ibp.fr)
@@ -28,8 +28,8 @@
28#include <linux/pagemap.h> 28#include <linux/pagemap.h>
29#include <linux/jbd.h> 29#include <linux/jbd.h>
30#include <linux/time.h> 30#include <linux/time.h>
31#include <linux/ext3_fs.h> 31#include <linux/ext4_fs.h>
32#include <linux/ext3_jbd.h> 32#include <linux/ext4_jbd.h>
33#include <linux/fcntl.h> 33#include <linux/fcntl.h>
34#include <linux/stat.h> 34#include <linux/stat.h>
35#include <linux/string.h> 35#include <linux/string.h>
@@ -50,7 +50,7 @@
50#define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) 50#define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
51#define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) 51#define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b))
52 52
53static struct buffer_head *ext3_append(handle_t *handle, 53static struct buffer_head *ext4_append(handle_t *handle,
54 struct inode *inode, 54 struct inode *inode,
55 u32 *block, int *err) 55 u32 *block, int *err)
56{ 56{
@@ -58,10 +58,10 @@ static struct buffer_head *ext3_append(handle_t *handle,
58 58
59 *block = inode->i_size >> inode->i_sb->s_blocksize_bits; 59 *block = inode->i_size >> inode->i_sb->s_blocksize_bits;
60 60
61 if ((bh = ext3_bread(handle, inode, *block, 1, err))) { 61 if ((bh = ext4_bread(handle, inode, *block, 1, err))) {
62 inode->i_size += inode->i_sb->s_blocksize; 62 inode->i_size += inode->i_sb->s_blocksize;
63 EXT3_I(inode)->i_disksize = inode->i_size; 63 EXT4_I(inode)->i_disksize = inode->i_size;
64 ext3_journal_get_write_access(handle,bh); 64 ext4_journal_get_write_access(handle,bh);
65 } 65 }
66 return bh; 66 return bh;
67} 67}
@@ -144,7 +144,7 @@ struct dx_map_entry
144 u32 offs; 144 u32 offs;
145}; 145};
146 146
147#ifdef CONFIG_EXT3_INDEX 147#ifdef CONFIG_EXT4_INDEX
148static inline unsigned dx_get_block (struct dx_entry *entry); 148static inline unsigned dx_get_block (struct dx_entry *entry);
149static void dx_set_block (struct dx_entry *entry, unsigned value); 149static void dx_set_block (struct dx_entry *entry, unsigned value);
150static inline unsigned dx_get_hash (struct dx_entry *entry); 150static inline unsigned dx_get_hash (struct dx_entry *entry);
@@ -161,20 +161,20 @@ static struct dx_frame *dx_probe(struct dentry *dentry,
161 struct dx_frame *frame, 161 struct dx_frame *frame,
162 int *err); 162 int *err);
163static void dx_release (struct dx_frame *frames); 163static void dx_release (struct dx_frame *frames);
164static int dx_make_map (struct ext3_dir_entry_2 *de, int size, 164static int dx_make_map (struct ext4_dir_entry_2 *de, int size,
165 struct dx_hash_info *hinfo, struct dx_map_entry map[]); 165 struct dx_hash_info *hinfo, struct dx_map_entry map[]);
166static void dx_sort_map(struct dx_map_entry *map, unsigned count); 166static void dx_sort_map(struct dx_map_entry *map, unsigned count);
167static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, 167static struct ext4_dir_entry_2 *dx_move_dirents (char *from, char *to,
168 struct dx_map_entry *offsets, int count); 168 struct dx_map_entry *offsets, int count);
169static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); 169static struct ext4_dir_entry_2* dx_pack_dirents (char *base, int size);
170static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); 170static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block);
171static int ext3_htree_next_block(struct inode *dir, __u32 hash, 171static int ext4_htree_next_block(struct inode *dir, __u32 hash,
172 struct dx_frame *frame, 172 struct dx_frame *frame,
173 struct dx_frame *frames, 173 struct dx_frame *frames,
174 __u32 *start_hash); 174 __u32 *start_hash);
175static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, 175static struct buffer_head * ext4_dx_find_entry(struct dentry *dentry,
176 struct ext3_dir_entry_2 **res_dir, int *err); 176 struct ext4_dir_entry_2 **res_dir, int *err);
177static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, 177static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
178 struct inode *inode); 178 struct inode *inode);
179 179
180/* 180/*
@@ -224,14 +224,14 @@ static inline void dx_set_limit (struct dx_entry *entries, unsigned value)
224 224
225static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) 225static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize)
226{ 226{
227 unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - 227 unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(1) -
228 EXT3_DIR_REC_LEN(2) - infosize; 228 EXT4_DIR_REC_LEN(2) - infosize;
229 return 0? 20: entry_space / sizeof(struct dx_entry); 229 return 0? 20: entry_space / sizeof(struct dx_entry);
230} 230}
231 231
232static inline unsigned dx_node_limit (struct inode *dir) 232static inline unsigned dx_node_limit (struct inode *dir)
233{ 233{
234 unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); 234 unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(0);
235 return 0? 22: entry_space / sizeof(struct dx_entry); 235 return 0? 22: entry_space / sizeof(struct dx_entry);
236} 236}
237 237
@@ -257,7 +257,7 @@ struct stats
257 unsigned bcount; 257 unsigned bcount;
258}; 258};
259 259
260static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, 260static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext4_dir_entry_2 *de,
261 int size, int show_names) 261 int size, int show_names)
262{ 262{
263 unsigned names = 0, space = 0; 263 unsigned names = 0, space = 0;
@@ -274,14 +274,14 @@ static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_ent
274 int len = de->name_len; 274 int len = de->name_len;
275 char *name = de->name; 275 char *name = de->name;
276 while (len--) printk("%c", *name++); 276 while (len--) printk("%c", *name++);
277 ext3fs_dirhash(de->name, de->name_len, &h); 277 ext4fs_dirhash(de->name, de->name_len, &h);
278 printk(":%x.%u ", h.hash, 278 printk(":%x.%u ", h.hash,
279 ((char *) de - base)); 279 ((char *) de - base));
280 } 280 }
281 space += EXT3_DIR_REC_LEN(de->name_len); 281 space += EXT4_DIR_REC_LEN(de->name_len);
282 names++; 282 names++;
283 } 283 }
284 de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); 284 de = (struct ext4_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
285 } 285 }
286 printk("(%i)\n", names); 286 printk("(%i)\n", names);
287 return (struct stats) { names, space, 1 }; 287 return (struct stats) { names, space, 1 };
@@ -302,10 +302,10 @@ struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir,
302 u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; 302 u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash;
303 struct stats stats; 303 struct stats stats;
304 printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); 304 printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range);
305 if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; 305 if (!(bh = ext4_bread (NULL,dir, block, 0,&err))) continue;
306 stats = levels? 306 stats = levels?
307 dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): 307 dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1):
308 dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); 308 dx_show_leaf(hinfo, (struct ext4_dir_entry_2 *) bh->b_data, blocksize, 0);
309 names += stats.names; 309 names += stats.names;
310 space += stats.space; 310 space += stats.space;
311 bcount += stats.bcount; 311 bcount += stats.bcount;
@@ -341,13 +341,13 @@ dx_probe(struct dentry *dentry, struct inode *dir,
341 frame->bh = NULL; 341 frame->bh = NULL;
342 if (dentry) 342 if (dentry)
343 dir = dentry->d_parent->d_inode; 343 dir = dentry->d_parent->d_inode;
344 if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) 344 if (!(bh = ext4_bread (NULL,dir, 0, 0, err)))
345 goto fail; 345 goto fail;
346 root = (struct dx_root *) bh->b_data; 346 root = (struct dx_root *) bh->b_data;
347 if (root->info.hash_version != DX_HASH_TEA && 347 if (root->info.hash_version != DX_HASH_TEA &&
348 root->info.hash_version != DX_HASH_HALF_MD4 && 348 root->info.hash_version != DX_HASH_HALF_MD4 &&
349 root->info.hash_version != DX_HASH_LEGACY) { 349 root->info.hash_version != DX_HASH_LEGACY) {
350 ext3_warning(dir->i_sb, __FUNCTION__, 350 ext4_warning(dir->i_sb, __FUNCTION__,
351 "Unrecognised inode hash code %d", 351 "Unrecognised inode hash code %d",
352 root->info.hash_version); 352 root->info.hash_version);
353 brelse(bh); 353 brelse(bh);
@@ -355,13 +355,13 @@ dx_probe(struct dentry *dentry, struct inode *dir,
355 goto fail; 355 goto fail;
356 } 356 }
357 hinfo->hash_version = root->info.hash_version; 357 hinfo->hash_version = root->info.hash_version;
358 hinfo->seed = EXT3_SB(dir->i_sb)->s_hash_seed; 358 hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed;
359 if (dentry) 359 if (dentry)
360 ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); 360 ext4fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo);
361 hash = hinfo->hash; 361 hash = hinfo->hash;
362 362
363 if (root->info.unused_flags & 1) { 363 if (root->info.unused_flags & 1) {
364 ext3_warning(dir->i_sb, __FUNCTION__, 364 ext4_warning(dir->i_sb, __FUNCTION__,
365 "Unimplemented inode hash flags: %#06x", 365 "Unimplemented inode hash flags: %#06x",
366 root->info.unused_flags); 366 root->info.unused_flags);
367 brelse(bh); 367 brelse(bh);
@@ -370,7 +370,7 @@ dx_probe(struct dentry *dentry, struct inode *dir,
370 } 370 }
371 371
372 if ((indirect = root->info.indirect_levels) > 1) { 372 if ((indirect = root->info.indirect_levels) > 1) {
373 ext3_warning(dir->i_sb, __FUNCTION__, 373 ext4_warning(dir->i_sb, __FUNCTION__,
374 "Unimplemented inode hash depth: %#06x", 374 "Unimplemented inode hash depth: %#06x",
375 root->info.indirect_levels); 375 root->info.indirect_levels);
376 brelse(bh); 376 brelse(bh);
@@ -421,7 +421,7 @@ dx_probe(struct dentry *dentry, struct inode *dir,
421 frame->entries = entries; 421 frame->entries = entries;
422 frame->at = at; 422 frame->at = at;
423 if (!indirect--) return frame; 423 if (!indirect--) return frame;
424 if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) 424 if (!(bh = ext4_bread (NULL,dir, dx_get_block(at), 0, err)))
425 goto fail2; 425 goto fail2;
426 at = entries = ((struct dx_node *) bh->b_data)->entries; 426 at = entries = ((struct dx_node *) bh->b_data)->entries;
427 assert (dx_get_limit(entries) == dx_node_limit (dir)); 427 assert (dx_get_limit(entries) == dx_node_limit (dir));
@@ -463,7 +463,7 @@ static void dx_release (struct dx_frame *frames)
463 * If start_hash is non-null, it will be filled in with the starting 463 * If start_hash is non-null, it will be filled in with the starting
464 * hash of the next page. 464 * hash of the next page.
465 */ 465 */
466static int ext3_htree_next_block(struct inode *dir, __u32 hash, 466static int ext4_htree_next_block(struct inode *dir, __u32 hash,
467 struct dx_frame *frame, 467 struct dx_frame *frame,
468 struct dx_frame *frames, 468 struct dx_frame *frames,
469 __u32 *start_hash) 469 __u32 *start_hash)
@@ -509,7 +509,7 @@ static int ext3_htree_next_block(struct inode *dir, __u32 hash,
509 * block so no check is necessary 509 * block so no check is necessary
510 */ 510 */
511 while (num_frames--) { 511 while (num_frames--) {
512 if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), 512 if (!(bh = ext4_bread(NULL, dir, dx_get_block(p->at),
513 0, &err))) 513 0, &err)))
514 return err; /* Failure */ 514 return err; /* Failure */
515 p++; 515 p++;
@@ -524,9 +524,9 @@ static int ext3_htree_next_block(struct inode *dir, __u32 hash,
524/* 524/*
525 * p is at least 6 bytes before the end of page 525 * p is at least 6 bytes before the end of page
526 */ 526 */
527static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) 527static inline struct ext4_dir_entry_2 *ext4_next_entry(struct ext4_dir_entry_2 *p)
528{ 528{
529 return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); 529 return (struct ext4_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len));
530} 530}
531 531
532/* 532/*
@@ -540,26 +540,26 @@ static int htree_dirblock_to_tree(struct file *dir_file,
540 __u32 start_hash, __u32 start_minor_hash) 540 __u32 start_hash, __u32 start_minor_hash)
541{ 541{
542 struct buffer_head *bh; 542 struct buffer_head *bh;
543 struct ext3_dir_entry_2 *de, *top; 543 struct ext4_dir_entry_2 *de, *top;
544 int err, count = 0; 544 int err, count = 0;
545 545
546 dxtrace(printk("In htree dirblock_to_tree: block %d\n", block)); 546 dxtrace(printk("In htree dirblock_to_tree: block %d\n", block));
547 if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) 547 if (!(bh = ext4_bread (NULL, dir, block, 0, &err)))
548 return err; 548 return err;
549 549
550 de = (struct ext3_dir_entry_2 *) bh->b_data; 550 de = (struct ext4_dir_entry_2 *) bh->b_data;
551 top = (struct ext3_dir_entry_2 *) ((char *) de + 551 top = (struct ext4_dir_entry_2 *) ((char *) de +
552 dir->i_sb->s_blocksize - 552 dir->i_sb->s_blocksize -
553 EXT3_DIR_REC_LEN(0)); 553 EXT4_DIR_REC_LEN(0));
554 for (; de < top; de = ext3_next_entry(de)) { 554 for (; de < top; de = ext4_next_entry(de)) {
555 ext3fs_dirhash(de->name, de->name_len, hinfo); 555 ext4fs_dirhash(de->name, de->name_len, hinfo);
556 if ((hinfo->hash < start_hash) || 556 if ((hinfo->hash < start_hash) ||
557 ((hinfo->hash == start_hash) && 557 ((hinfo->hash == start_hash) &&
558 (hinfo->minor_hash < start_minor_hash))) 558 (hinfo->minor_hash < start_minor_hash)))
559 continue; 559 continue;
560 if (de->inode == 0) 560 if (de->inode == 0)
561 continue; 561 continue;
562 if ((err = ext3_htree_store_dirent(dir_file, 562 if ((err = ext4_htree_store_dirent(dir_file,
563 hinfo->hash, hinfo->minor_hash, de)) != 0) { 563 hinfo->hash, hinfo->minor_hash, de)) != 0) {
564 brelse(bh); 564 brelse(bh);
565 return err; 565 return err;
@@ -579,11 +579,11 @@ static int htree_dirblock_to_tree(struct file *dir_file,
579 * This function returns the number of entries inserted into the tree, 579 * This function returns the number of entries inserted into the tree,
580 * or a negative error code. 580 * or a negative error code.
581 */ 581 */
582int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, 582int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,
583 __u32 start_minor_hash, __u32 *next_hash) 583 __u32 start_minor_hash, __u32 *next_hash)
584{ 584{
585 struct dx_hash_info hinfo; 585 struct dx_hash_info hinfo;
586 struct ext3_dir_entry_2 *de; 586 struct ext4_dir_entry_2 *de;
587 struct dx_frame frames[2], *frame; 587 struct dx_frame frames[2], *frame;
588 struct inode *dir; 588 struct inode *dir;
589 int block, err; 589 int block, err;
@@ -594,9 +594,9 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
594 dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, 594 dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash,
595 start_minor_hash)); 595 start_minor_hash));
596 dir = dir_file->f_dentry->d_inode; 596 dir = dir_file->f_dentry->d_inode;
597 if (!(EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) { 597 if (!(EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) {
598 hinfo.hash_version = EXT3_SB(dir->i_sb)->s_def_hash_version; 598 hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version;
599 hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed; 599 hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
600 count = htree_dirblock_to_tree(dir_file, dir, 0, &hinfo, 600 count = htree_dirblock_to_tree(dir_file, dir, 0, &hinfo,
601 start_hash, start_minor_hash); 601 start_hash, start_minor_hash);
602 *next_hash = ~0; 602 *next_hash = ~0;
@@ -610,15 +610,15 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
610 610
611 /* Add '.' and '..' from the htree header */ 611 /* Add '.' and '..' from the htree header */
612 if (!start_hash && !start_minor_hash) { 612 if (!start_hash && !start_minor_hash) {
613 de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; 613 de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data;
614 if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) 614 if ((err = ext4_htree_store_dirent(dir_file, 0, 0, de)) != 0)
615 goto errout; 615 goto errout;
616 count++; 616 count++;
617 } 617 }
618 if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) { 618 if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) {
619 de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; 619 de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data;
620 de = ext3_next_entry(de); 620 de = ext4_next_entry(de);
621 if ((err = ext3_htree_store_dirent(dir_file, 2, 0, de)) != 0) 621 if ((err = ext4_htree_store_dirent(dir_file, 2, 0, de)) != 0)
622 goto errout; 622 goto errout;
623 count++; 623 count++;
624 } 624 }
@@ -633,7 +633,7 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
633 } 633 }
634 count += ret; 634 count += ret;
635 hashval = ~0; 635 hashval = ~0;
636 ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, 636 ret = ext4_htree_next_block(dir, HASH_NB_ALWAYS,
637 frame, frames, &hashval); 637 frame, frames, &hashval);
638 *next_hash = hashval; 638 *next_hash = hashval;
639 if (ret < 0) { 639 if (ret < 0) {
@@ -663,7 +663,7 @@ errout:
663 * Directory block splitting, compacting 663 * Directory block splitting, compacting
664 */ 664 */
665 665
666static int dx_make_map (struct ext3_dir_entry_2 *de, int size, 666static int dx_make_map (struct ext4_dir_entry_2 *de, int size,
667 struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) 667 struct dx_hash_info *hinfo, struct dx_map_entry *map_tail)
668{ 668{
669 int count = 0; 669 int count = 0;
@@ -673,7 +673,7 @@ static int dx_make_map (struct ext3_dir_entry_2 *de, int size,
673 while ((char *) de < base + size) 673 while ((char *) de < base + size)
674 { 674 {
675 if (de->name_len && de->inode) { 675 if (de->name_len && de->inode) {
676 ext3fs_dirhash(de->name, de->name_len, &h); 676 ext4fs_dirhash(de->name, de->name_len, &h);
677 map_tail--; 677 map_tail--;
678 map_tail->hash = h.hash; 678 map_tail->hash = h.hash;
679 map_tail->offs = (u32) ((char *) de - base); 679 map_tail->offs = (u32) ((char *) de - base);
@@ -681,7 +681,7 @@ static int dx_make_map (struct ext3_dir_entry_2 *de, int size,
681 cond_resched(); 681 cond_resched();
682 } 682 }
683 /* XXX: do we need to check rec_len == 0 case? -Chris */ 683 /* XXX: do we need to check rec_len == 0 case? -Chris */
684 de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); 684 de = (struct ext4_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
685 } 685 }
686 return count; 686 return count;
687} 687}
@@ -730,21 +730,21 @@ static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block)
730#endif 730#endif
731 731
732 732
733static void ext3_update_dx_flag(struct inode *inode) 733static void ext4_update_dx_flag(struct inode *inode)
734{ 734{
735 if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, 735 if (!EXT4_HAS_COMPAT_FEATURE(inode->i_sb,
736 EXT3_FEATURE_COMPAT_DIR_INDEX)) 736 EXT4_FEATURE_COMPAT_DIR_INDEX))
737 EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; 737 EXT4_I(inode)->i_flags &= ~EXT4_INDEX_FL;
738} 738}
739 739
740/* 740/*
741 * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. 741 * NOTE! unlike strncmp, ext4_match returns 1 for success, 0 for failure.
742 * 742 *
743 * `len <= EXT3_NAME_LEN' is guaranteed by caller. 743 * `len <= EXT4_NAME_LEN' is guaranteed by caller.
744 * `de != NULL' is guaranteed by caller. 744 * `de != NULL' is guaranteed by caller.
745 */ 745 */
746static inline int ext3_match (int len, const char * const name, 746static inline int ext4_match (int len, const char * const name,
747 struct ext3_dir_entry_2 * de) 747 struct ext4_dir_entry_2 * de)
748{ 748{
749 if (len != de->name_len) 749 if (len != de->name_len)
750 return 0; 750 return 0;
@@ -760,24 +760,24 @@ static inline int search_dirblock(struct buffer_head * bh,
760 struct inode *dir, 760 struct inode *dir,
761 struct dentry *dentry, 761 struct dentry *dentry,
762 unsigned long offset, 762 unsigned long offset,
763 struct ext3_dir_entry_2 ** res_dir) 763 struct ext4_dir_entry_2 ** res_dir)
764{ 764{
765 struct ext3_dir_entry_2 * de; 765 struct ext4_dir_entry_2 * de;
766 char * dlimit; 766 char * dlimit;
767 int de_len; 767 int de_len;
768 const char *name = dentry->d_name.name; 768 const char *name = dentry->d_name.name;
769 int namelen = dentry->d_name.len; 769 int namelen = dentry->d_name.len;
770 770
771 de = (struct ext3_dir_entry_2 *) bh->b_data; 771 de = (struct ext4_dir_entry_2 *) bh->b_data;
772 dlimit = bh->b_data + dir->i_sb->s_blocksize; 772 dlimit = bh->b_data + dir->i_sb->s_blocksize;
773 while ((char *) de < dlimit) { 773 while ((char *) de < dlimit) {
774 /* this code is executed quadratically often */ 774 /* this code is executed quadratically often */
775 /* do minimal checking `by hand' */ 775 /* do minimal checking `by hand' */
776 776
777 if ((char *) de + namelen <= dlimit && 777 if ((char *) de + namelen <= dlimit &&
778 ext3_match (namelen, name, de)) { 778 ext4_match (namelen, name, de)) {
779 /* found a match - just to be sure, do a full check */ 779 /* found a match - just to be sure, do a full check */
780 if (!ext3_check_dir_entry("ext3_find_entry", 780 if (!ext4_check_dir_entry("ext4_find_entry",
781 dir, de, bh, offset)) 781 dir, de, bh, offset))
782 return -1; 782 return -1;
783 *res_dir = de; 783 *res_dir = de;
@@ -788,14 +788,14 @@ static inline int search_dirblock(struct buffer_head * bh,
788 if (de_len <= 0) 788 if (de_len <= 0)
789 return -1; 789 return -1;
790 offset += de_len; 790 offset += de_len;
791 de = (struct ext3_dir_entry_2 *) ((char *) de + de_len); 791 de = (struct ext4_dir_entry_2 *) ((char *) de + de_len);
792 } 792 }
793 return 0; 793 return 0;
794} 794}
795 795
796 796
797/* 797/*
798 * ext3_find_entry() 798 * ext4_find_entry()
799 * 799 *
800 * finds an entry in the specified directory with the wanted name. It 800 * finds an entry in the specified directory with the wanted name. It
801 * returns the cache buffer in which the entry was found, and the entry 801 * returns the cache buffer in which the entry was found, and the entry
@@ -805,8 +805,8 @@ static inline int search_dirblock(struct buffer_head * bh,
805 * The returned buffer_head has ->b_count elevated. The caller is expected 805 * The returned buffer_head has ->b_count elevated. The caller is expected
806 * to brelse() it when appropriate. 806 * to brelse() it when appropriate.
807 */ 807 */
808static struct buffer_head * ext3_find_entry (struct dentry *dentry, 808static struct buffer_head * ext4_find_entry (struct dentry *dentry,
809 struct ext3_dir_entry_2 ** res_dir) 809 struct ext4_dir_entry_2 ** res_dir)
810{ 810{
811 struct super_block * sb; 811 struct super_block * sb;
812 struct buffer_head * bh_use[NAMEI_RA_SIZE]; 812 struct buffer_head * bh_use[NAMEI_RA_SIZE];
@@ -828,11 +828,11 @@ static struct buffer_head * ext3_find_entry (struct dentry *dentry,
828 blocksize = sb->s_blocksize; 828 blocksize = sb->s_blocksize;
829 namelen = dentry->d_name.len; 829 namelen = dentry->d_name.len;
830 name = dentry->d_name.name; 830 name = dentry->d_name.name;
831 if (namelen > EXT3_NAME_LEN) 831 if (namelen > EXT4_NAME_LEN)
832 return NULL; 832 return NULL;
833#ifdef CONFIG_EXT3_INDEX 833#ifdef CONFIG_EXT4_INDEX
834 if (is_dx(dir)) { 834 if (is_dx(dir)) {
835 bh = ext3_dx_find_entry(dentry, res_dir, &err); 835 bh = ext4_dx_find_entry(dentry, res_dir, &err);
836 /* 836 /*
837 * On success, or if the error was file not found, 837 * On success, or if the error was file not found,
838 * return. Otherwise, fall back to doing a search the 838 * return. Otherwise, fall back to doing a search the
@@ -840,11 +840,11 @@ static struct buffer_head * ext3_find_entry (struct dentry *dentry,
840 */ 840 */
841 if (bh || (err != ERR_BAD_DX_DIR)) 841 if (bh || (err != ERR_BAD_DX_DIR))
842 return bh; 842 return bh;
843 dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); 843 dxtrace(printk("ext4_find_entry: dx failed, falling back\n"));
844 } 844 }
845#endif 845#endif
846 nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); 846 nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);
847 start = EXT3_I(dir)->i_dir_start_lookup; 847 start = EXT4_I(dir)->i_dir_start_lookup;
848 if (start >= nblocks) 848 if (start >= nblocks)
849 start = 0; 849 start = 0;
850 block = start; 850 block = start;
@@ -868,7 +868,7 @@ restart:
868 break; 868 break;
869 } 869 }
870 num++; 870 num++;
871 bh = ext3_getblk(NULL, dir, b++, 0, &err); 871 bh = ext4_getblk(NULL, dir, b++, 0, &err);
872 bh_use[ra_max] = bh; 872 bh_use[ra_max] = bh;
873 if (bh) 873 if (bh)
874 ll_rw_block(READ_META, 1, &bh); 874 ll_rw_block(READ_META, 1, &bh);
@@ -879,15 +879,15 @@ restart:
879 wait_on_buffer(bh); 879 wait_on_buffer(bh);
880 if (!buffer_uptodate(bh)) { 880 if (!buffer_uptodate(bh)) {
881 /* read error, skip block & hope for the best */ 881 /* read error, skip block & hope for the best */
882 ext3_error(sb, __FUNCTION__, "reading directory #%lu " 882 ext4_error(sb, __FUNCTION__, "reading directory #%lu "
883 "offset %lu", dir->i_ino, block); 883 "offset %lu", dir->i_ino, block);
884 brelse(bh); 884 brelse(bh);
885 goto next; 885 goto next;
886 } 886 }
887 i = search_dirblock(bh, dir, dentry, 887 i = search_dirblock(bh, dir, dentry,
888 block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); 888 block << EXT4_BLOCK_SIZE_BITS(sb), res_dir);
889 if (i == 1) { 889 if (i == 1) {
890 EXT3_I(dir)->i_dir_start_lookup = block; 890 EXT4_I(dir)->i_dir_start_lookup = block;
891 ret = bh; 891 ret = bh;
892 goto cleanup_and_exit; 892 goto cleanup_and_exit;
893 } else { 893 } else {
@@ -905,7 +905,7 @@ restart:
905 * search the last part of the directory before giving up. 905 * search the last part of the directory before giving up.
906 */ 906 */
907 block = nblocks; 907 block = nblocks;
908 nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); 908 nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);
909 if (block < nblocks) { 909 if (block < nblocks) {
910 start = 0; 910 start = 0;
911 goto restart; 911 goto restart;
@@ -918,15 +918,15 @@ cleanup_and_exit:
918 return ret; 918 return ret;
919} 919}
920 920
921#ifdef CONFIG_EXT3_INDEX 921#ifdef CONFIG_EXT4_INDEX
922static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, 922static struct buffer_head * ext4_dx_find_entry(struct dentry *dentry,
923 struct ext3_dir_entry_2 **res_dir, int *err) 923 struct ext4_dir_entry_2 **res_dir, int *err)
924{ 924{
925 struct super_block * sb; 925 struct super_block * sb;
926 struct dx_hash_info hinfo; 926 struct dx_hash_info hinfo;
927 u32 hash; 927 u32 hash;
928 struct dx_frame frames[2], *frame; 928 struct dx_frame frames[2], *frame;
929 struct ext3_dir_entry_2 *de, *top; 929 struct ext4_dir_entry_2 *de, *top;
930 struct buffer_head *bh; 930 struct buffer_head *bh;
931 unsigned long block; 931 unsigned long block;
932 int retval; 932 int retval;
@@ -948,16 +948,16 @@ static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry,
948 hash = hinfo.hash; 948 hash = hinfo.hash;
949 do { 949 do {
950 block = dx_get_block(frame->at); 950 block = dx_get_block(frame->at);
951 if (!(bh = ext3_bread (NULL,dir, block, 0, err))) 951 if (!(bh = ext4_bread (NULL,dir, block, 0, err)))
952 goto errout; 952 goto errout;
953 de = (struct ext3_dir_entry_2 *) bh->b_data; 953 de = (struct ext4_dir_entry_2 *) bh->b_data;
954 top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - 954 top = (struct ext4_dir_entry_2 *) ((char *) de + sb->s_blocksize -
955 EXT3_DIR_REC_LEN(0)); 955 EXT4_DIR_REC_LEN(0));
956 for (; de < top; de = ext3_next_entry(de)) 956 for (; de < top; de = ext4_next_entry(de))
957 if (ext3_match (namelen, name, de)) { 957 if (ext4_match (namelen, name, de)) {
958 if (!ext3_check_dir_entry("ext3_find_entry", 958 if (!ext4_check_dir_entry("ext4_find_entry",
959 dir, de, bh, 959 dir, de, bh,
960 (block<<EXT3_BLOCK_SIZE_BITS(sb)) 960 (block<<EXT4_BLOCK_SIZE_BITS(sb))
961 +((char *)de - bh->b_data))) { 961 +((char *)de - bh->b_data))) {
962 brelse (bh); 962 brelse (bh);
963 goto errout; 963 goto errout;
@@ -968,10 +968,10 @@ static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry,
968 } 968 }
969 brelse (bh); 969 brelse (bh);
970 /* Check to see if we should continue to search */ 970 /* Check to see if we should continue to search */
971 retval = ext3_htree_next_block(dir, hash, frame, 971 retval = ext4_htree_next_block(dir, hash, frame,
972 frames, NULL); 972 frames, NULL);
973 if (retval < 0) { 973 if (retval < 0) {
974 ext3_warning(sb, __FUNCTION__, 974 ext4_warning(sb, __FUNCTION__,
975 "error reading index page in directory #%lu", 975 "error reading index page in directory #%lu",
976 dir->i_ino); 976 dir->i_ino);
977 *err = retval; 977 *err = retval;
@@ -987,22 +987,22 @@ errout:
987} 987}
988#endif 988#endif
989 989
990static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd) 990static struct dentry *ext4_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd)
991{ 991{
992 struct inode * inode; 992 struct inode * inode;
993 struct ext3_dir_entry_2 * de; 993 struct ext4_dir_entry_2 * de;
994 struct buffer_head * bh; 994 struct buffer_head * bh;
995 995
996 if (dentry->d_name.len > EXT3_NAME_LEN) 996 if (dentry->d_name.len > EXT4_NAME_LEN)
997 return ERR_PTR(-ENAMETOOLONG); 997 return ERR_PTR(-ENAMETOOLONG);
998 998
999 bh = ext3_find_entry(dentry, &de); 999 bh = ext4_find_entry(dentry, &de);
1000 inode = NULL; 1000 inode = NULL;
1001 if (bh) { 1001 if (bh) {
1002 unsigned long ino = le32_to_cpu(de->inode); 1002 unsigned long ino = le32_to_cpu(de->inode);
1003 brelse (bh); 1003 brelse (bh);
1004 if (!ext3_valid_inum(dir->i_sb, ino)) { 1004 if (!ext4_valid_inum(dir->i_sb, ino)) {
1005 ext3_error(dir->i_sb, "ext3_lookup", 1005 ext4_error(dir->i_sb, "ext4_lookup",
1006 "bad inode number: %lu", ino); 1006 "bad inode number: %lu", ino);
1007 inode = NULL; 1007 inode = NULL;
1008 } else 1008 } else
@@ -1015,28 +1015,28 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str
1015} 1015}
1016 1016
1017 1017
1018struct dentry *ext3_get_parent(struct dentry *child) 1018struct dentry *ext4_get_parent(struct dentry *child)
1019{ 1019{
1020 unsigned long ino; 1020 unsigned long ino;
1021 struct dentry *parent; 1021 struct dentry *parent;
1022 struct inode *inode; 1022 struct inode *inode;
1023 struct dentry dotdot; 1023 struct dentry dotdot;
1024 struct ext3_dir_entry_2 * de; 1024 struct ext4_dir_entry_2 * de;
1025 struct buffer_head *bh; 1025 struct buffer_head *bh;
1026 1026
1027 dotdot.d_name.name = ".."; 1027 dotdot.d_name.name = "..";
1028 dotdot.d_name.len = 2; 1028 dotdot.d_name.len = 2;
1029 dotdot.d_parent = child; /* confusing, isn't it! */ 1029 dotdot.d_parent = child; /* confusing, isn't it! */
1030 1030
1031 bh = ext3_find_entry(&dotdot, &de); 1031 bh = ext4_find_entry(&dotdot, &de);
1032 inode = NULL; 1032 inode = NULL;
1033 if (!bh) 1033 if (!bh)
1034 return ERR_PTR(-ENOENT); 1034 return ERR_PTR(-ENOENT);
1035 ino = le32_to_cpu(de->inode); 1035 ino = le32_to_cpu(de->inode);
1036 brelse(bh); 1036 brelse(bh);
1037 1037
1038 if (!ext3_valid_inum(child->d_inode->i_sb, ino)) { 1038 if (!ext4_valid_inum(child->d_inode->i_sb, ino)) {
1039 ext3_error(child->d_inode->i_sb, "ext3_get_parent", 1039 ext4_error(child->d_inode->i_sb, "ext4_get_parent",
1040 "bad inode number: %lu", ino); 1040 "bad inode number: %lu", ino);
1041 inode = NULL; 1041 inode = NULL;
1042 } else 1042 } else
@@ -1054,65 +1054,65 @@ struct dentry *ext3_get_parent(struct dentry *child)
1054} 1054}
1055 1055
1056#define S_SHIFT 12 1056#define S_SHIFT 12
1057static unsigned char ext3_type_by_mode[S_IFMT >> S_SHIFT] = { 1057static unsigned char ext4_type_by_mode[S_IFMT >> S_SHIFT] = {
1058 [S_IFREG >> S_SHIFT] = EXT3_FT_REG_FILE, 1058 [S_IFREG >> S_SHIFT] = EXT4_FT_REG_FILE,
1059 [S_IFDIR >> S_SHIFT] = EXT3_FT_DIR, 1059 [S_IFDIR >> S_SHIFT] = EXT4_FT_DIR,
1060 [S_IFCHR >> S_SHIFT] = EXT3_FT_CHRDEV, 1060 [S_IFCHR >> S_SHIFT] = EXT4_FT_CHRDEV,
1061 [S_IFBLK >> S_SHIFT] = EXT3_FT_BLKDEV, 1061 [S_IFBLK >> S_SHIFT] = EXT4_FT_BLKDEV,
1062 [S_IFIFO >> S_SHIFT] = EXT3_FT_FIFO, 1062 [S_IFIFO >> S_SHIFT] = EXT4_FT_FIFO,
1063 [S_IFSOCK >> S_SHIFT] = EXT3_FT_SOCK, 1063 [S_IFSOCK >> S_SHIFT] = EXT4_FT_SOCK,
1064 [S_IFLNK >> S_SHIFT] = EXT3_FT_SYMLINK, 1064 [S_IFLNK >> S_SHIFT] = EXT4_FT_SYMLINK,
1065}; 1065};
1066 1066
1067static inline void ext3_set_de_type(struct super_block *sb, 1067static inline void ext4_set_de_type(struct super_block *sb,
1068 struct ext3_dir_entry_2 *de, 1068 struct ext4_dir_entry_2 *de,
1069 umode_t mode) { 1069 umode_t mode) {
1070 if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE)) 1070 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FILETYPE))
1071 de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; 1071 de->file_type = ext4_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
1072} 1072}
1073 1073
1074#ifdef CONFIG_EXT3_INDEX 1074#ifdef CONFIG_EXT4_INDEX
1075static struct ext3_dir_entry_2 * 1075static struct ext4_dir_entry_2 *
1076dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) 1076dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count)
1077{ 1077{
1078 unsigned rec_len = 0; 1078 unsigned rec_len = 0;
1079 1079
1080 while (count--) { 1080 while (count--) {
1081 struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); 1081 struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *) (from + map->offs);
1082 rec_len = EXT3_DIR_REC_LEN(de->name_len); 1082 rec_len = EXT4_DIR_REC_LEN(de->name_len);
1083 memcpy (to, de, rec_len); 1083 memcpy (to, de, rec_len);
1084 ((struct ext3_dir_entry_2 *) to)->rec_len = 1084 ((struct ext4_dir_entry_2 *) to)->rec_len =
1085 cpu_to_le16(rec_len); 1085 cpu_to_le16(rec_len);
1086 de->inode = 0; 1086 de->inode = 0;
1087 map++; 1087 map++;
1088 to += rec_len; 1088 to += rec_len;
1089 } 1089 }
1090 return (struct ext3_dir_entry_2 *) (to - rec_len); 1090 return (struct ext4_dir_entry_2 *) (to - rec_len);
1091} 1091}
1092 1092
1093static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) 1093static struct ext4_dir_entry_2* dx_pack_dirents(char *base, int size)
1094{ 1094{
1095 struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; 1095 struct ext4_dir_entry_2 *next, *to, *prev, *de = (struct ext4_dir_entry_2 *) base;
1096 unsigned rec_len = 0; 1096 unsigned rec_len = 0;
1097 1097
1098 prev = to = de; 1098 prev = to = de;
1099 while ((char*)de < base + size) { 1099 while ((char*)de < base + size) {
1100 next = (struct ext3_dir_entry_2 *) ((char *) de + 1100 next = (struct ext4_dir_entry_2 *) ((char *) de +
1101 le16_to_cpu(de->rec_len)); 1101 le16_to_cpu(de->rec_len));
1102 if (de->inode && de->name_len) { 1102 if (de->inode && de->name_len) {
1103 rec_len = EXT3_DIR_REC_LEN(de->name_len); 1103 rec_len = EXT4_DIR_REC_LEN(de->name_len);
1104 if (de > to) 1104 if (de > to)
1105 memmove(to, de, rec_len); 1105 memmove(to, de, rec_len);
1106 to->rec_len = cpu_to_le16(rec_len); 1106 to->rec_len = cpu_to_le16(rec_len);
1107 prev = to; 1107 prev = to;
1108 to = (struct ext3_dir_entry_2 *) (((char *) to) + rec_len); 1108 to = (struct ext4_dir_entry_2 *) (((char *) to) + rec_len);
1109 } 1109 }
1110 de = next; 1110 de = next;
1111 } 1111 }
1112 return prev; 1112 return prev;
1113} 1113}
1114 1114
1115static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, 1115static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1116 struct buffer_head **bh,struct dx_frame *frame, 1116 struct buffer_head **bh,struct dx_frame *frame,
1117 struct dx_hash_info *hinfo, int *error) 1117 struct dx_hash_info *hinfo, int *error)
1118{ 1118{
@@ -1124,10 +1124,10 @@ static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1124 struct dx_map_entry *map; 1124 struct dx_map_entry *map;
1125 char *data1 = (*bh)->b_data, *data2; 1125 char *data1 = (*bh)->b_data, *data2;
1126 unsigned split; 1126 unsigned split;
1127 struct ext3_dir_entry_2 *de = NULL, *de2; 1127 struct ext4_dir_entry_2 *de = NULL, *de2;
1128 int err; 1128 int err;
1129 1129
1130 bh2 = ext3_append (handle, dir, &newblock, error); 1130 bh2 = ext4_append (handle, dir, &newblock, error);
1131 if (!(bh2)) { 1131 if (!(bh2)) {
1132 brelse(*bh); 1132 brelse(*bh);
1133 *bh = NULL; 1133 *bh = NULL;
@@ -1135,17 +1135,17 @@ static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1135 } 1135 }
1136 1136
1137 BUFFER_TRACE(*bh, "get_write_access"); 1137 BUFFER_TRACE(*bh, "get_write_access");
1138 err = ext3_journal_get_write_access(handle, *bh); 1138 err = ext4_journal_get_write_access(handle, *bh);
1139 if (err) { 1139 if (err) {
1140 journal_error: 1140 journal_error:
1141 brelse(*bh); 1141 brelse(*bh);
1142 brelse(bh2); 1142 brelse(bh2);
1143 *bh = NULL; 1143 *bh = NULL;
1144 ext3_std_error(dir->i_sb, err); 1144 ext4_std_error(dir->i_sb, err);
1145 goto errout; 1145 goto errout;
1146 } 1146 }
1147 BUFFER_TRACE(frame->bh, "get_write_access"); 1147 BUFFER_TRACE(frame->bh, "get_write_access");
1148 err = ext3_journal_get_write_access(handle, frame->bh); 1148 err = ext4_journal_get_write_access(handle, frame->bh);
1149 if (err) 1149 if (err)
1150 goto journal_error; 1150 goto journal_error;
1151 1151
@@ -1153,7 +1153,7 @@ static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1153 1153
1154 /* create map in the end of data2 block */ 1154 /* create map in the end of data2 block */
1155 map = (struct dx_map_entry *) (data2 + blocksize); 1155 map = (struct dx_map_entry *) (data2 + blocksize);
1156 count = dx_make_map ((struct ext3_dir_entry_2 *) data1, 1156 count = dx_make_map ((struct ext4_dir_entry_2 *) data1,
1157 blocksize, hinfo, map); 1157 blocksize, hinfo, map);
1158 map -= count; 1158 map -= count;
1159 split = count/2; // need to adjust to actual middle 1159 split = count/2; // need to adjust to actual middle
@@ -1168,8 +1168,8 @@ static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1168 de = dx_pack_dirents(data1,blocksize); 1168 de = dx_pack_dirents(data1,blocksize);
1169 de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); 1169 de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de);
1170 de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); 1170 de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2);
1171 dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); 1171 dxtrace(dx_show_leaf (hinfo, (struct ext4_dir_entry_2 *) data1, blocksize, 1));
1172 dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); 1172 dxtrace(dx_show_leaf (hinfo, (struct ext4_dir_entry_2 *) data2, blocksize, 1));
1173 1173
1174 /* Which block gets the new entry? */ 1174 /* Which block gets the new entry? */
1175 if (hinfo->hash >= hash2) 1175 if (hinfo->hash >= hash2)
@@ -1178,10 +1178,10 @@ static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1178 de = de2; 1178 de = de2;
1179 } 1179 }
1180 dx_insert_block (frame, hash2 + continued, newblock); 1180 dx_insert_block (frame, hash2 + continued, newblock);
1181 err = ext3_journal_dirty_metadata (handle, bh2); 1181 err = ext4_journal_dirty_metadata (handle, bh2);
1182 if (err) 1182 if (err)
1183 goto journal_error; 1183 goto journal_error;
1184 err = ext3_journal_dirty_metadata (handle, frame->bh); 1184 err = ext4_journal_dirty_metadata (handle, frame->bh);
1185 if (err) 1185 if (err)
1186 goto journal_error; 1186 goto journal_error;
1187 brelse (bh2); 1187 brelse (bh2);
@@ -1204,7 +1204,7 @@ errout:
1204 * all other cases bh is released. 1204 * all other cases bh is released.
1205 */ 1205 */
1206static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, 1206static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
1207 struct inode *inode, struct ext3_dir_entry_2 *de, 1207 struct inode *inode, struct ext4_dir_entry_2 *de,
1208 struct buffer_head * bh) 1208 struct buffer_head * bh)
1209{ 1209{
1210 struct inode *dir = dentry->d_parent->d_inode; 1210 struct inode *dir = dentry->d_parent->d_inode;
@@ -1215,51 +1215,51 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
1215 int nlen, rlen, err; 1215 int nlen, rlen, err;
1216 char *top; 1216 char *top;
1217 1217
1218 reclen = EXT3_DIR_REC_LEN(namelen); 1218 reclen = EXT4_DIR_REC_LEN(namelen);
1219 if (!de) { 1219 if (!de) {
1220 de = (struct ext3_dir_entry_2 *)bh->b_data; 1220 de = (struct ext4_dir_entry_2 *)bh->b_data;
1221 top = bh->b_data + dir->i_sb->s_blocksize - reclen; 1221 top = bh->b_data + dir->i_sb->s_blocksize - reclen;
1222 while ((char *) de <= top) { 1222 while ((char *) de <= top) {
1223 if (!ext3_check_dir_entry("ext3_add_entry", dir, de, 1223 if (!ext4_check_dir_entry("ext4_add_entry", dir, de,
1224 bh, offset)) { 1224 bh, offset)) {
1225 brelse (bh); 1225 brelse (bh);
1226 return -EIO; 1226 return -EIO;
1227 } 1227 }
1228 if (ext3_match (namelen, name, de)) { 1228 if (ext4_match (namelen, name, de)) {
1229 brelse (bh); 1229 brelse (bh);
1230 return -EEXIST; 1230 return -EEXIST;
1231 } 1231 }
1232 nlen = EXT3_DIR_REC_LEN(de->name_len); 1232 nlen = EXT4_DIR_REC_LEN(de->name_len);
1233 rlen = le16_to_cpu(de->rec_len); 1233 rlen = le16_to_cpu(de->rec_len);
1234 if ((de->inode? rlen - nlen: rlen) >= reclen) 1234 if ((de->inode? rlen - nlen: rlen) >= reclen)
1235 break; 1235 break;
1236 de = (struct ext3_dir_entry_2 *)((char *)de + rlen); 1236 de = (struct ext4_dir_entry_2 *)((char *)de + rlen);
1237 offset += rlen; 1237 offset += rlen;
1238 } 1238 }
1239 if ((char *) de > top) 1239 if ((char *) de > top)
1240 return -ENOSPC; 1240 return -ENOSPC;
1241 } 1241 }
1242 BUFFER_TRACE(bh, "get_write_access"); 1242 BUFFER_TRACE(bh, "get_write_access");
1243 err = ext3_journal_get_write_access(handle, bh); 1243 err = ext4_journal_get_write_access(handle, bh);
1244 if (err) { 1244 if (err) {
1245 ext3_std_error(dir->i_sb, err); 1245 ext4_std_error(dir->i_sb, err);
1246 brelse(bh); 1246 brelse(bh);
1247 return err; 1247 return err;
1248 } 1248 }
1249 1249
1250 /* By now the buffer is marked for journaling */ 1250 /* By now the buffer is marked for journaling */
1251 nlen = EXT3_DIR_REC_LEN(de->name_len); 1251 nlen = EXT4_DIR_REC_LEN(de->name_len);
1252 rlen = le16_to_cpu(de->rec_len); 1252 rlen = le16_to_cpu(de->rec_len);
1253 if (de->inode) { 1253 if (de->inode) {
1254 struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); 1254 struct ext4_dir_entry_2 *de1 = (struct ext4_dir_entry_2 *)((char *)de + nlen);
1255 de1->rec_len = cpu_to_le16(rlen - nlen); 1255 de1->rec_len = cpu_to_le16(rlen - nlen);
1256 de->rec_len = cpu_to_le16(nlen); 1256 de->rec_len = cpu_to_le16(nlen);
1257 de = de1; 1257 de = de1;
1258 } 1258 }
1259 de->file_type = EXT3_FT_UNKNOWN; 1259 de->file_type = EXT4_FT_UNKNOWN;
1260 if (inode) { 1260 if (inode) {
1261 de->inode = cpu_to_le32(inode->i_ino); 1261 de->inode = cpu_to_le32(inode->i_ino);
1262 ext3_set_de_type(dir->i_sb, de, inode->i_mode); 1262 ext4_set_de_type(dir->i_sb, de, inode->i_mode);
1263 } else 1263 } else
1264 de->inode = 0; 1264 de->inode = 0;
1265 de->name_len = namelen; 1265 de->name_len = namelen;
@@ -1270,24 +1270,24 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
1270 * on this. 1270 * on this.
1271 * 1271 *
1272 * XXX similarly, too many callers depend on 1272 * XXX similarly, too many callers depend on
1273 * ext3_new_inode() setting the times, but error 1273 * ext4_new_inode() setting the times, but error
1274 * recovery deletes the inode, so the worst that can 1274 * recovery deletes the inode, so the worst that can
1275 * happen is that the times are slightly out of date 1275 * happen is that the times are slightly out of date
1276 * and/or different from the directory change time. 1276 * and/or different from the directory change time.
1277 */ 1277 */
1278 dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; 1278 dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
1279 ext3_update_dx_flag(dir); 1279 ext4_update_dx_flag(dir);
1280 dir->i_version++; 1280 dir->i_version++;
1281 ext3_mark_inode_dirty(handle, dir); 1281 ext4_mark_inode_dirty(handle, dir);
1282 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); 1282 BUFFER_TRACE(bh, "call ext4_journal_dirty_metadata");
1283 err = ext3_journal_dirty_metadata(handle, bh); 1283 err = ext4_journal_dirty_metadata(handle, bh);
1284 if (err) 1284 if (err)
1285 ext3_std_error(dir->i_sb, err); 1285 ext4_std_error(dir->i_sb, err);
1286 brelse(bh); 1286 brelse(bh);
1287 return 0; 1287 return 0;
1288} 1288}
1289 1289
1290#ifdef CONFIG_EXT3_INDEX 1290#ifdef CONFIG_EXT4_INDEX
1291/* 1291/*
1292 * This converts a one block unindexed directory to a 3 block indexed 1292 * This converts a one block unindexed directory to a 3 block indexed
1293 * directory, and adds the dentry to the indexed directory. 1293 * directory, and adds the dentry to the indexed directory.
@@ -1302,7 +1302,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
1302 struct dx_root *root; 1302 struct dx_root *root;
1303 struct dx_frame frames[2], *frame; 1303 struct dx_frame frames[2], *frame;
1304 struct dx_entry *entries; 1304 struct dx_entry *entries;
1305 struct ext3_dir_entry_2 *de, *de2; 1305 struct ext4_dir_entry_2 *de, *de2;
1306 char *data1, *top; 1306 char *data1, *top;
1307 unsigned len; 1307 unsigned len;
1308 int retval; 1308 int retval;
@@ -1313,38 +1313,38 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
1313 1313
1314 blocksize = dir->i_sb->s_blocksize; 1314 blocksize = dir->i_sb->s_blocksize;
1315 dxtrace(printk("Creating index\n")); 1315 dxtrace(printk("Creating index\n"));
1316 retval = ext3_journal_get_write_access(handle, bh); 1316 retval = ext4_journal_get_write_access(handle, bh);
1317 if (retval) { 1317 if (retval) {
1318 ext3_std_error(dir->i_sb, retval); 1318 ext4_std_error(dir->i_sb, retval);
1319 brelse(bh); 1319 brelse(bh);
1320 return retval; 1320 return retval;
1321 } 1321 }
1322 root = (struct dx_root *) bh->b_data; 1322 root = (struct dx_root *) bh->b_data;
1323 1323
1324 bh2 = ext3_append (handle, dir, &block, &retval); 1324 bh2 = ext4_append (handle, dir, &block, &retval);
1325 if (!(bh2)) { 1325 if (!(bh2)) {
1326 brelse(bh); 1326 brelse(bh);
1327 return retval; 1327 return retval;
1328 } 1328 }
1329 EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; 1329 EXT4_I(dir)->i_flags |= EXT4_INDEX_FL;
1330 data1 = bh2->b_data; 1330 data1 = bh2->b_data;
1331 1331
1332 /* The 0th block becomes the root, move the dirents out */ 1332 /* The 0th block becomes the root, move the dirents out */
1333 fde = &root->dotdot; 1333 fde = &root->dotdot;
1334 de = (struct ext3_dir_entry_2 *)((char *)fde + le16_to_cpu(fde->rec_len)); 1334 de = (struct ext4_dir_entry_2 *)((char *)fde + le16_to_cpu(fde->rec_len));
1335 len = ((char *) root) + blocksize - (char *) de; 1335 len = ((char *) root) + blocksize - (char *) de;
1336 memcpy (data1, de, len); 1336 memcpy (data1, de, len);
1337 de = (struct ext3_dir_entry_2 *) data1; 1337 de = (struct ext4_dir_entry_2 *) data1;
1338 top = data1 + len; 1338 top = data1 + len;
1339 while ((char *)(de2=(void*)de+le16_to_cpu(de->rec_len)) < top) 1339 while ((char *)(de2=(void*)de+le16_to_cpu(de->rec_len)) < top)
1340 de = de2; 1340 de = de2;
1341 de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); 1341 de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de);
1342 /* Initialize the root; the dot dirents already exist */ 1342 /* Initialize the root; the dot dirents already exist */
1343 de = (struct ext3_dir_entry_2 *) (&root->dotdot); 1343 de = (struct ext4_dir_entry_2 *) (&root->dotdot);
1344 de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); 1344 de->rec_len = cpu_to_le16(blocksize - EXT4_DIR_REC_LEN(2));
1345 memset (&root->info, 0, sizeof(root->info)); 1345 memset (&root->info, 0, sizeof(root->info));
1346 root->info.info_length = sizeof(root->info); 1346 root->info.info_length = sizeof(root->info);
1347 root->info.hash_version = EXT3_SB(dir->i_sb)->s_def_hash_version; 1347 root->info.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version;
1348 entries = root->entries; 1348 entries = root->entries;
1349 dx_set_block (entries, 1); 1349 dx_set_block (entries, 1);
1350 dx_set_count (entries, 1); 1350 dx_set_count (entries, 1);
@@ -1352,8 +1352,8 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
1352 1352
1353 /* Initialize as for dx_probe */ 1353 /* Initialize as for dx_probe */
1354 hinfo.hash_version = root->info.hash_version; 1354 hinfo.hash_version = root->info.hash_version;
1355 hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed; 1355 hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
1356 ext3fs_dirhash(name, namelen, &hinfo); 1356 ext4fs_dirhash(name, namelen, &hinfo);
1357 frame = frames; 1357 frame = frames;
1358 frame->entries = entries; 1358 frame->entries = entries;
1359 frame->at = entries; 1359 frame->at = entries;
@@ -1369,25 +1369,25 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
1369#endif 1369#endif
1370 1370
1371/* 1371/*
1372 * ext3_add_entry() 1372 * ext4_add_entry()
1373 * 1373 *
1374 * adds a file entry to the specified directory, using the same 1374 * adds a file entry to the specified directory, using the same
1375 * semantics as ext3_find_entry(). It returns NULL if it failed. 1375 * semantics as ext4_find_entry(). It returns NULL if it failed.
1376 * 1376 *
1377 * NOTE!! The inode part of 'de' is left at 0 - which means you 1377 * NOTE!! The inode part of 'de' is left at 0 - which means you
1378 * may not sleep between calling this and putting something into 1378 * may not sleep between calling this and putting something into
1379 * the entry, as someone else might have used it while you slept. 1379 * the entry, as someone else might have used it while you slept.
1380 */ 1380 */
1381static int ext3_add_entry (handle_t *handle, struct dentry *dentry, 1381static int ext4_add_entry (handle_t *handle, struct dentry *dentry,
1382 struct inode *inode) 1382 struct inode *inode)
1383{ 1383{
1384 struct inode *dir = dentry->d_parent->d_inode; 1384 struct inode *dir = dentry->d_parent->d_inode;
1385 unsigned long offset; 1385 unsigned long offset;
1386 struct buffer_head * bh; 1386 struct buffer_head * bh;
1387 struct ext3_dir_entry_2 *de; 1387 struct ext4_dir_entry_2 *de;
1388 struct super_block * sb; 1388 struct super_block * sb;
1389 int retval; 1389 int retval;
1390#ifdef CONFIG_EXT3_INDEX 1390#ifdef CONFIG_EXT4_INDEX
1391 int dx_fallback=0; 1391 int dx_fallback=0;
1392#endif 1392#endif
1393 unsigned blocksize; 1393 unsigned blocksize;
@@ -1397,46 +1397,46 @@ static int ext3_add_entry (handle_t *handle, struct dentry *dentry,
1397 blocksize = sb->s_blocksize; 1397 blocksize = sb->s_blocksize;
1398 if (!dentry->d_name.len) 1398 if (!dentry->d_name.len)
1399 return -EINVAL; 1399 return -EINVAL;
1400#ifdef CONFIG_EXT3_INDEX 1400#ifdef CONFIG_EXT4_INDEX
1401 if (is_dx(dir)) { 1401 if (is_dx(dir)) {
1402 retval = ext3_dx_add_entry(handle, dentry, inode); 1402 retval = ext4_dx_add_entry(handle, dentry, inode);
1403 if (!retval || (retval != ERR_BAD_DX_DIR)) 1403 if (!retval || (retval != ERR_BAD_DX_DIR))
1404 return retval; 1404 return retval;
1405 EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; 1405 EXT4_I(dir)->i_flags &= ~EXT4_INDEX_FL;
1406 dx_fallback++; 1406 dx_fallback++;
1407 ext3_mark_inode_dirty(handle, dir); 1407 ext4_mark_inode_dirty(handle, dir);
1408 } 1408 }
1409#endif 1409#endif
1410 blocks = dir->i_size >> sb->s_blocksize_bits; 1410 blocks = dir->i_size >> sb->s_blocksize_bits;
1411 for (block = 0, offset = 0; block < blocks; block++) { 1411 for (block = 0, offset = 0; block < blocks; block++) {
1412 bh = ext3_bread(handle, dir, block, 0, &retval); 1412 bh = ext4_bread(handle, dir, block, 0, &retval);
1413 if(!bh) 1413 if(!bh)
1414 return retval; 1414 return retval;
1415 retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); 1415 retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
1416 if (retval != -ENOSPC) 1416 if (retval != -ENOSPC)
1417 return retval; 1417 return retval;
1418 1418
1419#ifdef CONFIG_EXT3_INDEX 1419#ifdef CONFIG_EXT4_INDEX
1420 if (blocks == 1 && !dx_fallback && 1420 if (blocks == 1 && !dx_fallback &&
1421 EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) 1421 EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX))
1422 return make_indexed_dir(handle, dentry, inode, bh); 1422 return make_indexed_dir(handle, dentry, inode, bh);
1423#endif 1423#endif
1424 brelse(bh); 1424 brelse(bh);
1425 } 1425 }
1426 bh = ext3_append(handle, dir, &block, &retval); 1426 bh = ext4_append(handle, dir, &block, &retval);
1427 if (!bh) 1427 if (!bh)
1428 return retval; 1428 return retval;
1429 de = (struct ext3_dir_entry_2 *) bh->b_data; 1429 de = (struct ext4_dir_entry_2 *) bh->b_data;
1430 de->inode = 0; 1430 de->inode = 0;
1431 de->rec_len = cpu_to_le16(blocksize); 1431 de->rec_len = cpu_to_le16(blocksize);
1432 return add_dirent_to_buf(handle, dentry, inode, de, bh); 1432 return add_dirent_to_buf(handle, dentry, inode, de, bh);
1433} 1433}
1434 1434
1435#ifdef CONFIG_EXT3_INDEX 1435#ifdef CONFIG_EXT4_INDEX
1436/* 1436/*
1437 * Returns 0 for success, or a negative error value 1437 * Returns 0 for success, or a negative error value
1438 */ 1438 */
1439static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, 1439static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
1440 struct inode *inode) 1440 struct inode *inode)
1441{ 1441{
1442 struct dx_frame frames[2], *frame; 1442 struct dx_frame frames[2], *frame;
@@ -1445,7 +1445,7 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1445 struct buffer_head * bh; 1445 struct buffer_head * bh;
1446 struct inode *dir = dentry->d_parent->d_inode; 1446 struct inode *dir = dentry->d_parent->d_inode;
1447 struct super_block * sb = dir->i_sb; 1447 struct super_block * sb = dir->i_sb;
1448 struct ext3_dir_entry_2 *de; 1448 struct ext4_dir_entry_2 *de;
1449 int err; 1449 int err;
1450 1450
1451 frame = dx_probe(dentry, NULL, &hinfo, frames, &err); 1451 frame = dx_probe(dentry, NULL, &hinfo, frames, &err);
@@ -1454,11 +1454,11 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1454 entries = frame->entries; 1454 entries = frame->entries;
1455 at = frame->at; 1455 at = frame->at;
1456 1456
1457 if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) 1457 if (!(bh = ext4_bread(handle,dir, dx_get_block(frame->at), 0, &err)))
1458 goto cleanup; 1458 goto cleanup;
1459 1459
1460 BUFFER_TRACE(bh, "get_write_access"); 1460 BUFFER_TRACE(bh, "get_write_access");
1461 err = ext3_journal_get_write_access(handle, bh); 1461 err = ext4_journal_get_write_access(handle, bh);
1462 if (err) 1462 if (err)
1463 goto journal_error; 1463 goto journal_error;
1464 1464
@@ -1482,12 +1482,12 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1482 1482
1483 if (levels && (dx_get_count(frames->entries) == 1483 if (levels && (dx_get_count(frames->entries) ==
1484 dx_get_limit(frames->entries))) { 1484 dx_get_limit(frames->entries))) {
1485 ext3_warning(sb, __FUNCTION__, 1485 ext4_warning(sb, __FUNCTION__,
1486 "Directory index full!"); 1486 "Directory index full!");
1487 err = -ENOSPC; 1487 err = -ENOSPC;
1488 goto cleanup; 1488 goto cleanup;
1489 } 1489 }
1490 bh2 = ext3_append (handle, dir, &newblock, &err); 1490 bh2 = ext4_append (handle, dir, &newblock, &err);
1491 if (!(bh2)) 1491 if (!(bh2))
1492 goto cleanup; 1492 goto cleanup;
1493 node2 = (struct dx_node *)(bh2->b_data); 1493 node2 = (struct dx_node *)(bh2->b_data);
@@ -1495,7 +1495,7 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1495 node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); 1495 node2->fake.rec_len = cpu_to_le16(sb->s_blocksize);
1496 node2->fake.inode = 0; 1496 node2->fake.inode = 0;
1497 BUFFER_TRACE(frame->bh, "get_write_access"); 1497 BUFFER_TRACE(frame->bh, "get_write_access");
1498 err = ext3_journal_get_write_access(handle, frame->bh); 1498 err = ext4_journal_get_write_access(handle, frame->bh);
1499 if (err) 1499 if (err)
1500 goto journal_error; 1500 goto journal_error;
1501 if (levels) { 1501 if (levels) {
@@ -1504,7 +1504,7 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1504 dxtrace(printk("Split index %i/%i\n", icount1, icount2)); 1504 dxtrace(printk("Split index %i/%i\n", icount1, icount2));
1505 1505
1506 BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ 1506 BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */
1507 err = ext3_journal_get_write_access(handle, 1507 err = ext4_journal_get_write_access(handle,
1508 frames[0].bh); 1508 frames[0].bh);
1509 if (err) 1509 if (err)
1510 goto journal_error; 1510 goto journal_error;
@@ -1525,7 +1525,7 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1525 dxtrace(dx_show_index ("node", frames[1].entries)); 1525 dxtrace(dx_show_index ("node", frames[1].entries));
1526 dxtrace(dx_show_index ("node", 1526 dxtrace(dx_show_index ("node",
1527 ((struct dx_node *) bh2->b_data)->entries)); 1527 ((struct dx_node *) bh2->b_data)->entries));
1528 err = ext3_journal_dirty_metadata(handle, bh2); 1528 err = ext4_journal_dirty_metadata(handle, bh2);
1529 if (err) 1529 if (err)
1530 goto journal_error; 1530 goto journal_error;
1531 brelse (bh2); 1531 brelse (bh2);
@@ -1545,12 +1545,12 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1545 frame->at = at = at - entries + entries2; 1545 frame->at = at = at - entries + entries2;
1546 frame->entries = entries = entries2; 1546 frame->entries = entries = entries2;
1547 frame->bh = bh2; 1547 frame->bh = bh2;
1548 err = ext3_journal_get_write_access(handle, 1548 err = ext4_journal_get_write_access(handle,
1549 frame->bh); 1549 frame->bh);
1550 if (err) 1550 if (err)
1551 goto journal_error; 1551 goto journal_error;
1552 } 1552 }
1553 ext3_journal_dirty_metadata(handle, frames[0].bh); 1553 ext4_journal_dirty_metadata(handle, frames[0].bh);
1554 } 1554 }
1555 de = do_split(handle, dir, &bh, frame, &hinfo, &err); 1555 de = do_split(handle, dir, &bh, frame, &hinfo, &err);
1556 if (!de) 1556 if (!de)
@@ -1560,7 +1560,7 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1560 goto cleanup; 1560 goto cleanup;
1561 1561
1562journal_error: 1562journal_error:
1563 ext3_std_error(dir->i_sb, err); 1563 ext4_std_error(dir->i_sb, err);
1564cleanup: 1564cleanup:
1565 if (bh) 1565 if (bh)
1566 brelse(bh); 1566 brelse(bh);
@@ -1570,26 +1570,26 @@ cleanup:
1570#endif 1570#endif
1571 1571
1572/* 1572/*
1573 * ext3_delete_entry deletes a directory entry by merging it with the 1573 * ext4_delete_entry deletes a directory entry by merging it with the
1574 * previous entry 1574 * previous entry
1575 */ 1575 */
1576static int ext3_delete_entry (handle_t *handle, 1576static int ext4_delete_entry (handle_t *handle,
1577 struct inode * dir, 1577 struct inode * dir,
1578 struct ext3_dir_entry_2 * de_del, 1578 struct ext4_dir_entry_2 * de_del,
1579 struct buffer_head * bh) 1579 struct buffer_head * bh)
1580{ 1580{
1581 struct ext3_dir_entry_2 * de, * pde; 1581 struct ext4_dir_entry_2 * de, * pde;
1582 int i; 1582 int i;
1583 1583
1584 i = 0; 1584 i = 0;
1585 pde = NULL; 1585 pde = NULL;
1586 de = (struct ext3_dir_entry_2 *) bh->b_data; 1586 de = (struct ext4_dir_entry_2 *) bh->b_data;
1587 while (i < bh->b_size) { 1587 while (i < bh->b_size) {
1588 if (!ext3_check_dir_entry("ext3_delete_entry", dir, de, bh, i)) 1588 if (!ext4_check_dir_entry("ext4_delete_entry", dir, de, bh, i))
1589 return -EIO; 1589 return -EIO;
1590 if (de == de_del) { 1590 if (de == de_del) {
1591 BUFFER_TRACE(bh, "get_write_access"); 1591 BUFFER_TRACE(bh, "get_write_access");
1592 ext3_journal_get_write_access(handle, bh); 1592 ext4_journal_get_write_access(handle, bh);
1593 if (pde) 1593 if (pde)
1594 pde->rec_len = 1594 pde->rec_len =
1595 cpu_to_le16(le16_to_cpu(pde->rec_len) + 1595 cpu_to_le16(le16_to_cpu(pde->rec_len) +
@@ -1597,43 +1597,43 @@ static int ext3_delete_entry (handle_t *handle,
1597 else 1597 else
1598 de->inode = 0; 1598 de->inode = 0;
1599 dir->i_version++; 1599 dir->i_version++;
1600 BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); 1600 BUFFER_TRACE(bh, "call ext4_journal_dirty_metadata");
1601 ext3_journal_dirty_metadata(handle, bh); 1601 ext4_journal_dirty_metadata(handle, bh);
1602 return 0; 1602 return 0;
1603 } 1603 }
1604 i += le16_to_cpu(de->rec_len); 1604 i += le16_to_cpu(de->rec_len);
1605 pde = de; 1605 pde = de;
1606 de = (struct ext3_dir_entry_2 *) 1606 de = (struct ext4_dir_entry_2 *)
1607 ((char *) de + le16_to_cpu(de->rec_len)); 1607 ((char *) de + le16_to_cpu(de->rec_len));
1608 } 1608 }
1609 return -ENOENT; 1609 return -ENOENT;
1610} 1610}
1611 1611
1612/* 1612/*
1613 * ext3_mark_inode_dirty is somewhat expensive, so unlike ext2 we 1613 * ext4_mark_inode_dirty is somewhat expensive, so unlike ext2 we
1614 * do not perform it in these functions. We perform it at the call site, 1614 * do not perform it in these functions. We perform it at the call site,
1615 * if it is needed. 1615 * if it is needed.
1616 */ 1616 */
1617static inline void ext3_inc_count(handle_t *handle, struct inode *inode) 1617static inline void ext4_inc_count(handle_t *handle, struct inode *inode)
1618{ 1618{
1619 inc_nlink(inode); 1619 inc_nlink(inode);
1620} 1620}
1621 1621
1622static inline void ext3_dec_count(handle_t *handle, struct inode *inode) 1622static inline void ext4_dec_count(handle_t *handle, struct inode *inode)
1623{ 1623{
1624 drop_nlink(inode); 1624 drop_nlink(inode);
1625} 1625}
1626 1626
1627static int ext3_add_nondir(handle_t *handle, 1627static int ext4_add_nondir(handle_t *handle,
1628 struct dentry *dentry, struct inode *inode) 1628 struct dentry *dentry, struct inode *inode)
1629{ 1629{
1630 int err = ext3_add_entry(handle, dentry, inode); 1630 int err = ext4_add_entry(handle, dentry, inode);
1631 if (!err) { 1631 if (!err) {
1632 ext3_mark_inode_dirty(handle, inode); 1632 ext4_mark_inode_dirty(handle, inode);
1633 d_instantiate(dentry, inode); 1633 d_instantiate(dentry, inode);
1634 return 0; 1634 return 0;
1635 } 1635 }
1636 ext3_dec_count(handle, inode); 1636 ext4_dec_count(handle, inode);
1637 iput(inode); 1637 iput(inode);
1638 return err; 1638 return err;
1639} 1639}
@@ -1646,7 +1646,7 @@ static int ext3_add_nondir(handle_t *handle,
1646 * If the create succeeds, we fill in the inode information 1646 * If the create succeeds, we fill in the inode information
1647 * with d_instantiate(). 1647 * with d_instantiate().
1648 */ 1648 */
1649static int ext3_create (struct inode * dir, struct dentry * dentry, int mode, 1649static int ext4_create (struct inode * dir, struct dentry * dentry, int mode,
1650 struct nameidata *nd) 1650 struct nameidata *nd)
1651{ 1651{
1652 handle_t *handle; 1652 handle_t *handle;
@@ -1654,30 +1654,30 @@ static int ext3_create (struct inode * dir, struct dentry * dentry, int mode,
1654 int err, retries = 0; 1654 int err, retries = 0;
1655 1655
1656retry: 1656retry:
1657 handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + 1657 handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
1658 EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + 1658 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
1659 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); 1659 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
1660 if (IS_ERR(handle)) 1660 if (IS_ERR(handle))
1661 return PTR_ERR(handle); 1661 return PTR_ERR(handle);
1662 1662
1663 if (IS_DIRSYNC(dir)) 1663 if (IS_DIRSYNC(dir))
1664 handle->h_sync = 1; 1664 handle->h_sync = 1;
1665 1665
1666 inode = ext3_new_inode (handle, dir, mode); 1666 inode = ext4_new_inode (handle, dir, mode);
1667 err = PTR_ERR(inode); 1667 err = PTR_ERR(inode);
1668 if (!IS_ERR(inode)) { 1668 if (!IS_ERR(inode)) {
1669 inode->i_op = &ext3_file_inode_operations; 1669 inode->i_op = &ext4_file_inode_operations;
1670 inode->i_fop = &ext3_file_operations; 1670 inode->i_fop = &ext4_file_operations;
1671 ext3_set_aops(inode); 1671 ext4_set_aops(inode);
1672 err = ext3_add_nondir(handle, dentry, inode); 1672 err = ext4_add_nondir(handle, dentry, inode);
1673 } 1673 }
1674 ext3_journal_stop(handle); 1674 ext4_journal_stop(handle);
1675 if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries)) 1675 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
1676 goto retry; 1676 goto retry;
1677 return err; 1677 return err;
1678} 1678}
1679 1679
1680static int ext3_mknod (struct inode * dir, struct dentry *dentry, 1680static int ext4_mknod (struct inode * dir, struct dentry *dentry,
1681 int mode, dev_t rdev) 1681 int mode, dev_t rdev)
1682{ 1682{
1683 handle_t *handle; 1683 handle_t *handle;
@@ -1688,100 +1688,100 @@ static int ext3_mknod (struct inode * dir, struct dentry *dentry,
1688 return -EINVAL; 1688 return -EINVAL;
1689 1689
1690retry: 1690retry:
1691 handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + 1691 handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
1692 EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + 1692 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
1693 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); 1693 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
1694 if (IS_ERR(handle)) 1694 if (IS_ERR(handle))
1695 return PTR_ERR(handle); 1695 return PTR_ERR(handle);
1696 1696
1697 if (IS_DIRSYNC(dir)) 1697 if (IS_DIRSYNC(dir))
1698 handle->h_sync = 1; 1698 handle->h_sync = 1;
1699 1699
1700 inode = ext3_new_inode (handle, dir, mode); 1700 inode = ext4_new_inode (handle, dir, mode);
1701 err = PTR_ERR(inode); 1701 err = PTR_ERR(inode);
1702 if (!IS_ERR(inode)) { 1702 if (!IS_ERR(inode)) {
1703 init_special_inode(inode, inode->i_mode, rdev); 1703 init_special_inode(inode, inode->i_mode, rdev);
1704#ifdef CONFIG_EXT3_FS_XATTR 1704#ifdef CONFIG_EXT4DEV_FS_XATTR
1705 inode->i_op = &ext3_special_inode_operations; 1705 inode->i_op = &ext4_special_inode_operations;
1706#endif 1706#endif
1707 err = ext3_add_nondir(handle, dentry, inode); 1707 err = ext4_add_nondir(handle, dentry, inode);
1708 } 1708 }
1709 ext3_journal_stop(handle); 1709 ext4_journal_stop(handle);
1710 if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries)) 1710 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
1711 goto retry; 1711 goto retry;
1712 return err; 1712 return err;
1713} 1713}
1714 1714
1715static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode) 1715static int ext4_mkdir(struct inode * dir, struct dentry * dentry, int mode)
1716{ 1716{
1717 handle_t *handle; 1717 handle_t *handle;
1718 struct inode * inode; 1718 struct inode * inode;
1719 struct buffer_head * dir_block; 1719 struct buffer_head * dir_block;
1720 struct ext3_dir_entry_2 * de; 1720 struct ext4_dir_entry_2 * de;
1721 int err, retries = 0; 1721 int err, retries = 0;
1722 1722
1723 if (dir->i_nlink >= EXT3_LINK_MAX) 1723 if (dir->i_nlink >= EXT4_LINK_MAX)
1724 return -EMLINK; 1724 return -EMLINK;
1725 1725
1726retry: 1726retry:
1727 handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + 1727 handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
1728 EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + 1728 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
1729 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); 1729 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
1730 if (IS_ERR(handle)) 1730 if (IS_ERR(handle))
1731 return PTR_ERR(handle); 1731 return PTR_ERR(handle);
1732 1732
1733 if (IS_DIRSYNC(dir)) 1733 if (IS_DIRSYNC(dir))
1734 handle->h_sync = 1; 1734 handle->h_sync = 1;
1735 1735
1736 inode = ext3_new_inode (handle, dir, S_IFDIR | mode); 1736 inode = ext4_new_inode (handle, dir, S_IFDIR | mode);
1737 err = PTR_ERR(inode); 1737 err = PTR_ERR(inode);
1738 if (IS_ERR(inode)) 1738 if (IS_ERR(inode))
1739 goto out_stop; 1739 goto out_stop;
1740 1740
1741 inode->i_op = &ext3_dir_inode_operations; 1741 inode->i_op = &ext4_dir_inode_operations;
1742 inode->i_fop = &ext3_dir_operations; 1742 inode->i_fop = &ext4_dir_operations;
1743 inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; 1743 inode->i_size = EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize;
1744 dir_block = ext3_bread (handle, inode, 0, 1, &err); 1744 dir_block = ext4_bread (handle, inode, 0, 1, &err);
1745 if (!dir_block) { 1745 if (!dir_block) {
1746 drop_nlink(inode); /* is this nlink == 0? */ 1746 drop_nlink(inode); /* is this nlink == 0? */
1747 ext3_mark_inode_dirty(handle, inode); 1747 ext4_mark_inode_dirty(handle, inode);
1748 iput (inode); 1748 iput (inode);
1749 goto out_stop; 1749 goto out_stop;
1750 } 1750 }
1751 BUFFER_TRACE(dir_block, "get_write_access"); 1751 BUFFER_TRACE(dir_block, "get_write_access");
1752 ext3_journal_get_write_access(handle, dir_block); 1752 ext4_journal_get_write_access(handle, dir_block);
1753 de = (struct ext3_dir_entry_2 *) dir_block->b_data; 1753 de = (struct ext4_dir_entry_2 *) dir_block->b_data;
1754 de->inode = cpu_to_le32(inode->i_ino); 1754 de->inode = cpu_to_le32(inode->i_ino);
1755 de->name_len = 1; 1755 de->name_len = 1;
1756 de->rec_len = cpu_to_le16(EXT3_DIR_REC_LEN(de->name_len)); 1756 de->rec_len = cpu_to_le16(EXT4_DIR_REC_LEN(de->name_len));
1757 strcpy (de->name, "."); 1757 strcpy (de->name, ".");
1758 ext3_set_de_type(dir->i_sb, de, S_IFDIR); 1758 ext4_set_de_type(dir->i_sb, de, S_IFDIR);
1759 de = (struct ext3_dir_entry_2 *) 1759 de = (struct ext4_dir_entry_2 *)
1760 ((char *) de + le16_to_cpu(de->rec_len)); 1760 ((char *) de + le16_to_cpu(de->rec_len));
1761 de->inode = cpu_to_le32(dir->i_ino); 1761 de->inode = cpu_to_le32(dir->i_ino);
1762 de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize-EXT3_DIR_REC_LEN(1)); 1762 de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize-EXT4_DIR_REC_LEN(1));
1763 de->name_len = 2; 1763 de->name_len = 2;
1764 strcpy (de->name, ".."); 1764 strcpy (de->name, "..");
1765 ext3_set_de_type(dir->i_sb, de, S_IFDIR); 1765 ext4_set_de_type(dir->i_sb, de, S_IFDIR);
1766 inode->i_nlink = 2; 1766 inode->i_nlink = 2;
1767 BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata"); 1767 BUFFER_TRACE(dir_block, "call ext4_journal_dirty_metadata");
1768 ext3_journal_dirty_metadata(handle, dir_block); 1768 ext4_journal_dirty_metadata(handle, dir_block);
1769 brelse (dir_block); 1769 brelse (dir_block);
1770 ext3_mark_inode_dirty(handle, inode); 1770 ext4_mark_inode_dirty(handle, inode);
1771 err = ext3_add_entry (handle, dentry, inode); 1771 err = ext4_add_entry (handle, dentry, inode);
1772 if (err) { 1772 if (err) {
1773 inode->i_nlink = 0; 1773 inode->i_nlink = 0;
1774 ext3_mark_inode_dirty(handle, inode); 1774 ext4_mark_inode_dirty(handle, inode);
1775 iput (inode); 1775 iput (inode);
1776 goto out_stop; 1776 goto out_stop;
1777 } 1777 }
1778 inc_nlink(dir); 1778 inc_nlink(dir);
1779 ext3_update_dx_flag(dir); 1779 ext4_update_dx_flag(dir);
1780 ext3_mark_inode_dirty(handle, dir); 1780 ext4_mark_inode_dirty(handle, dir);
1781 d_instantiate(dentry, inode); 1781 d_instantiate(dentry, inode);
1782out_stop: 1782out_stop:
1783 ext3_journal_stop(handle); 1783 ext4_journal_stop(handle);
1784 if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries)) 1784 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
1785 goto retry; 1785 goto retry;
1786 return err; 1786 return err;
1787} 1787}
@@ -1793,59 +1793,59 @@ static int empty_dir (struct inode * inode)
1793{ 1793{
1794 unsigned long offset; 1794 unsigned long offset;
1795 struct buffer_head * bh; 1795 struct buffer_head * bh;
1796 struct ext3_dir_entry_2 * de, * de1; 1796 struct ext4_dir_entry_2 * de, * de1;
1797 struct super_block * sb; 1797 struct super_block * sb;
1798 int err = 0; 1798 int err = 0;
1799 1799
1800 sb = inode->i_sb; 1800 sb = inode->i_sb;
1801 if (inode->i_size < EXT3_DIR_REC_LEN(1) + EXT3_DIR_REC_LEN(2) || 1801 if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) ||
1802 !(bh = ext3_bread (NULL, inode, 0, 0, &err))) { 1802 !(bh = ext4_bread (NULL, inode, 0, 0, &err))) {
1803 if (err) 1803 if (err)
1804 ext3_error(inode->i_sb, __FUNCTION__, 1804 ext4_error(inode->i_sb, __FUNCTION__,
1805 "error %d reading directory #%lu offset 0", 1805 "error %d reading directory #%lu offset 0",
1806 err, inode->i_ino); 1806 err, inode->i_ino);
1807 else 1807 else
1808 ext3_warning(inode->i_sb, __FUNCTION__, 1808 ext4_warning(inode->i_sb, __FUNCTION__,
1809 "bad directory (dir #%lu) - no data block", 1809 "bad directory (dir #%lu) - no data block",
1810 inode->i_ino); 1810 inode->i_ino);
1811 return 1; 1811 return 1;
1812 } 1812 }
1813 de = (struct ext3_dir_entry_2 *) bh->b_data; 1813 de = (struct ext4_dir_entry_2 *) bh->b_data;
1814 de1 = (struct ext3_dir_entry_2 *) 1814 de1 = (struct ext4_dir_entry_2 *)
1815 ((char *) de + le16_to_cpu(de->rec_len)); 1815 ((char *) de + le16_to_cpu(de->rec_len));
1816 if (le32_to_cpu(de->inode) != inode->i_ino || 1816 if (le32_to_cpu(de->inode) != inode->i_ino ||
1817 !le32_to_cpu(de1->inode) || 1817 !le32_to_cpu(de1->inode) ||
1818 strcmp (".", de->name) || 1818 strcmp (".", de->name) ||
1819 strcmp ("..", de1->name)) { 1819 strcmp ("..", de1->name)) {
1820 ext3_warning (inode->i_sb, "empty_dir", 1820 ext4_warning (inode->i_sb, "empty_dir",
1821 "bad directory (dir #%lu) - no `.' or `..'", 1821 "bad directory (dir #%lu) - no `.' or `..'",
1822 inode->i_ino); 1822 inode->i_ino);
1823 brelse (bh); 1823 brelse (bh);
1824 return 1; 1824 return 1;
1825 } 1825 }
1826 offset = le16_to_cpu(de->rec_len) + le16_to_cpu(de1->rec_len); 1826 offset = le16_to_cpu(de->rec_len) + le16_to_cpu(de1->rec_len);
1827 de = (struct ext3_dir_entry_2 *) 1827 de = (struct ext4_dir_entry_2 *)
1828 ((char *) de1 + le16_to_cpu(de1->rec_len)); 1828 ((char *) de1 + le16_to_cpu(de1->rec_len));
1829 while (offset < inode->i_size ) { 1829 while (offset < inode->i_size ) {
1830 if (!bh || 1830 if (!bh ||
1831 (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) { 1831 (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) {
1832 err = 0; 1832 err = 0;
1833 brelse (bh); 1833 brelse (bh);
1834 bh = ext3_bread (NULL, inode, 1834 bh = ext4_bread (NULL, inode,
1835 offset >> EXT3_BLOCK_SIZE_BITS(sb), 0, &err); 1835 offset >> EXT4_BLOCK_SIZE_BITS(sb), 0, &err);
1836 if (!bh) { 1836 if (!bh) {
1837 if (err) 1837 if (err)
1838 ext3_error(sb, __FUNCTION__, 1838 ext4_error(sb, __FUNCTION__,
1839 "error %d reading directory" 1839 "error %d reading directory"
1840 " #%lu offset %lu", 1840 " #%lu offset %lu",
1841 err, inode->i_ino, offset); 1841 err, inode->i_ino, offset);
1842 offset += sb->s_blocksize; 1842 offset += sb->s_blocksize;
1843 continue; 1843 continue;
1844 } 1844 }
1845 de = (struct ext3_dir_entry_2 *) bh->b_data; 1845 de = (struct ext4_dir_entry_2 *) bh->b_data;
1846 } 1846 }
1847 if (!ext3_check_dir_entry("empty_dir", inode, de, bh, offset)) { 1847 if (!ext4_check_dir_entry("empty_dir", inode, de, bh, offset)) {
1848 de = (struct ext3_dir_entry_2 *)(bh->b_data + 1848 de = (struct ext4_dir_entry_2 *)(bh->b_data +
1849 sb->s_blocksize); 1849 sb->s_blocksize);
1850 offset = (offset | (sb->s_blocksize - 1)) + 1; 1850 offset = (offset | (sb->s_blocksize - 1)) + 1;
1851 continue; 1851 continue;
@@ -1855,57 +1855,57 @@ static int empty_dir (struct inode * inode)
1855 return 0; 1855 return 0;
1856 } 1856 }
1857 offset += le16_to_cpu(de->rec_len); 1857 offset += le16_to_cpu(de->rec_len);
1858 de = (struct ext3_dir_entry_2 *) 1858 de = (struct ext4_dir_entry_2 *)
1859 ((char *) de + le16_to_cpu(de->rec_len)); 1859 ((char *) de + le16_to_cpu(de->rec_len));
1860 } 1860 }
1861 brelse (bh); 1861 brelse (bh);
1862 return 1; 1862 return 1;
1863} 1863}
1864 1864
1865/* ext3_orphan_add() links an unlinked or truncated inode into a list of 1865/* ext4_orphan_add() links an unlinked or truncated inode into a list of
1866 * such inodes, starting at the superblock, in case we crash before the 1866 * such inodes, starting at the superblock, in case we crash before the
1867 * file is closed/deleted, or in case the inode truncate spans multiple 1867 * file is closed/deleted, or in case the inode truncate spans multiple
1868 * transactions and the last transaction is not recovered after a crash. 1868 * transactions and the last transaction is not recovered after a crash.
1869 * 1869 *
1870 * At filesystem recovery time, we walk this list deleting unlinked 1870 * At filesystem recovery time, we walk this list deleting unlinked
1871 * inodes and truncating linked inodes in ext3_orphan_cleanup(). 1871 * inodes and truncating linked inodes in ext4_orphan_cleanup().
1872 */ 1872 */
1873int ext3_orphan_add(handle_t *handle, struct inode *inode) 1873int ext4_orphan_add(handle_t *handle, struct inode *inode)
1874{ 1874{
1875 struct super_block *sb = inode->i_sb; 1875 struct super_block *sb = inode->i_sb;
1876 struct ext3_iloc iloc; 1876 struct ext4_iloc iloc;
1877 int err = 0, rc; 1877 int err = 0, rc;
1878 1878
1879 lock_super(sb); 1879 lock_super(sb);
1880 if (!list_empty(&EXT3_I(inode)->i_orphan)) 1880 if (!list_empty(&EXT4_I(inode)->i_orphan))
1881 goto out_unlock; 1881 goto out_unlock;
1882 1882
1883 /* Orphan handling is only valid for files with data blocks 1883 /* Orphan handling is only valid for files with data blocks
1884 * being truncated, or files being unlinked. */ 1884 * being truncated, or files being unlinked. */
1885 1885
1886 /* @@@ FIXME: Observation from aviro: 1886 /* @@@ FIXME: Observation from aviro:
1887 * I think I can trigger J_ASSERT in ext3_orphan_add(). We block 1887 * I think I can trigger J_ASSERT in ext4_orphan_add(). We block
1888 * here (on lock_super()), so race with ext3_link() which might bump 1888 * here (on lock_super()), so race with ext4_link() which might bump
1889 * ->i_nlink. For, say it, character device. Not a regular file, 1889 * ->i_nlink. For, say it, character device. Not a regular file,
1890 * not a directory, not a symlink and ->i_nlink > 0. 1890 * not a directory, not a symlink and ->i_nlink > 0.
1891 */ 1891 */
1892 J_ASSERT ((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || 1892 J_ASSERT ((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1893 S_ISLNK(inode->i_mode)) || inode->i_nlink == 0); 1893 S_ISLNK(inode->i_mode)) || inode->i_nlink == 0);
1894 1894
1895 BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "get_write_access"); 1895 BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "get_write_access");
1896 err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); 1896 err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh);
1897 if (err) 1897 if (err)
1898 goto out_unlock; 1898 goto out_unlock;
1899 1899
1900 err = ext3_reserve_inode_write(handle, inode, &iloc); 1900 err = ext4_reserve_inode_write(handle, inode, &iloc);
1901 if (err) 1901 if (err)
1902 goto out_unlock; 1902 goto out_unlock;
1903 1903
1904 /* Insert this inode at the head of the on-disk orphan list... */ 1904 /* Insert this inode at the head of the on-disk orphan list... */
1905 NEXT_ORPHAN(inode) = le32_to_cpu(EXT3_SB(sb)->s_es->s_last_orphan); 1905 NEXT_ORPHAN(inode) = le32_to_cpu(EXT4_SB(sb)->s_es->s_last_orphan);
1906 EXT3_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino); 1906 EXT4_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino);
1907 err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); 1907 err = ext4_journal_dirty_metadata(handle, EXT4_SB(sb)->s_sbh);
1908 rc = ext3_mark_iloc_dirty(handle, inode, &iloc); 1908 rc = ext4_mark_iloc_dirty(handle, inode, &iloc);
1909 if (!err) 1909 if (!err)
1910 err = rc; 1910 err = rc;
1911 1911
@@ -1918,28 +1918,28 @@ int ext3_orphan_add(handle_t *handle, struct inode *inode)
1918 * This is safe: on error we're going to ignore the orphan list 1918 * This is safe: on error we're going to ignore the orphan list
1919 * anyway on the next recovery. */ 1919 * anyway on the next recovery. */
1920 if (!err) 1920 if (!err)
1921 list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); 1921 list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan);
1922 1922
1923 jbd_debug(4, "superblock will point to %lu\n", inode->i_ino); 1923 jbd_debug(4, "superblock will point to %lu\n", inode->i_ino);
1924 jbd_debug(4, "orphan inode %lu will point to %d\n", 1924 jbd_debug(4, "orphan inode %lu will point to %d\n",
1925 inode->i_ino, NEXT_ORPHAN(inode)); 1925 inode->i_ino, NEXT_ORPHAN(inode));
1926out_unlock: 1926out_unlock:
1927 unlock_super(sb); 1927 unlock_super(sb);
1928 ext3_std_error(inode->i_sb, err); 1928 ext4_std_error(inode->i_sb, err);
1929 return err; 1929 return err;
1930} 1930}
1931 1931
1932/* 1932/*
1933 * ext3_orphan_del() removes an unlinked or truncated inode from the list 1933 * ext4_orphan_del() removes an unlinked or truncated inode from the list
1934 * of such inodes stored on disk, because it is finally being cleaned up. 1934 * of such inodes stored on disk, because it is finally being cleaned up.
1935 */ 1935 */
1936int ext3_orphan_del(handle_t *handle, struct inode *inode) 1936int ext4_orphan_del(handle_t *handle, struct inode *inode)
1937{ 1937{
1938 struct list_head *prev; 1938 struct list_head *prev;
1939 struct ext3_inode_info *ei = EXT3_I(inode); 1939 struct ext4_inode_info *ei = EXT4_I(inode);
1940 struct ext3_sb_info *sbi; 1940 struct ext4_sb_info *sbi;
1941 unsigned long ino_next; 1941 unsigned long ino_next;
1942 struct ext3_iloc iloc; 1942 struct ext4_iloc iloc;
1943 int err = 0; 1943 int err = 0;
1944 1944
1945 lock_super(inode->i_sb); 1945 lock_super(inode->i_sb);
@@ -1950,7 +1950,7 @@ int ext3_orphan_del(handle_t *handle, struct inode *inode)
1950 1950
1951 ino_next = NEXT_ORPHAN(inode); 1951 ino_next = NEXT_ORPHAN(inode);
1952 prev = ei->i_orphan.prev; 1952 prev = ei->i_orphan.prev;
1953 sbi = EXT3_SB(inode->i_sb); 1953 sbi = EXT4_SB(inode->i_sb);
1954 1954
1955 jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino); 1955 jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino);
1956 1956
@@ -1963,38 +1963,38 @@ int ext3_orphan_del(handle_t *handle, struct inode *inode)
1963 if (!handle) 1963 if (!handle)
1964 goto out; 1964 goto out;
1965 1965
1966 err = ext3_reserve_inode_write(handle, inode, &iloc); 1966 err = ext4_reserve_inode_write(handle, inode, &iloc);
1967 if (err) 1967 if (err)
1968 goto out_err; 1968 goto out_err;
1969 1969
1970 if (prev == &sbi->s_orphan) { 1970 if (prev == &sbi->s_orphan) {
1971 jbd_debug(4, "superblock will point to %lu\n", ino_next); 1971 jbd_debug(4, "superblock will point to %lu\n", ino_next);
1972 BUFFER_TRACE(sbi->s_sbh, "get_write_access"); 1972 BUFFER_TRACE(sbi->s_sbh, "get_write_access");
1973 err = ext3_journal_get_write_access(handle, sbi->s_sbh); 1973 err = ext4_journal_get_write_access(handle, sbi->s_sbh);
1974 if (err) 1974 if (err)
1975 goto out_brelse; 1975 goto out_brelse;
1976 sbi->s_es->s_last_orphan = cpu_to_le32(ino_next); 1976 sbi->s_es->s_last_orphan = cpu_to_le32(ino_next);
1977 err = ext3_journal_dirty_metadata(handle, sbi->s_sbh); 1977 err = ext4_journal_dirty_metadata(handle, sbi->s_sbh);
1978 } else { 1978 } else {
1979 struct ext3_iloc iloc2; 1979 struct ext4_iloc iloc2;
1980 struct inode *i_prev = 1980 struct inode *i_prev =
1981 &list_entry(prev, struct ext3_inode_info, i_orphan)->vfs_inode; 1981 &list_entry(prev, struct ext4_inode_info, i_orphan)->vfs_inode;
1982 1982
1983 jbd_debug(4, "orphan inode %lu will point to %lu\n", 1983 jbd_debug(4, "orphan inode %lu will point to %lu\n",
1984 i_prev->i_ino, ino_next); 1984 i_prev->i_ino, ino_next);
1985 err = ext3_reserve_inode_write(handle, i_prev, &iloc2); 1985 err = ext4_reserve_inode_write(handle, i_prev, &iloc2);
1986 if (err) 1986 if (err)
1987 goto out_brelse; 1987 goto out_brelse;
1988 NEXT_ORPHAN(i_prev) = ino_next; 1988 NEXT_ORPHAN(i_prev) = ino_next;
1989 err = ext3_mark_iloc_dirty(handle, i_prev, &iloc2); 1989 err = ext4_mark_iloc_dirty(handle, i_prev, &iloc2);
1990 } 1990 }
1991 if (err) 1991 if (err)
1992 goto out_brelse; 1992 goto out_brelse;
1993 NEXT_ORPHAN(inode) = 0; 1993 NEXT_ORPHAN(inode) = 0;
1994 err = ext3_mark_iloc_dirty(handle, inode, &iloc); 1994 err = ext4_mark_iloc_dirty(handle, inode, &iloc);
1995 1995
1996out_err: 1996out_err:
1997 ext3_std_error(inode->i_sb, err); 1997 ext4_std_error(inode->i_sb, err);
1998out: 1998out:
1999 unlock_super(inode->i_sb); 1999 unlock_super(inode->i_sb);
2000 return err; 2000 return err;
@@ -2004,23 +2004,23 @@ out_brelse:
2004 goto out_err; 2004 goto out_err;
2005} 2005}
2006 2006
2007static int ext3_rmdir (struct inode * dir, struct dentry *dentry) 2007static int ext4_rmdir (struct inode * dir, struct dentry *dentry)
2008{ 2008{
2009 int retval; 2009 int retval;
2010 struct inode * inode; 2010 struct inode * inode;
2011 struct buffer_head * bh; 2011 struct buffer_head * bh;
2012 struct ext3_dir_entry_2 * de; 2012 struct ext4_dir_entry_2 * de;
2013 handle_t *handle; 2013 handle_t *handle;
2014 2014
2015 /* Initialize quotas before so that eventual writes go in 2015 /* Initialize quotas before so that eventual writes go in
2016 * separate transaction */ 2016 * separate transaction */
2017 DQUOT_INIT(dentry->d_inode); 2017 DQUOT_INIT(dentry->d_inode);
2018 handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb)); 2018 handle = ext4_journal_start(dir, EXT4_DELETE_TRANS_BLOCKS(dir->i_sb));
2019 if (IS_ERR(handle)) 2019 if (IS_ERR(handle))
2020 return PTR_ERR(handle); 2020 return PTR_ERR(handle);
2021 2021
2022 retval = -ENOENT; 2022 retval = -ENOENT;
2023 bh = ext3_find_entry (dentry, &de); 2023 bh = ext4_find_entry (dentry, &de);
2024 if (!bh) 2024 if (!bh)
2025 goto end_rmdir; 2025 goto end_rmdir;
2026 2026
@@ -2037,11 +2037,11 @@ static int ext3_rmdir (struct inode * dir, struct dentry *dentry)
2037 if (!empty_dir (inode)) 2037 if (!empty_dir (inode))
2038 goto end_rmdir; 2038 goto end_rmdir;
2039 2039
2040 retval = ext3_delete_entry(handle, dir, de, bh); 2040 retval = ext4_delete_entry(handle, dir, de, bh);
2041 if (retval) 2041 if (retval)
2042 goto end_rmdir; 2042 goto end_rmdir;
2043 if (inode->i_nlink != 2) 2043 if (inode->i_nlink != 2)
2044 ext3_warning (inode->i_sb, "ext3_rmdir", 2044 ext4_warning (inode->i_sb, "ext4_rmdir",
2045 "empty directory has nlink!=2 (%d)", 2045 "empty directory has nlink!=2 (%d)",
2046 inode->i_nlink); 2046 inode->i_nlink);
2047 inode->i_version++; 2047 inode->i_version++;
@@ -2050,31 +2050,31 @@ static int ext3_rmdir (struct inode * dir, struct dentry *dentry)
2050 * zero will ensure that the right thing happens during any 2050 * zero will ensure that the right thing happens during any
2051 * recovery. */ 2051 * recovery. */
2052 inode->i_size = 0; 2052 inode->i_size = 0;
2053 ext3_orphan_add(handle, inode); 2053 ext4_orphan_add(handle, inode);
2054 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC; 2054 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
2055 ext3_mark_inode_dirty(handle, inode); 2055 ext4_mark_inode_dirty(handle, inode);
2056 drop_nlink(dir); 2056 drop_nlink(dir);
2057 ext3_update_dx_flag(dir); 2057 ext4_update_dx_flag(dir);
2058 ext3_mark_inode_dirty(handle, dir); 2058 ext4_mark_inode_dirty(handle, dir);
2059 2059
2060end_rmdir: 2060end_rmdir:
2061 ext3_journal_stop(handle); 2061 ext4_journal_stop(handle);
2062 brelse (bh); 2062 brelse (bh);
2063 return retval; 2063 return retval;
2064} 2064}
2065 2065
2066static int ext3_unlink(struct inode * dir, struct dentry *dentry) 2066static int ext4_unlink(struct inode * dir, struct dentry *dentry)
2067{ 2067{
2068 int retval; 2068 int retval;
2069 struct inode * inode; 2069 struct inode * inode;
2070 struct buffer_head * bh; 2070 struct buffer_head * bh;
2071 struct ext3_dir_entry_2 * de; 2071 struct ext4_dir_entry_2 * de;
2072 handle_t *handle; 2072 handle_t *handle;
2073 2073
2074 /* Initialize quotas before so that eventual writes go 2074 /* Initialize quotas before so that eventual writes go
2075 * in separate transaction */ 2075 * in separate transaction */
2076 DQUOT_INIT(dentry->d_inode); 2076 DQUOT_INIT(dentry->d_inode);
2077 handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb)); 2077 handle = ext4_journal_start(dir, EXT4_DELETE_TRANS_BLOCKS(dir->i_sb));
2078 if (IS_ERR(handle)) 2078 if (IS_ERR(handle))
2079 return PTR_ERR(handle); 2079 return PTR_ERR(handle);
2080 2080
@@ -2082,7 +2082,7 @@ static int ext3_unlink(struct inode * dir, struct dentry *dentry)
2082 handle->h_sync = 1; 2082 handle->h_sync = 1;
2083 2083
2084 retval = -ENOENT; 2084 retval = -ENOENT;
2085 bh = ext3_find_entry (dentry, &de); 2085 bh = ext4_find_entry (dentry, &de);
2086 if (!bh) 2086 if (!bh)
2087 goto end_unlink; 2087 goto end_unlink;
2088 2088
@@ -2093,31 +2093,31 @@ static int ext3_unlink(struct inode * dir, struct dentry *dentry)
2093 goto end_unlink; 2093 goto end_unlink;
2094 2094
2095 if (!inode->i_nlink) { 2095 if (!inode->i_nlink) {
2096 ext3_warning (inode->i_sb, "ext3_unlink", 2096 ext4_warning (inode->i_sb, "ext4_unlink",
2097 "Deleting nonexistent file (%lu), %d", 2097 "Deleting nonexistent file (%lu), %d",
2098 inode->i_ino, inode->i_nlink); 2098 inode->i_ino, inode->i_nlink);
2099 inode->i_nlink = 1; 2099 inode->i_nlink = 1;
2100 } 2100 }
2101 retval = ext3_delete_entry(handle, dir, de, bh); 2101 retval = ext4_delete_entry(handle, dir, de, bh);
2102 if (retval) 2102 if (retval)
2103 goto end_unlink; 2103 goto end_unlink;
2104 dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC; 2104 dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
2105 ext3_update_dx_flag(dir); 2105 ext4_update_dx_flag(dir);
2106 ext3_mark_inode_dirty(handle, dir); 2106 ext4_mark_inode_dirty(handle, dir);
2107 drop_nlink(inode); 2107 drop_nlink(inode);
2108 if (!inode->i_nlink) 2108 if (!inode->i_nlink)
2109 ext3_orphan_add(handle, inode); 2109 ext4_orphan_add(handle, inode);
2110 inode->i_ctime = dir->i_ctime; 2110 inode->i_ctime = dir->i_ctime;
2111 ext3_mark_inode_dirty(handle, inode); 2111 ext4_mark_inode_dirty(handle, inode);
2112 retval = 0; 2112 retval = 0;
2113 2113
2114end_unlink: 2114end_unlink:
2115 ext3_journal_stop(handle); 2115 ext4_journal_stop(handle);
2116 brelse (bh); 2116 brelse (bh);
2117 return retval; 2117 return retval;
2118} 2118}
2119 2119
2120static int ext3_symlink (struct inode * dir, 2120static int ext4_symlink (struct inode * dir,
2121 struct dentry *dentry, const char * symname) 2121 struct dentry *dentry, const char * symname)
2122{ 2122{
2123 handle_t *handle; 2123 handle_t *handle;
@@ -2129,63 +2129,63 @@ static int ext3_symlink (struct inode * dir,
2129 return -ENAMETOOLONG; 2129 return -ENAMETOOLONG;
2130 2130
2131retry: 2131retry:
2132 handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + 2132 handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
2133 EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 + 2133 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 5 +
2134 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); 2134 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb));
2135 if (IS_ERR(handle)) 2135 if (IS_ERR(handle))
2136 return PTR_ERR(handle); 2136 return PTR_ERR(handle);
2137 2137
2138 if (IS_DIRSYNC(dir)) 2138 if (IS_DIRSYNC(dir))
2139 handle->h_sync = 1; 2139 handle->h_sync = 1;
2140 2140
2141 inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO); 2141 inode = ext4_new_inode (handle, dir, S_IFLNK|S_IRWXUGO);
2142 err = PTR_ERR(inode); 2142 err = PTR_ERR(inode);
2143 if (IS_ERR(inode)) 2143 if (IS_ERR(inode))
2144 goto out_stop; 2144 goto out_stop;
2145 2145
2146 if (l > sizeof (EXT3_I(inode)->i_data)) { 2146 if (l > sizeof (EXT4_I(inode)->i_data)) {
2147 inode->i_op = &ext3_symlink_inode_operations; 2147 inode->i_op = &ext4_symlink_inode_operations;
2148 ext3_set_aops(inode); 2148 ext4_set_aops(inode);
2149 /* 2149 /*
2150 * page_symlink() calls into ext3_prepare/commit_write. 2150 * page_symlink() calls into ext4_prepare/commit_write.
2151 * We have a transaction open. All is sweetness. It also sets 2151 * We have a transaction open. All is sweetness. It also sets
2152 * i_size in generic_commit_write(). 2152 * i_size in generic_commit_write().
2153 */ 2153 */
2154 err = __page_symlink(inode, symname, l, 2154 err = __page_symlink(inode, symname, l,
2155 mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS); 2155 mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
2156 if (err) { 2156 if (err) {
2157 ext3_dec_count(handle, inode); 2157 ext4_dec_count(handle, inode);
2158 ext3_mark_inode_dirty(handle, inode); 2158 ext4_mark_inode_dirty(handle, inode);
2159 iput (inode); 2159 iput (inode);
2160 goto out_stop; 2160 goto out_stop;
2161 } 2161 }
2162 } else { 2162 } else {
2163 inode->i_op = &ext3_fast_symlink_inode_operations; 2163 inode->i_op = &ext4_fast_symlink_inode_operations;
2164 memcpy((char*)&EXT3_I(inode)->i_data,symname,l); 2164 memcpy((char*)&EXT4_I(inode)->i_data,symname,l);
2165 inode->i_size = l-1; 2165 inode->i_size = l-1;
2166 } 2166 }
2167 EXT3_I(inode)->i_disksize = inode->i_size; 2167 EXT4_I(inode)->i_disksize = inode->i_size;
2168 err = ext3_add_nondir(handle, dentry, inode); 2168 err = ext4_add_nondir(handle, dentry, inode);
2169out_stop: 2169out_stop:
2170 ext3_journal_stop(handle); 2170 ext4_journal_stop(handle);
2171 if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries)) 2171 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
2172 goto retry; 2172 goto retry;
2173 return err; 2173 return err;
2174} 2174}
2175 2175
2176static int ext3_link (struct dentry * old_dentry, 2176static int ext4_link (struct dentry * old_dentry,
2177 struct inode * dir, struct dentry *dentry) 2177 struct inode * dir, struct dentry *dentry)
2178{ 2178{
2179 handle_t *handle; 2179 handle_t *handle;
2180 struct inode *inode = old_dentry->d_inode; 2180 struct inode *inode = old_dentry->d_inode;
2181 int err, retries = 0; 2181 int err, retries = 0;
2182 2182
2183 if (inode->i_nlink >= EXT3_LINK_MAX) 2183 if (inode->i_nlink >= EXT4_LINK_MAX)
2184 return -EMLINK; 2184 return -EMLINK;
2185 2185
2186retry: 2186retry:
2187 handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + 2187 handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
2188 EXT3_INDEX_EXTRA_TRANS_BLOCKS); 2188 EXT4_INDEX_EXTRA_TRANS_BLOCKS);
2189 if (IS_ERR(handle)) 2189 if (IS_ERR(handle))
2190 return PTR_ERR(handle); 2190 return PTR_ERR(handle);
2191 2191
@@ -2193,31 +2193,31 @@ retry:
2193 handle->h_sync = 1; 2193 handle->h_sync = 1;
2194 2194
2195 inode->i_ctime = CURRENT_TIME_SEC; 2195 inode->i_ctime = CURRENT_TIME_SEC;
2196 ext3_inc_count(handle, inode); 2196 ext4_inc_count(handle, inode);
2197 atomic_inc(&inode->i_count); 2197 atomic_inc(&inode->i_count);
2198 2198
2199 err = ext3_add_nondir(handle, dentry, inode); 2199 err = ext4_add_nondir(handle, dentry, inode);
2200 ext3_journal_stop(handle); 2200 ext4_journal_stop(handle);
2201 if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries)) 2201 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
2202 goto retry; 2202 goto retry;
2203 return err; 2203 return err;
2204} 2204}
2205 2205
2206#define PARENT_INO(buffer) \ 2206#define PARENT_INO(buffer) \
2207 ((struct ext3_dir_entry_2 *) ((char *) buffer + \ 2207 ((struct ext4_dir_entry_2 *) ((char *) buffer + \
2208 le16_to_cpu(((struct ext3_dir_entry_2 *) buffer)->rec_len)))->inode 2208 le16_to_cpu(((struct ext4_dir_entry_2 *) buffer)->rec_len)))->inode
2209 2209
2210/* 2210/*
2211 * Anybody can rename anything with this: the permission checks are left to the 2211 * Anybody can rename anything with this: the permission checks are left to the
2212 * higher-level routines. 2212 * higher-level routines.
2213 */ 2213 */
2214static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry, 2214static int ext4_rename (struct inode * old_dir, struct dentry *old_dentry,
2215 struct inode * new_dir,struct dentry *new_dentry) 2215 struct inode * new_dir,struct dentry *new_dentry)
2216{ 2216{
2217 handle_t *handle; 2217 handle_t *handle;
2218 struct inode * old_inode, * new_inode; 2218 struct inode * old_inode, * new_inode;
2219 struct buffer_head * old_bh, * new_bh, * dir_bh; 2219 struct buffer_head * old_bh, * new_bh, * dir_bh;
2220 struct ext3_dir_entry_2 * old_de, * new_de; 2220 struct ext4_dir_entry_2 * old_de, * new_de;
2221 int retval; 2221 int retval;
2222 2222
2223 old_bh = new_bh = dir_bh = NULL; 2223 old_bh = new_bh = dir_bh = NULL;
@@ -2226,16 +2226,16 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
2226 * in separate transaction */ 2226 * in separate transaction */
2227 if (new_dentry->d_inode) 2227 if (new_dentry->d_inode)
2228 DQUOT_INIT(new_dentry->d_inode); 2228 DQUOT_INIT(new_dentry->d_inode);
2229 handle = ext3_journal_start(old_dir, 2 * 2229 handle = ext4_journal_start(old_dir, 2 *
2230 EXT3_DATA_TRANS_BLOCKS(old_dir->i_sb) + 2230 EXT4_DATA_TRANS_BLOCKS(old_dir->i_sb) +
2231 EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); 2231 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2);
2232 if (IS_ERR(handle)) 2232 if (IS_ERR(handle))
2233 return PTR_ERR(handle); 2233 return PTR_ERR(handle);
2234 2234
2235 if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir)) 2235 if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
2236 handle->h_sync = 1; 2236 handle->h_sync = 1;
2237 2237
2238 old_bh = ext3_find_entry (old_dentry, &old_de); 2238 old_bh = ext4_find_entry (old_dentry, &old_de);
2239 /* 2239 /*
2240 * Check for inode number is _not_ due to possible IO errors. 2240 * Check for inode number is _not_ due to possible IO errors.
2241 * We might rmdir the source, keep it as pwd of some process 2241 * We might rmdir the source, keep it as pwd of some process
@@ -2248,7 +2248,7 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
2248 goto end_rename; 2248 goto end_rename;
2249 2249
2250 new_inode = new_dentry->d_inode; 2250 new_inode = new_dentry->d_inode;
2251 new_bh = ext3_find_entry (new_dentry, &new_de); 2251 new_bh = ext4_find_entry (new_dentry, &new_de);
2252 if (new_bh) { 2252 if (new_bh) {
2253 if (!new_inode) { 2253 if (!new_inode) {
2254 brelse (new_bh); 2254 brelse (new_bh);
@@ -2262,30 +2262,30 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
2262 goto end_rename; 2262 goto end_rename;
2263 } 2263 }
2264 retval = -EIO; 2264 retval = -EIO;
2265 dir_bh = ext3_bread (handle, old_inode, 0, 0, &retval); 2265 dir_bh = ext4_bread (handle, old_inode, 0, 0, &retval);
2266 if (!dir_bh) 2266 if (!dir_bh)
2267 goto end_rename; 2267 goto end_rename;
2268 if (le32_to_cpu(PARENT_INO(dir_bh->b_data)) != old_dir->i_ino) 2268 if (le32_to_cpu(PARENT_INO(dir_bh->b_data)) != old_dir->i_ino)
2269 goto end_rename; 2269 goto end_rename;
2270 retval = -EMLINK; 2270 retval = -EMLINK;
2271 if (!new_inode && new_dir!=old_dir && 2271 if (!new_inode && new_dir!=old_dir &&
2272 new_dir->i_nlink >= EXT3_LINK_MAX) 2272 new_dir->i_nlink >= EXT4_LINK_MAX)
2273 goto end_rename; 2273 goto end_rename;
2274 } 2274 }
2275 if (!new_bh) { 2275 if (!new_bh) {
2276 retval = ext3_add_entry (handle, new_dentry, old_inode); 2276 retval = ext4_add_entry (handle, new_dentry, old_inode);
2277 if (retval) 2277 if (retval)
2278 goto end_rename; 2278 goto end_rename;
2279 } else { 2279 } else {
2280 BUFFER_TRACE(new_bh, "get write access"); 2280 BUFFER_TRACE(new_bh, "get write access");
2281 ext3_journal_get_write_access(handle, new_bh); 2281 ext4_journal_get_write_access(handle, new_bh);
2282 new_de->inode = cpu_to_le32(old_inode->i_ino); 2282 new_de->inode = cpu_to_le32(old_inode->i_ino);
2283 if (EXT3_HAS_INCOMPAT_FEATURE(new_dir->i_sb, 2283 if (EXT4_HAS_INCOMPAT_FEATURE(new_dir->i_sb,
2284 EXT3_FEATURE_INCOMPAT_FILETYPE)) 2284 EXT4_FEATURE_INCOMPAT_FILETYPE))
2285 new_de->file_type = old_de->file_type; 2285 new_de->file_type = old_de->file_type;
2286 new_dir->i_version++; 2286 new_dir->i_version++;
2287 BUFFER_TRACE(new_bh, "call ext3_journal_dirty_metadata"); 2287 BUFFER_TRACE(new_bh, "call ext4_journal_dirty_metadata");
2288 ext3_journal_dirty_metadata(handle, new_bh); 2288 ext4_journal_dirty_metadata(handle, new_bh);
2289 brelse(new_bh); 2289 brelse(new_bh);
2290 new_bh = NULL; 2290 new_bh = NULL;
2291 } 2291 }
@@ -2295,7 +2295,7 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
2295 * rename. 2295 * rename.
2296 */ 2296 */
2297 old_inode->i_ctime = CURRENT_TIME_SEC; 2297 old_inode->i_ctime = CURRENT_TIME_SEC;
2298 ext3_mark_inode_dirty(handle, old_inode); 2298 ext4_mark_inode_dirty(handle, old_inode);
2299 2299
2300 /* 2300 /*
2301 * ok, that's it 2301 * ok, that's it
@@ -2303,24 +2303,24 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
2303 if (le32_to_cpu(old_de->inode) != old_inode->i_ino || 2303 if (le32_to_cpu(old_de->inode) != old_inode->i_ino ||
2304 old_de->name_len != old_dentry->d_name.len || 2304 old_de->name_len != old_dentry->d_name.len ||
2305 strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || 2305 strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) ||
2306 (retval = ext3_delete_entry(handle, old_dir, 2306 (retval = ext4_delete_entry(handle, old_dir,
2307 old_de, old_bh)) == -ENOENT) { 2307 old_de, old_bh)) == -ENOENT) {
2308 /* old_de could have moved from under us during htree split, so 2308 /* old_de could have moved from under us during htree split, so
2309 * make sure that we are deleting the right entry. We might 2309 * make sure that we are deleting the right entry. We might
2310 * also be pointing to a stale entry in the unused part of 2310 * also be pointing to a stale entry in the unused part of
2311 * old_bh so just checking inum and the name isn't enough. */ 2311 * old_bh so just checking inum and the name isn't enough. */
2312 struct buffer_head *old_bh2; 2312 struct buffer_head *old_bh2;
2313 struct ext3_dir_entry_2 *old_de2; 2313 struct ext4_dir_entry_2 *old_de2;
2314 2314
2315 old_bh2 = ext3_find_entry(old_dentry, &old_de2); 2315 old_bh2 = ext4_find_entry(old_dentry, &old_de2);
2316 if (old_bh2) { 2316 if (old_bh2) {
2317 retval = ext3_delete_entry(handle, old_dir, 2317 retval = ext4_delete_entry(handle, old_dir,
2318 old_de2, old_bh2); 2318 old_de2, old_bh2);
2319 brelse(old_bh2); 2319 brelse(old_bh2);
2320 } 2320 }
2321 } 2321 }
2322 if (retval) { 2322 if (retval) {
2323 ext3_warning(old_dir->i_sb, "ext3_rename", 2323 ext4_warning(old_dir->i_sb, "ext4_rename",
2324 "Deleting old file (%lu), %d, error=%d", 2324 "Deleting old file (%lu), %d, error=%d",
2325 old_dir->i_ino, old_dir->i_nlink, retval); 2325 old_dir->i_ino, old_dir->i_nlink, retval);
2326 } 2326 }
@@ -2330,27 +2330,27 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
2330 new_inode->i_ctime = CURRENT_TIME_SEC; 2330 new_inode->i_ctime = CURRENT_TIME_SEC;
2331 } 2331 }
2332 old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME_SEC; 2332 old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME_SEC;
2333 ext3_update_dx_flag(old_dir); 2333 ext4_update_dx_flag(old_dir);
2334 if (dir_bh) { 2334 if (dir_bh) {
2335 BUFFER_TRACE(dir_bh, "get_write_access"); 2335 BUFFER_TRACE(dir_bh, "get_write_access");
2336 ext3_journal_get_write_access(handle, dir_bh); 2336 ext4_journal_get_write_access(handle, dir_bh);
2337 PARENT_INO(dir_bh->b_data) = cpu_to_le32(new_dir->i_ino); 2337 PARENT_INO(dir_bh->b_data) = cpu_to_le32(new_dir->i_ino);
2338 BUFFER_TRACE(dir_bh, "call ext3_journal_dirty_metadata"); 2338 BUFFER_TRACE(dir_bh, "call ext4_journal_dirty_metadata");
2339 ext3_journal_dirty_metadata(handle, dir_bh); 2339 ext4_journal_dirty_metadata(handle, dir_bh);
2340 drop_nlink(old_dir); 2340 drop_nlink(old_dir);
2341 if (new_inode) { 2341 if (new_inode) {
2342 drop_nlink(new_inode); 2342 drop_nlink(new_inode);
2343 } else { 2343 } else {
2344 inc_nlink(new_dir); 2344 inc_nlink(new_dir);
2345 ext3_update_dx_flag(new_dir); 2345 ext4_update_dx_flag(new_dir);
2346 ext3_mark_inode_dirty(handle, new_dir); 2346 ext4_mark_inode_dirty(handle, new_dir);
2347 } 2347 }
2348 } 2348 }
2349 ext3_mark_inode_dirty(handle, old_dir); 2349 ext4_mark_inode_dirty(handle, old_dir);
2350 if (new_inode) { 2350 if (new_inode) {
2351 ext3_mark_inode_dirty(handle, new_inode); 2351 ext4_mark_inode_dirty(handle, new_inode);
2352 if (!new_inode->i_nlink) 2352 if (!new_inode->i_nlink)
2353 ext3_orphan_add(handle, new_inode); 2353 ext4_orphan_add(handle, new_inode);
2354 } 2354 }
2355 retval = 0; 2355 retval = 0;
2356 2356
@@ -2358,40 +2358,40 @@ end_rename:
2358 brelse (dir_bh); 2358 brelse (dir_bh);
2359 brelse (old_bh); 2359 brelse (old_bh);
2360 brelse (new_bh); 2360 brelse (new_bh);
2361 ext3_journal_stop(handle); 2361 ext4_journal_stop(handle);
2362 return retval; 2362 return retval;
2363} 2363}
2364 2364
2365/* 2365/*
2366 * directories can handle most operations... 2366 * directories can handle most operations...
2367 */ 2367 */
2368struct inode_operations ext3_dir_inode_operations = { 2368struct inode_operations ext4_dir_inode_operations = {
2369 .create = ext3_create, 2369 .create = ext4_create,
2370 .lookup = ext3_lookup, 2370 .lookup = ext4_lookup,
2371 .link = ext3_link, 2371 .link = ext4_link,
2372 .unlink = ext3_unlink, 2372 .unlink = ext4_unlink,
2373 .symlink = ext3_symlink, 2373 .symlink = ext4_symlink,
2374 .mkdir = ext3_mkdir, 2374 .mkdir = ext4_mkdir,
2375 .rmdir = ext3_rmdir, 2375 .rmdir = ext4_rmdir,
2376 .mknod = ext3_mknod, 2376 .mknod = ext4_mknod,
2377 .rename = ext3_rename, 2377 .rename = ext4_rename,
2378 .setattr = ext3_setattr, 2378 .setattr = ext4_setattr,
2379#ifdef CONFIG_EXT3_FS_XATTR 2379#ifdef CONFIG_EXT4DEV_FS_XATTR
2380 .setxattr = generic_setxattr, 2380 .setxattr = generic_setxattr,
2381 .getxattr = generic_getxattr, 2381 .getxattr = generic_getxattr,
2382 .listxattr = ext3_listxattr, 2382 .listxattr = ext4_listxattr,
2383 .removexattr = generic_removexattr, 2383 .removexattr = generic_removexattr,
2384#endif 2384#endif
2385 .permission = ext3_permission, 2385 .permission = ext4_permission,
2386}; 2386};
2387 2387
2388struct inode_operations ext3_special_inode_operations = { 2388struct inode_operations ext4_special_inode_operations = {
2389 .setattr = ext3_setattr, 2389 .setattr = ext4_setattr,
2390#ifdef CONFIG_EXT3_FS_XATTR 2390#ifdef CONFIG_EXT4DEV_FS_XATTR
2391 .setxattr = generic_setxattr, 2391 .setxattr = generic_setxattr,
2392 .getxattr = generic_getxattr, 2392 .getxattr = generic_getxattr,
2393 .listxattr = ext3_listxattr, 2393 .listxattr = ext4_listxattr,
2394 .removexattr = generic_removexattr, 2394 .removexattr = generic_removexattr,
2395#endif 2395#endif
2396 .permission = ext3_permission, 2396 .permission = ext4_permission,
2397}; 2397};