• Jan Kara's avatar
    ocfs2: fix data corruption on truncate · 839b6386
    Jan Kara authored
    Patch series "ocfs2: Truncate data corruption fix".
    
    As further testing has shown, commit 5314454e ("ocfs2: fix data
    corruption after conversion from inline format") didn't fix all the data
    corruption issues the customer started observing after 6dbf7bb5
    ("fs: Don't invalidate page buffers in block_write_full_page()") This
    time I have tracked them down to two bugs in ocfs2 truncation code.
    
    One bug (truncating page cache before clearing tail cluster and setting
    i_size) could cause data corruption even before 6dbf7bb5, but before
    that commit it needed a race with page fault, after 6dbf7bb5 it
    started to be pretty deterministic.
    
    Another bug (zeroing pages beyond old i_size) used to be harmless
    inefficiency before commit 6dbf7bb5.  But after commit 6dbf7bb5
    in combination with the first bug it resulted in deterministic data
    corruption.
    
    Although fixing only the first problem is needed to stop data
    corruption, I've fixed both issues to make the code more robust.
    
    This patch (of 2):
    
    ocfs2_truncate_file() did unmap invalidate page cache pages before
    zeroing partial tail cluster and setting i_size.  Thus some pages could
    be left (and likely have left if the cluster zeroing happened) in the
    page cache beyond i_size after truncate finished letting user possibly
    see stale data once the file was extended again.  Also the tail cluster
    zeroing was not guaranteed to finish before truncate finished causing
    possible stale data exposure.  The problem started to be particularly
    easy to hit after commit 6dbf7bb5 "fs: Don't invalidate page buffers
    in block_write_full_page()" stopped invalidation of pages beyond i_size
    from page writeback path.
    
    Fix these problems by unmapping and invalidating pages in the page cache
    after the i_size is reduced and tail cluster is zeroed out.
    
    Link: https://lkml.kernel.org/r/20211025150008.29002-1-jack@suse.cz
    Link: https://lkml.kernel.org/r/20211025151332.11301-1-jack@suse.cz
    Fixes: ccd979bd ("[PATCH] OCFS2: The Second Oracle Cluster Filesystem")
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarJoseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    839b6386
file.c 68.7 KB