lkml.org 
[lkml]   [2007]   [Aug]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RESEND][PATCH] dir_index: error out instead of BUG on corrupt hash dir limit
    (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 <sandeen@sandeen.net>

    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 majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-09-01 04:51    [W:0.024 / U:0.636 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site