• Qu Wenruo's avatar
    btrfs: delayed_ref: release and free qgroup reserved at proper timing · 297d750b
    Qu Wenruo authored
    Qgroup reserved space needs to be released from inode dirty map and get
    freed at different timing:
    
    1) Release when the metadata is written into tree
    After corresponding metadata is written into tree, any newer write will
    be COWed(don't include NOCOW case yet).
    So we must release its range from inode dirty range map, or we will
    forget to reserve needed range, causing accounting exceeding the limit.
    
    2) Free reserved bytes when delayed ref is run
    When delayed refs are run, qgroup accounting will follow soon and turn
    the reserved bytes into rfer/excl numbers.
    As run_delayed_refs and qgroup accounting are all done at
    commit_transaction() time, we are safe to free reserved space in
    run_delayed_ref time().
    
    With these timing to release/free reserved space, we should be able to
    resolve the long existing qgroup reserve space leak problem.
    Signed-off-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    297d750b
inode.c 264 KB