• Lukas Czerner's avatar
    ext4: make punch hole code path work with bigalloc · d23142c6
    Lukas Czerner authored
    Currently punch hole is disabled in file systems with bigalloc
    feature enabled. However the recent changes in punch hole patch should
    make it easier to support punching holes on bigalloc enabled file
    systems.
    
    This commit changes partial_cluster handling in ext4_remove_blocks(),
    ext4_ext_rm_leaf() and ext4_ext_remove_space(). Currently
    partial_cluster is unsigned long long type and it makes sure that we
    will free the partial cluster if all extents has been released from that
    cluster. However it has been specifically designed only for truncate.
    
    With punch hole we can be freeing just some extents in the cluster
    leaving the rest untouched. So we have to make sure that we will notice
    cluster which still has some extents. To do this I've changed
    partial_cluster to be signed long long type. The only scenario where
    this could be a problem is when cluster_size == block size, however in
    that case there would not be any partial clusters so we're safe. For
    bigger clusters the signed type is enough. Now we use the negative value
    in partial_cluster to mark such cluster used, hence we know that we must
    not free it even if all other extents has been freed from such cluster.
    
    This scenario can be described in simple diagram:
    
    |FFF...FF..FF.UUU|
     ^----------^
      punch hole
    
    . - free space
    | - cluster boundary
    F - freed extent
    U - used extent
    
    Also update respective tracepoints to use signed long long type for
    partial_cluster.
    Signed-off-by: default avatarLukas Czerner <lczerner@redhat.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    d23142c6
extents.c 130 KB