• Zhang Yi's avatar
    ext4: update delalloc data reserve spcae in ext4_es_insert_extent() · c543e242
    Zhang Yi authored
    Now that we update data reserved space for delalloc after allocating
    new blocks in ext4_{ind|ext}_map_blocks(), and if bigalloc feature is
    enabled, we also need to query the extents_status tree to calculate the
    exact reserved clusters. This is complicated now and it appears that
    it's better to do this job in ext4_es_insert_extent(), because
    __es_remove_extent() have already count delalloc blocks when removing
    delalloc extents and __revise_pending() return new adding pending count,
    we could update the reserved blocks easily in ext4_es_insert_extent().
    
    We direct reduce the reserved cluster count when replacing a delalloc
    extent. However, thers are two special cases need to concern about the
    quota claiming when doing direct block allocation (e.g. from fallocate).
    
    A),
    fallocate a range that covers a delalloc extent but start with
    non-delayed allocated blocks, e.g. a hole.
    
      hhhhhhh+ddddddd+ddddddd
      ^^^^^^^^^^^^^^^^^^^^^^^  fallocate this range
    
    Current ext4_map_blocks() can't always trim the extent since it may
    release i_data_sem before calling ext4_map_create_blocks() and raced by
    another delayed allocation. Hence the EXT4_GET_BLOCKS_DELALLOC_RESERVE
    may not set even when we are replacing a delalloc extent, without this
    flag set, the quota has already been claimed by ext4_mb_new_blocks(), so
    we should release the quota reservations instead of claim them again.
    
    B),
    bigalloc feature is enabled, fallocate a range that contains non-delayed
    allocated blocks.
    
      |<         one cluster       >|
      hhhhhhh+hhhhhhh+hhhhhhh+ddddddd
      ^^^^^^^  fallocate this range
    
    This case is similar to above case, the EXT4_GET_BLOCKS_DELALLOC_RESERVE
    flag is also not set.
    
    Hence we should release the quota reservations if we replace a delalloc
    extent but without EXT4_GET_BLOCKS_DELALLOC_RESERVE set.
    Signed-off-by: default avatarZhang Yi <yi.zhang@huawei.com>
    Link: https://patch.msgid.link/20240813123452.2824659-7-yi.zhang@huaweicloud.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    c543e242
indirect.c 43 KB