• Tahsin Erdogan's avatar
    ext4: reserve space for xattr entries/names · 9c6e7853
    Tahsin Erdogan authored
    New ea_inode feature allows putting large xattr values into external
    inodes.  struct ext4_xattr_entry and the attribute name however have to
    remain in the inode extra space or external attribute block.  Once that
    space is exhausted, no further entries can be added.  Some of that space
    could also be used by values that fit in there at the time of addition.
    
    So, a single xattr entry whose value barely fits in the external block
    could prevent further entries being added.
    
    To mitigate the problem, this patch introduces a notion of reserved
    space in the external attribute block that cannot be used by value data.
    This reserve is enforced when ea_inode feature is enabled.  The amount
    of reserve is arbitrarily chosen to be min(block_size/8, 1024).  The
    table below shows how much space is reserved for each block size and the
    guaranteed mininum number of entries that can be placed in the external
    attribute block.
    
    block size     reserved bytes  entries (name length = 16)
     1k            128              3
     2k            256              7
     4k            512             15
     8k            1024            31
    16k            1024            31
    32k            1024            31
    64k            1024            31
    Signed-off-by: default avatarTahsin Erdogan <tahsin@google.com>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    9c6e7853
xattr.c 78.1 KB