• Andreas Gruenbacher's avatar
    gfs2: Per-revoke accounting in transactions · 2129b428
    Andreas Gruenbacher authored
    In the log, revokes are stored as a revoke descriptor (struct
    gfs2_log_descriptor), followed by zero or more additional revoke blocks
    (struct gfs2_meta_header).  On filesystems with a blocksize of 4k, the
    revoke descriptor contains up to 503 revokes, and the metadata blocks
    contain up to 509 revokes each.  We've so far been reserving space for
    revokes in transactions in block granularity, so a lot more space than
    necessary was being allocated and then released again.
    
    This patch switches to assigning revokes to transactions individually
    instead.  Initially, space for the revoke descriptor is reserved and
    handed out to transactions.  When more revokes than that are reserved,
    additional revoke blocks are added.  When the log is flushed, the space
    for the additional revoke blocks is released, but we keep the space for
    the revoke descriptor block allocated.
    
    Transactions may still reserve more revokes than they will actually need
    in the end, but now we won't overshoot the target as much, and by only
    returning the space for excess revokes at log flush time, we further
    reduce the amount of contention between processes.
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    2129b428
lops.c 27.5 KB