• David Chinner's avatar
    [XFS] Apply transaction delta counts atomically to incore counters · 45c34141
    David Chinner authored
    With the per-cpu superblock counters, batch updates are no longer atomic
    across the entire batch of changes. This is not an issue if each
    individual change in the batch is applied atomically. Unfortunately, free
    block count changes are not applied atomically, and they are applied in a
    manner guaranteed to cause problems.
    
    Essentially, the free block count reservation that the transaction took
    initially is returned to the in core counters before a second delta takes
    away what is used. because these two operations are not atomic, we can
    race with another thread that can use the returned transaction reservation
    before the transaction takes the space away again and we can then get
    ENOSPC being reported in a spot where we don't have an ENOSPC condition,
    nor should we ever see one there.
    
    Fix it up by rolling the two deltas into the one so it can be applied
    safely (i.e. atomically) to the incore counters.
    
    SGI-PV: 964465
    SGI-Modid: xfs-linux-melb:xfs-kern:28796a
    Signed-off-by: default avatarDavid Chinner <dgc@sgi.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
    Signed-off-by: default avatarTim Shimmin <tes@sgi.com>
    45c34141
xfs_trans.c 37 KB