• Andrew Morton's avatar
    writeback: fix time-ordering of the per-superblock dirty-inode lists · 6610a0bc
    Andrew Morton authored
    When writeback has finished writing back an inode it looks to see if that
    inode is still dirty.  If it is, that means that a process redirtied the inode
    while its writeback was in progress.
    
    What we need to do here is to refile the redirtied inode onto the s_dirty
    list.
    
    But we're doing that wrongly: it could be that this inode was redirtied
    _before_ the last inode on s_dirty.  We're blindly appending this inode to the
    list, after an inode which might be less-recently-dirtied, thus violating the
    list's ordering.
    
    So we must either insertion-sort this inode into the correct place, or we must
    update this inode's dirtied_when field when appending it to the reverse-sorted
    s_dirty list, to preserve the reverse-time-ordering.
    
    This patch does the latter: if this inode was dirtied less recently than the
    tail inode then copy the tail inode's timestamp into this inode.
    
    This means that in rare circumstances, some inodes will be writen back later
    than they should have been.  But the time slip will be small.
    
    Cc: Mike Waychison <mikew@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6610a0bc
fs-writeback.c 20.8 KB