• Brian Foster's avatar
    xfs: clear ail delwri queued bufs on unmount of shutdown fs · efc3289c
    Brian Foster authored
    In the typical unmount case, the AIL is forced out by the unmount
    sequence before the xfsaild task is stopped. Since AIL items are
    removed on writeback completion, this means that the AIL
    ->ail_buf_list delwri queue has been drained. This is not always
    true in the shutdown case, however.
    
    It's possible for buffers to sit on a delwri queue for a period of
    time across submission attempts if said items are locked or have
    been relogged and pinned since first added to the queue. If the
    attempt to log such an item results in a log I/O error, the error
    processing can shutdown the fs, remove the item from the AIL, stale
    the buffer (dropping the LRU reference) and clear its delwri queue
    state. The latter bit means the buffer will be released from a
    delwri queue on the next submission attempt, but this might never
    occur if the filesystem has shutdown and the AIL is empty.
    
    This means that such buffers are held indefinitely by the AIL delwri
    queue across destruction of the AIL. Aside from being a memory leak,
    these buffers can also hold references to in-core perag structures.
    The latter problem manifests as a generic/475 failure, reproducing
    the following asserts at unmount time:
    
      XFS: Assertion failed: atomic_read(&pag->pag_ref) == 0,
    	file: fs/xfs/xfs_mount.c, line: 151
      XFS: Assertion failed: atomic_read(&pag->pag_ref) == 0,
    	file: fs/xfs/xfs_mount.c, line: 132
    
    To prevent this problem, clear the AIL delwri queue as a final step
    before xfsaild() exit. The !empty state should never occur in the
    normal case, so add an assert to catch unexpected problems going
    forward.
    
    [dgc: add comment explaining need for xfs_buf_delwri_cancel() after
     calling xfs_buf_delwri_submit_nowait().]
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    efc3289c
xfs_buf.c 51.8 KB