• Dave Chinner's avatar
    xfs: add an inode item lock · 1319ebef
    Dave Chinner authored
    The inode log item is kind of special in that it can be aggregating
    new changes in memory at the same time time existing changes are
    being written back to disk. This means there are fields in the log
    item that are accessed concurrently from contexts that don't share
    any locking at all.
    
    e.g. updating ili_last_fields occurs at flush time under the
    ILOCK_EXCL and flush lock at flush time, under the flush lock at IO
    completion time, and is read under the ILOCK_EXCL when the inode is
    logged.  Hence there is no actual serialisation between reading the
    field during logging of the inode in transactions vs clearing the
    field in IO completion.
    
    We currently get away with this by the fact that we are only
    clearing fields in IO completion, and nothing bad happens if we
    accidentally log more of the inode than we actually modify. Worst
    case is we consume a tiny bit more memory and log bandwidth.
    
    However, if we want to do more complex state manipulations on the
    log item that requires updates at all three of these potential
    locations, we need to have some mechanism of serialising those
    operations. To do this, introduce a spinlock into the log item to
    serialise internal state.
    
    This could be done via the xfs_inode i_flags_lock, but this then
    leads to potential lock inversion issues where inode flag updates
    need to occur inside locks that best nest inside the inode log item
    locks (e.g. marking inodes stale during inode cluster freeing).
    Using a separate spinlock avoids these sorts of problems and
    simplifies future code.
    
    This does not touch the use of ili_fields in the item formatting
    code - that is entirely protected by the ILOCK_EXCL at this point in
    time, so it remains untouched.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    1319ebef
xfs_trans_inode.c 4.24 KB