lkml.org 
[lkml]   [2009]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [Kernel BUG] ext4 for v2.6.32 round II
    Hi Markus, 

    I'm pretty sure the following should fix your problems; can you
    confirm?

    - Ted

    commit 1f94533d9cd75f6d2826018d54a971b9cc085992
    Author: Theodore Ts'o <tytso@mit.edu>
    Date: Wed Sep 30 22:57:41 2009 -0400

    ext4: fix a BUG_ON crash by checking that page has buffers attached to it

    In ext4_num_dirty_pages() we were calling page_buffers() before
    checking to see if the page actually had pages attached to it; this
    would cause a BUG check crash in the inline function page_buffers().

    Thanks to Markus Trippelsdorf for reporting this bug.

    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>

    diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
    index ec367bc..6e65d0e 100644
    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -1146,8 +1146,8 @@ static int check_block_validity(struct inode *inode, const char *msg,
    }

    /*
    - * Return the number of dirty pages in the given inode starting at
    - * page frame idx.
    + * Return the number of contiguous dirty pages in a given inode
    + * starting at page frame idx.
    */
    static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx,
    unsigned int max_pages)
    @@ -1181,15 +1181,15 @@ static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx,
    unlock_page(page);
    break;
    }
    - head = page_buffers(page);
    - bh = head;
    - do {
    - if (!buffer_delay(bh) &&
    - !buffer_unwritten(bh)) {
    - done = 1;
    - break;
    - }
    - } while ((bh = bh->b_this_page) != head);
    + if (page_has_buffers(page)) {
    + bh = head = page_buffers(page);
    + do {
    + if (!buffer_delay(bh) &&
    + !buffer_unwritten(bh))
    + done = 1;
    + bh = bh->b_this_page;
    + } while (!done && (bh != head));
    + }
    unlock_page(page);
    if (done)
    break;

    \
     
     \ /
      Last update: 2009-10-01 05:05    [W:0.031 / U:29.456 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site