• Jeff Mahoney's avatar
    btrfs: iterate over unused chunk space in FITRIM · 499f377f
    Jeff Mahoney authored
    Since we now clean up block groups automatically as they become
    empty, iterating over block groups is no longer sufficient to discard
    unused space.
    
    This patch iterates over the unused chunk space and discards any regions
    that are unallocated, regardless of whether they were ever used.  This is
    a change for btrfs but is consistent with other file systems.
    
    We do this in a transactionless manner since the discard process can take
    a substantial amount of time and a transaction would need to be started
    before the acquisition of the device list lock.  That would mean a
    transaction would be held open across /all/ of the discards collectively.
    In order to prevent other threads from allocating or freeing chunks, we
    hold the chunks lock across the search and discard calls.  We release it
    between searches to allow the file system to perform more-or-less
    normally.  Since the running transaction can commit and disappear while
    we're using the transaction pointer, we take a reference to it and
    release it after the search.  This is safe since it would happen normally
    at the end of the transaction commit after any locks are released anyway.
    We also take the commit_root_sem to protect against a transaction starting
    and committing while we're running.
    Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Tested-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    499f377f
extent-tree.c 277 KB