• B
    xfs: introduce inode record hole mask for sparse inode chunks · 5419040f
    Brian Foster 提交于
    The inode btrees track 64 inodes per record regardless of inode size.
    Thus, inode chunks on disk vary in size depending on the size of the
    inodes. This creates a contiguous allocation requirement for new inode
    chunks that can be difficult to satisfy on an aged and fragmented (free
    space) filesystems.
    
    The inode record freecount currently uses 4 bytes on disk to track the
    free inode count. With a maximum freecount value of 64, only one byte is
    required. Convert the freecount field to a single byte and use two of
    the remaining 3 higher order bytes left for the hole mask field. Use the
    final leftover byte for the total count field.
    
    The hole mask field tracks holes in the chunks of physical space that
    the inode record refers to. This facilitates the sparse allocation of
    inode chunks when contiguous chunks are not available and allows the
    inode btrees to identify what portions of the chunk contain valid
    inodes. The total count field contains the total number of valid inodes
    referred to by the record. This can also be deduced from the hole mask.
    The count field provides clarity and redundancy for internal record
    verification.
    
    Note that neither of the new fields can be written to disk on fs'
    without sparse inode support. Doing so writes to the high-order bytes of
    freecount and causes corruption from the perspective of older kernels.
    The on-disk inobt record data structure is updated with a union to
    distinguish between the original, "full" format and the new, "sparse"
    format. The conversion routines to get, insert and update records are
    updated to translate to and from the on-disk record accordingly such
    that freecount remains a 4-byte value on non-supported fs, yet the new
    fields of the in-core record are always valid with respect to the
    record. This means that higher level code can refer to the current
    in-core record format unconditionally and lower level code ensures that
    records are translated to/from disk according to the capabilities of the
    fs.
    Signed-off-by: NBrian Foster <bfoster@redhat.com>
    Reviewed-by: NDave Chinner <dchinner@redhat.com>
    Signed-off-by: NDave Chinner <david@fromorbit.com>
    5419040f
xfs_format.h 49.6 KB