aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Dilger <adilger@dilger.ca>2015-06-15 14:50:26 -0400
committerTheodore Ts'o <tytso@mit.edu>2015-06-15 14:50:26 -0400
commitb03a2f7eb21cc06b541142684abf7eed6aaccf3e (patch)
tree0d16b5c10f1cb7228febb67e37b86ef1aabbc1d6
parent6f6a6fda294506dfe0e3e0a253bb2d2923f28f0a (diff)
ext4: improve warning directory handling messages
Several ext4_warning() messages in the directory handling code do not report the inode number of the (potentially corrupt) directory where a problem is seen, and others report this in an ad-hoc manner. Add an ext4_warning_inode() helper to print the inode number and command name consistent with ext4_error_inode(). Consolidate the place in ext4.h that these macros are defined. Clean up some other directory error and warning messages to print the calling function name. Minor code style fixes in nearby lines. Signed-off-by: Andreas Dilger <adilger@dilger.ca> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r--fs/ext4/ext4.h28
-rw-r--r--fs/ext4/namei.c125
-rw-r--r--fs/ext4/super.c25
3 files changed, 109 insertions, 69 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 3ab7cd835e4c..02a5762f1971 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -69,15 +69,6 @@
69#define ext_debug(fmt, ...) no_printk(fmt, ##__VA_ARGS__) 69#define ext_debug(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
70#endif 70#endif
71 71
72#define EXT4_ERROR_INODE(inode, fmt, a...) \
73 ext4_error_inode((inode), __func__, __LINE__, 0, (fmt), ## a)
74
75#define EXT4_ERROR_INODE_BLOCK(inode, block, fmt, a...) \
76 ext4_error_inode((inode), __func__, __LINE__, (block), (fmt), ## a)
77
78#define EXT4_ERROR_FILE(file, block, fmt, a...) \
79 ext4_error_file((file), __func__, __LINE__, (block), (fmt), ## a)
80
81/* data type for block offset of block group */ 72/* data type for block offset of block group */
82typedef int ext4_grpblk_t; 73typedef int ext4_grpblk_t;
83 74
@@ -2405,6 +2396,9 @@ void __ext4_abort(struct super_block *, const char *, unsigned int,
2405extern __printf(4, 5) 2396extern __printf(4, 5)
2406void __ext4_warning(struct super_block *, const char *, unsigned int, 2397void __ext4_warning(struct super_block *, const char *, unsigned int,
2407 const char *, ...); 2398 const char *, ...);
2399extern __printf(4, 5)
2400void __ext4_warning_inode(const struct inode *inode, const char *function,
2401 unsigned int line, const char *fmt, ...);
2408extern __printf(3, 4) 2402extern __printf(3, 4)
2409void __ext4_msg(struct super_block *, const char *, const char *, ...); 2403void __ext4_msg(struct super_block *, const char *, const char *, ...);
2410extern void __dump_mmp_msg(struct super_block *, struct mmp_struct *mmp, 2404extern void __dump_mmp_msg(struct super_block *, struct mmp_struct *mmp,
@@ -2415,6 +2409,15 @@ void __ext4_grp_locked_error(const char *, unsigned int,
2415 unsigned long, ext4_fsblk_t, 2409 unsigned long, ext4_fsblk_t,
2416 const char *, ...); 2410 const char *, ...);
2417 2411
2412#define EXT4_ERROR_INODE(inode, fmt, a...) \
2413 ext4_error_inode((inode), __func__, __LINE__, 0, (fmt), ## a)
2414
2415#define EXT4_ERROR_INODE_BLOCK(inode, block, fmt, a...) \
2416 ext4_error_inode((inode), __func__, __LINE__, (block), (fmt), ## a)
2417
2418#define EXT4_ERROR_FILE(file, block, fmt, a...) \
2419 ext4_error_file((file), __func__, __LINE__, (block), (fmt), ## a)
2420
2418#ifdef CONFIG_PRINTK 2421#ifdef CONFIG_PRINTK
2419 2422
2420#define ext4_error_inode(inode, func, line, block, fmt, ...) \ 2423#define ext4_error_inode(inode, func, line, block, fmt, ...) \
@@ -2427,6 +2430,8 @@ void __ext4_grp_locked_error(const char *, unsigned int,
2427 __ext4_abort(sb, __func__, __LINE__, fmt, ##__VA_ARGS__) 2430 __ext4_abort(sb, __func__, __LINE__, fmt, ##__VA_ARGS__)
2428#define ext4_warning(sb, fmt, ...) \ 2431#define ext4_warning(sb, fmt, ...) \
2429 __ext4_warning(sb, __func__, __LINE__, fmt, ##__VA_ARGS__) 2432 __ext4_warning(sb, __func__, __LINE__, fmt, ##__VA_ARGS__)
2433#define ext4_warning_inode(inode, fmt, ...) \
2434 __ext4_warning_inode(inode, __func__, __LINE__, fmt, ##__VA_ARGS__)
2430#define ext4_msg(sb, level, fmt, ...) \ 2435#define ext4_msg(sb, level, fmt, ...) \
2431 __ext4_msg(sb, level, fmt, ##__VA_ARGS__) 2436 __ext4_msg(sb, level, fmt, ##__VA_ARGS__)
2432#define dump_mmp_msg(sb, mmp, msg) \ 2437#define dump_mmp_msg(sb, mmp, msg) \
@@ -2462,6 +2467,11 @@ do { \
2462 no_printk(fmt, ##__VA_ARGS__); \ 2467 no_printk(fmt, ##__VA_ARGS__); \
2463 __ext4_warning(sb, "", 0, " "); \ 2468 __ext4_warning(sb, "", 0, " "); \
2464} while (0) 2469} while (0)
2470#define ext4_warning_inode(inode, fmt, ...) \
2471do { \
2472 no_printk(fmt, ##__VA_ARGS__); \
2473 __ext4_warning_inode(inode, "", 0, " "); \
2474} while (0)
2465#define ext4_msg(sb, level, fmt, ...) \ 2475#define ext4_msg(sb, level, fmt, ...) \
2466do { \ 2476do { \
2467 no_printk(fmt, ##__VA_ARGS__); \ 2477 no_printk(fmt, ##__VA_ARGS__); \
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index bda4a5d6f5a5..5e7676f1e82f 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -84,12 +84,13 @@ typedef enum {
84} dirblock_type_t; 84} dirblock_type_t;
85 85
86#define ext4_read_dirblock(inode, block, type) \ 86#define ext4_read_dirblock(inode, block, type) \
87 __ext4_read_dirblock((inode), (block), (type), __LINE__) 87 __ext4_read_dirblock((inode), (block), (type), __func__, __LINE__)
88 88
89static struct buffer_head *__ext4_read_dirblock(struct inode *inode, 89static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
90 ext4_lblk_t block, 90 ext4_lblk_t block,
91 dirblock_type_t type, 91 dirblock_type_t type,
92 unsigned int line) 92 const char *func,
93 unsigned int line)
93{ 94{
94 struct buffer_head *bh; 95 struct buffer_head *bh;
95 struct ext4_dir_entry *dirent; 96 struct ext4_dir_entry *dirent;
@@ -97,15 +98,17 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
97 98
98 bh = ext4_bread(NULL, inode, block, 0); 99 bh = ext4_bread(NULL, inode, block, 0);
99 if (IS_ERR(bh)) { 100 if (IS_ERR(bh)) {
100 __ext4_warning(inode->i_sb, __func__, line, 101 __ext4_warning(inode->i_sb, func, line,
101 "error %ld reading directory block " 102 "inode #%lu: lblock %lu: comm %s: "
102 "(ino %lu, block %lu)", PTR_ERR(bh), inode->i_ino, 103 "error %ld reading directory block",
103 (unsigned long) block); 104 inode->i_ino, (unsigned long)block,
105 current->comm, PTR_ERR(bh));
104 106
105 return bh; 107 return bh;
106 } 108 }
107 if (!bh) { 109 if (!bh) {
108 ext4_error_inode(inode, __func__, line, block, "Directory hole found"); 110 ext4_error_inode(inode, func, line, block,
111 "Directory hole found");
109 return ERR_PTR(-EIO); 112 return ERR_PTR(-EIO);
110 } 113 }
111 dirent = (struct ext4_dir_entry *) bh->b_data; 114 dirent = (struct ext4_dir_entry *) bh->b_data;
@@ -119,7 +122,7 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
119 is_dx_block = 1; 122 is_dx_block = 1;
120 } 123 }
121 if (!is_dx_block && type == INDEX) { 124 if (!is_dx_block && type == INDEX) {
122 ext4_error_inode(inode, __func__, line, block, 125 ext4_error_inode(inode, func, line, block,
123 "directory leaf block found instead of index block"); 126 "directory leaf block found instead of index block");
124 return ERR_PTR(-EIO); 127 return ERR_PTR(-EIO);
125 } 128 }
@@ -136,8 +139,8 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
136 if (ext4_dx_csum_verify(inode, dirent)) 139 if (ext4_dx_csum_verify(inode, dirent))
137 set_buffer_verified(bh); 140 set_buffer_verified(bh);
138 else { 141 else {
139 ext4_error_inode(inode, __func__, line, block, 142 ext4_error_inode(inode, func, line, block,
140 "Directory index failed checksum"); 143 "Directory index failed checksum");
141 brelse(bh); 144 brelse(bh);
142 return ERR_PTR(-EIO); 145 return ERR_PTR(-EIO);
143 } 146 }
@@ -146,8 +149,8 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
146 if (ext4_dirent_csum_verify(inode, dirent)) 149 if (ext4_dirent_csum_verify(inode, dirent))
147 set_buffer_verified(bh); 150 set_buffer_verified(bh);
148 else { 151 else {
149 ext4_error_inode(inode, __func__, line, block, 152 ext4_error_inode(inode, func, line, block,
150 "Directory block failed checksum"); 153 "Directory block failed checksum");
151 brelse(bh); 154 brelse(bh);
152 return ERR_PTR(-EIO); 155 return ERR_PTR(-EIO);
153 } 156 }
@@ -327,10 +330,14 @@ static __le32 ext4_dirent_csum(struct inode *inode,
327 return cpu_to_le32(csum); 330 return cpu_to_le32(csum);
328} 331}
329 332
330static void warn_no_space_for_csum(struct inode *inode) 333#define warn_no_space_for_csum(inode) \
334 __warn_no_space_for_csum((inode), __func__, __LINE__)
335
336static void __warn_no_space_for_csum(struct inode *inode, const char *func,
337 unsigned int line)
331{ 338{
332 ext4_warning(inode->i_sb, "no space in directory inode %lu leaf for " 339 __ext4_warning_inode(inode, func, line,
333 "checksum. Please run e2fsck -D.", inode->i_ino); 340 "No space for directory leaf checksum. Please run e2fsck -D.");
334} 341}
335 342
336int ext4_dirent_csum_verify(struct inode *inode, struct ext4_dir_entry *dirent) 343int ext4_dirent_csum_verify(struct inode *inode, struct ext4_dir_entry *dirent)
@@ -738,8 +745,8 @@ dx_probe(struct ext4_filename *fname, struct inode *dir,
738 if (root->info.hash_version != DX_HASH_TEA && 745 if (root->info.hash_version != DX_HASH_TEA &&
739 root->info.hash_version != DX_HASH_HALF_MD4 && 746 root->info.hash_version != DX_HASH_HALF_MD4 &&
740 root->info.hash_version != DX_HASH_LEGACY) { 747 root->info.hash_version != DX_HASH_LEGACY) {
741 ext4_warning(dir->i_sb, "Unrecognised inode hash code %d", 748 ext4_warning_inode(dir, "Unrecognised inode hash code %u",
742 root->info.hash_version); 749 root->info.hash_version);
743 goto fail; 750 goto fail;
744 } 751 }
745 if (fname) 752 if (fname)
@@ -753,23 +760,26 @@ dx_probe(struct ext4_filename *fname, struct inode *dir,
753 hash = hinfo->hash; 760 hash = hinfo->hash;
754 761
755 if (root->info.unused_flags & 1) { 762 if (root->info.unused_flags & 1) {
756 ext4_warning(dir->i_sb, "Unimplemented inode hash flags: %#06x", 763 ext4_warning_inode(dir, "Unimplemented hash flags: %#06x",
757 root->info.unused_flags); 764 root->info.unused_flags);
758 goto fail; 765 goto fail;
759 } 766 }
760 767
761 if ((indirect = root->info.indirect_levels) > 1) { 768 indirect = root->info.indirect_levels;
762 ext4_warning(dir->i_sb, "Unimplemented inode hash depth: %#06x", 769 if (indirect > 1) {
763 root->info.indirect_levels); 770 ext4_warning_inode(dir, "Unimplemented hash depth: %#06x",
771 root->info.indirect_levels);
764 goto fail; 772 goto fail;
765 } 773 }
766 774
767 entries = (struct dx_entry *) (((char *)&root->info) + 775 entries = (struct dx_entry *)(((char *)&root->info) +
768 root->info.info_length); 776 root->info.info_length);
769 777
770 if (dx_get_limit(entries) != dx_root_limit(dir, 778 if (dx_get_limit(entries) != dx_root_limit(dir,
771 root->info.info_length)) { 779 root->info.info_length)) {
772 ext4_warning(dir->i_sb, "dx entry: limit != root limit"); 780 ext4_warning_inode(dir, "dx entry: limit %u != root limit %u",
781 dx_get_limit(entries),
782 dx_root_limit(dir, root->info.info_length));
773 goto fail; 783 goto fail;
774 } 784 }
775 785
@@ -777,15 +787,16 @@ dx_probe(struct ext4_filename *fname, struct inode *dir,
777 while (1) { 787 while (1) {
778 count = dx_get_count(entries); 788 count = dx_get_count(entries);
779 if (!count || count > dx_get_limit(entries)) { 789 if (!count || count > dx_get_limit(entries)) {
780 ext4_warning(dir->i_sb, 790 ext4_warning_inode(dir,
781 "dx entry: no count or count > limit"); 791 "dx entry: count %u beyond limit %u",
792 count, dx_get_limit(entries));
782 goto fail; 793 goto fail;
783 } 794 }
784 795
785 p = entries + 1; 796 p = entries + 1;
786 q = entries + count - 1; 797 q = entries + count - 1;
787 while (p <= q) { 798 while (p <= q) {
788 m = p + (q - p)/2; 799 m = p + (q - p) / 2;
789 dxtrace(printk(".")); 800 dxtrace(printk("."));
790 if (dx_get_hash(m) > hash) 801 if (dx_get_hash(m) > hash)
791 q = m - 1; 802 q = m - 1;
@@ -809,7 +820,8 @@ dx_probe(struct ext4_filename *fname, struct inode *dir,
809 } 820 }
810 821
811 at = p - 1; 822 at = p - 1;
812 dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); 823 dxtrace(printk(" %x->%u\n", at == entries ? 0 : dx_get_hash(at),
824 dx_get_block(at)));
813 frame->entries = entries; 825 frame->entries = entries;
814 frame->at = at; 826 frame->at = at;
815 if (!indirect--) 827 if (!indirect--)
@@ -823,9 +835,10 @@ dx_probe(struct ext4_filename *fname, struct inode *dir,
823 } 835 }
824 entries = ((struct dx_node *) frame->bh->b_data)->entries; 836 entries = ((struct dx_node *) frame->bh->b_data)->entries;
825 837
826 if (dx_get_limit(entries) != dx_node_limit (dir)) { 838 if (dx_get_limit(entries) != dx_node_limit(dir)) {
827 ext4_warning(dir->i_sb, 839 ext4_warning_inode(dir,
828 "dx entry: limit != node limit"); 840 "dx entry: limit %u != node limit %u",
841 dx_get_limit(entries), dx_node_limit(dir));
829 goto fail; 842 goto fail;
830 } 843 }
831 } 844 }
@@ -836,18 +849,17 @@ fail:
836 } 849 }
837 850
838 if (ret_err == ERR_PTR(ERR_BAD_DX_DIR)) 851 if (ret_err == ERR_PTR(ERR_BAD_DX_DIR))
839 ext4_warning(dir->i_sb, 852 ext4_warning_inode(dir,
840 "Corrupt dir inode %lu, running e2fsck is " 853 "Corrupt directory, running e2fsck is recommended");
841 "recommended.", dir->i_ino);
842 return ret_err; 854 return ret_err;
843} 855}
844 856
845static void dx_release (struct dx_frame *frames) 857static void dx_release(struct dx_frame *frames)
846{ 858{
847 if (frames[0].bh == NULL) 859 if (frames[0].bh == NULL)
848 return; 860 return;
849 861
850 if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) 862 if (((struct dx_root *)frames[0].bh->b_data)->info.indirect_levels)
851 brelse(frames[1].bh); 863 brelse(frames[1].bh);
852 brelse(frames[0].bh); 864 brelse(frames[0].bh);
853} 865}
@@ -1524,9 +1536,9 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir,
1524 retval = ext4_htree_next_block(dir, fname->hinfo.hash, frame, 1536 retval = ext4_htree_next_block(dir, fname->hinfo.hash, frame,
1525 frames, NULL); 1537 frames, NULL);
1526 if (retval < 0) { 1538 if (retval < 0) {
1527 ext4_warning(sb, 1539 ext4_warning_inode(dir,
1528 "error %d reading index page in directory #%lu", 1540 "error %d reading directory index block",
1529 retval, dir->i_ino); 1541 retval);
1530 bh = ERR_PTR(retval); 1542 bh = ERR_PTR(retval);
1531 goto errout; 1543 goto errout;
1532 } 1544 }
@@ -2187,7 +2199,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname,
2187 2199
2188 if (levels && (dx_get_count(frames->entries) == 2200 if (levels && (dx_get_count(frames->entries) ==
2189 dx_get_limit(frames->entries))) { 2201 dx_get_limit(frames->entries))) {
2190 ext4_warning(sb, "Directory index full!"); 2202 ext4_warning_inode(dir, "Directory index full!");
2191 err = -ENOSPC; 2203 err = -ENOSPC;
2192 goto cleanup; 2204 goto cleanup;
2193 } 2205 }
@@ -2678,12 +2690,9 @@ int ext4_empty_dir(struct inode *inode)
2678 de = (struct ext4_dir_entry_2 *) bh->b_data; 2690 de = (struct ext4_dir_entry_2 *) bh->b_data;
2679 de1 = ext4_next_entry(de, sb->s_blocksize); 2691 de1 = ext4_next_entry(de, sb->s_blocksize);
2680 if (le32_to_cpu(de->inode) != inode->i_ino || 2692 if (le32_to_cpu(de->inode) != inode->i_ino ||
2681 !le32_to_cpu(de1->inode) || 2693 le32_to_cpu(de1->inode) == 0 ||
2682 strcmp(".", de->name) || 2694 strcmp(".", de->name) || strcmp("..", de1->name)) {
2683 strcmp("..", de1->name)) { 2695 ext4_warning_inode(inode, "directory missing '.' and/or '..'");
2684 ext4_warning(inode->i_sb,
2685 "bad directory (dir #%lu) - no `.' or `..'",
2686 inode->i_ino);
2687 brelse(bh); 2696 brelse(bh);
2688 return 1; 2697 return 1;
2689 } 2698 }
@@ -2936,8 +2945,9 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry)
2936 if (retval) 2945 if (retval)
2937 goto end_rmdir; 2946 goto end_rmdir;
2938 if (!EXT4_DIR_LINK_EMPTY(inode)) 2947 if (!EXT4_DIR_LINK_EMPTY(inode))
2939 ext4_warning(inode->i_sb, 2948 ext4_warning_inode(inode,
2940 "empty directory has too many links (%d)", 2949 "empty directory '%.*s' has too many links (%u)",
2950 dentry->d_name.len, dentry->d_name.name,
2941 inode->i_nlink); 2951 inode->i_nlink);
2942 inode->i_version++; 2952 inode->i_version++;
2943 clear_nlink(inode); 2953 clear_nlink(inode);
@@ -2997,10 +3007,9 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
2997 if (IS_DIRSYNC(dir)) 3007 if (IS_DIRSYNC(dir))
2998 ext4_handle_sync(handle); 3008 ext4_handle_sync(handle);
2999 3009
3000 if (!inode->i_nlink) { 3010 if (inode->i_nlink == 0) {
3001 ext4_warning(inode->i_sb, 3011 ext4_warning_inode(inode, "Deleting file '%.*s' with no links",
3002 "Deleting nonexistent file (%lu), %d", 3012 dentry->d_name.len, dentry->d_name.name);
3003 inode->i_ino, inode->i_nlink);
3004 set_nlink(inode, 1); 3013 set_nlink(inode, 1);
3005 } 3014 }
3006 retval = ext4_delete_entry(handle, dir, de, bh); 3015 retval = ext4_delete_entry(handle, dir, de, bh);
@@ -3385,9 +3394,9 @@ static void ext4_rename_delete(handle_t *handle, struct ext4_renament *ent,
3385 } 3394 }
3386 3395
3387 if (retval) { 3396 if (retval) {
3388 ext4_warning(ent->dir->i_sb, 3397 ext4_warning_inode(ent->dir,
3389 "Deleting old file (%lu), %d, error=%d", 3398 "Deleting old file: nlink %d, error=%d",
3390 ent->dir->i_ino, ent->dir->i_nlink, retval); 3399 ent->dir->i_nlink, retval);
3391 } 3400 }
3392} 3401}
3393 3402
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index e13fe40d4a51..fdac076e0791 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -591,14 +591,17 @@ void __ext4_msg(struct super_block *sb,
591 va_end(args); 591 va_end(args);
592} 592}
593 593
594#define ext4_warning_ratelimit(sb) \
595 ___ratelimit(&(EXT4_SB(sb)->s_warning_ratelimit_state), \
596 "EXT4-fs warning")
597
594void __ext4_warning(struct super_block *sb, const char *function, 598void __ext4_warning(struct super_block *sb, const char *function,
595 unsigned int line, const char *fmt, ...) 599 unsigned int line, const char *fmt, ...)
596{ 600{
597 struct va_format vaf; 601 struct va_format vaf;
598 va_list args; 602 va_list args;
599 603
600 if (!___ratelimit(&(EXT4_SB(sb)->s_warning_ratelimit_state), 604 if (!ext4_warning_ratelimit(sb))
601 "EXT4-fs warning"))
602 return; 605 return;
603 606
604 va_start(args, fmt); 607 va_start(args, fmt);
@@ -609,6 +612,24 @@ void __ext4_warning(struct super_block *sb, const char *function,
609 va_end(args); 612 va_end(args);
610} 613}
611 614
615void __ext4_warning_inode(const struct inode *inode, const char *function,
616 unsigned int line, const char *fmt, ...)
617{
618 struct va_format vaf;
619 va_list args;
620
621 if (!ext4_warning_ratelimit(inode->i_sb))
622 return;
623
624 va_start(args, fmt);
625 vaf.fmt = fmt;
626 vaf.va = &args;
627 printk(KERN_WARNING "EXT4-fs warning (device %s): %s:%d: "
628 "inode #%lu: comm %s: %pV\n", inode->i_sb->s_id,
629 function, line, inode->i_ino, current->comm, &vaf);
630 va_end(args);
631}
632
612void __ext4_grp_locked_error(const char *function, unsigned int line, 633void __ext4_grp_locked_error(const char *function, unsigned int line,
613 struct super_block *sb, ext4_group_t grp, 634 struct super_block *sb, ext4_group_t grp,
614 unsigned long ino, ext4_fsblk_t block, 635 unsigned long ino, ext4_fsblk_t block,