• Curt Wohlgemuth's avatar
    ext4: Fix data corruption with multi-block writepages support · 617d99a8
    Curt Wohlgemuth authored
    commit d50bdd5a upstream.
    
    This fixes a corruption problem with the multi-block
    writepages submittal change for ext4, from commit
    bd2d0210 ("ext4: use bio
    layer instead of buffer layer in mpage_da_submit_io").
    
    (Note that this corruption is not present in 2.6.37 on
    ext4, because the corruption was detected after the
    feature was merged in 2.6.37-rc1, and so it was turned
    off by adding a non-default mount option,
    mblk_io_submit.  With this commit, which hopefully
    fixes the last of the bugs with this feature, we'll be
    able to turn on this performance feature by default in
    2.6.38, and remove the mblk_io_submit option.)
    
    The ext4 code path to bundle multiple pages for
    writeback in ext4_bio_write_page() had a bug: we should
    be clearing buffer head dirty flags *before* we submit
    the bio, not in the completion routine.
    
    The patch below was tested on 2.6.37 under KVM with the
    postgresql script which was submitted by Jon Nelson as
    documented in commit 1449032b.
    
    Without the patch, I'd hit the corruption problem about
    50-70% of the time.  With the patch, I executed the
    script > 100 times with no corruption seen.
    
    I also fixed a bug to make sure ext4_end_bio() doesn't
    dereference the bio after the bio_put() call.
    Reported-by: default avatarJon Nelson <jnelson@jamponi.net>
    Reported-by: default avatarMatthias Bayer <jackdachef@gmail.com>
    Signed-off-by: default avatarCurt Wohlgemuth <curtw@google.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    617d99a8
page-io.c 10.7 KB