• Mauricio Faria de Oliveira's avatar
    ext4: data=journal: fixes for ext4_page_mkwrite() · 64a9f144
    Mauricio Faria de Oliveira authored
    These are two fixes for data journalling required by
    the next patch, discovered while testing it.
    
    First, the optimization to return early if all buffers
    are mapped is not appropriate for the next patch:
    
    The inode _must_ be added to the transaction's list in
    data=journal mode (so to write-protect pages on commit)
    thus we cannot return early there.
    
    Second, once that optimization to reduce transactions
    was disabled for data=journal mode, more transactions
    happened, and occasionally hit this warning message:
    'JBD2: Spotted dirty metadata buffer'.
    
    Reason is, block_page_mkwrite() will set_buffer_dirty()
    before do_journal_get_write_access() that is there to
    prevent it. This issue was masked by the optimization.
    
    So, on data=journal use __block_write_begin() instead.
    This also requires page locking and len recalculation.
    (see block_page_mkwrite() for implementation details.)
    
    Finally, as Jan noted there is little sharing between
    data=journal and other modes in ext4_page_mkwrite().
    
    However, a prototype of ext4_journalled_page_mkwrite()
    showed there still would be lots of duplicated lines
    (tens of) that didn't seem worth it.
    
    Thus this patch ends up with an ugly goto to skip all
    non-data journalling code (to avoid long indentations,
    but that can be changed..) in the beginning, and just
    a conditional in the transaction section.
    
    Well, we skip a common part to data journalling which
    is the page truncated check, but we do it again after
    ext4_journal_start() when we re-acquire the page lock
    (so not to acquire the page lock twice needlessly for
    data journalling.)
    Signed-off-by: default avatarMauricio Faria de Oliveira <mfo@canonical.com>
    Suggested-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarAndreas Dilger <adilger@dilger.ca>
    Link: https://lore.kernel.org/r/20201006004841.600488-4-mfo@canonical.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    64a9f144
inode.c 176 KB