lkml.org 
[lkml]   [2009]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 098/114] ext4: Fix deadlock in ext4_write_begin() and ext4_da_write_begin()

    2.6.28-stable review patch. If anyone has any objections, please let us know.

    ------------------

    From: Jan Kara <jack@suse.cz>

    (cherry picked from commit ebd3610b110bbb18ea6f9f2aeed1e1068c537227)

    Functions ext4_write_begin() and ext4_da_write_begin() call
    grab_cache_page_write_begin() without AOP_FLAG_NOFS. Thus it
    can happen that page reclaim is triggered in that function
    and it recurses back into the filesystem (or some other filesystem).
    But this can lead to various problems as a transaction is already
    started at that point. Add the necessary flag.

    http://bugzilla.kernel.org/show_bug.cgi?id=11688

    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    fs/ext4/inode.c | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -1347,6 +1347,10 @@ retry:
    goto out;
    }

    + /* We cannot recurse into the filesystem as the transaction is already
    + * started */
    + flags |= AOP_FLAG_NOFS;
    +
    page = grab_cache_page_write_begin(mapping, index, flags);
    if (!page) {
    ext4_journal_stop(handle);
    @@ -1356,7 +1360,7 @@ retry:
    *pagep = page;

    ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
    - ext4_get_block);
    + ext4_get_block);

    if (!ret && ext4_should_journal_data(inode)) {
    ret = walk_page_buffers(handle, page_buffers(page),
    @@ -2603,6 +2607,9 @@ retry:
    ret = PTR_ERR(handle);
    goto out;
    }
    + /* We cannot recurse into the filesystem as the transaction is already
    + * started */
    + flags |= AOP_FLAG_NOFS;

    page = grab_cache_page_write_begin(mapping, index, flags);
    if (!page) {



    \
     
     \ /
      Last update: 2009-03-14 02:59    [W:0.020 / U:2.716 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site