• Dave Chinner's avatar
    xfs: make inode flush at ENOSPC synchronous · 5825294e
    Dave Chinner authored
    When we are writing to a single file and hit ENOSPC, we trigger a background
    flush of the inode and try again.  Because we hold page locks and the iolock,
    the flush won't proceed until after we release these locks. This occurs once
    we've given up and ENOSPC has been reported. Hence if this one is the only
    dirty inode in the system, we'll get an ENOSPC prematurely.
    
    To fix this, remove the async flush from the allocation routines and move
    it to the top of the write path where we can do a synchronous flush
    and retry the write again. Only retry once as a second ENOSPC indicates
    that we really are ENOSPC.
    
    This avoids a page cache deadlock when trying to do this flush synchronously
    in the allocation layer that was identified by Mikulas Patocka.
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    5825294e
xfs_sync.c 17.8 KB