(resend, this one got lost? Got an acked-by from Andreas last go-round) (Andrew, Ted, should I be splitting out ext3 and ext4 patches and sending separately...?)
Thanks, -Eric ---------- A corrupt ondisk hash dir limit will trip an assert in dx_probe, which calls BUG(). Instead, we can just issue the warning and fail dx_probe like the other 3 tests just before it. Thanks to aviro for suggesting this... Tested with a hand-crafted corrupt ext3 image, issues: EXT3-fs warning (device loop0): dx_probe: Corrupt limit in dir inode 14337 vs. previous: Assertion failure in dx_probe() at fs/ext3/namei.c:383: "dx_get_limit(entries) == dx_root_limit(dir, root->info.info_length)" ------------[ cut here ]------------ kernel BUG at fs/ext3/namei.c:383! ... Signed-off-by: Eric Sandeen <[EMAIL PROTECTED]> Index: linux-2.6.22-rc4/fs/ext3/namei.c =================================================================== --- linux-2.6.22-rc4.orig/fs/ext3/namei.c +++ linux-2.6.22-rc4/fs/ext3/namei.c @@ -379,8 +379,16 @@ dx_probe(struct dentry *dentry, struct i entries = (struct dx_entry *) (((char *)&root->info) + root->info.info_length); - assert(dx_get_limit(entries) == dx_root_limit(dir, - root->info.info_length)); + + if (dx_get_limit(entries) != dx_root_limit(dir, + root->info.info_length)) { + ext3_warning(dir->i_sb, __FUNCTION__, + "Corrupt limit in dir inode %ld\n", dir->i_ino); + brelse(bh); + *err = ERR_BAD_DX_DIR; + goto fail; + } + dxtrace (printk("Look up %x", hash)); while (1) { Index: linux-2.6.22-rc4/fs/ext4/namei.c =================================================================== --- linux-2.6.22-rc4.orig/fs/ext4/namei.c +++ linux-2.6.22-rc4/fs/ext4/namei.c @@ -379,8 +379,16 @@ dx_probe(struct dentry *dentry, struct i entries = (struct dx_entry *) (((char *)&root->info) + root->info.info_length); - assert(dx_get_limit(entries) == dx_root_limit(dir, - root->info.info_length)); + + if (dx_get_limit(entries) != dx_root_limit(dir, + root->info.info_length)) { + ext4_warning(dir->i_sb, __FUNCTION__, + "Corrupt limit in dir inode %ld\n", dir->i_ino); + brelse(bh); + *err = ERR_BAD_DX_DIR; + goto fail; + } + dxtrace (printk("Look up %x", hash)); while (1) { - To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html - To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html