• Lukas Czerner's avatar
    fs: record I_DIRTY_TIME even if inode already has I_DIRTY_INODE · cbfecb92
    Lukas Czerner authored
    Currently the I_DIRTY_TIME will never get set if the inode already has
    I_DIRTY_INODE with assumption that it supersedes I_DIRTY_TIME.  That's
    true, however ext4 will only update the on-disk inode in
    ->dirty_inode(), not on actual writeback. As a result if the inode
    already has I_DIRTY_INODE state by the time we get to
    __mark_inode_dirty() only with I_DIRTY_TIME, the time was already filled
    into on-disk inode and will not get updated until the next I_DIRTY_INODE
    update, which might never come if we crash or get a power failure.
    
    The problem can be reproduced on ext4 by running xfstest generic/622
    with -o iversion mount option.
    
    Fix it by allowing I_DIRTY_TIME to be set even if the inode already has
    I_DIRTY_INODE. Also make sure that the case is properly handled in
    writeback_single_inode() as well. Additionally changes in
    xfs_fs_dirty_inode() was made to accommodate for I_DIRTY_TIME in flag.
    
    Thanks Jan Kara for suggestions on how to make this work properly.
    
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: stable@kernel.org
    Signed-off-by: default avatarLukas Czerner <lczerner@redhat.com>
    Suggested-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20220825100657.44217-1-lczerner@redhat.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    cbfecb92
fs-writeback.c 79.1 KB