btrfs: explicitly protect ->last_byte_to_unpin in unpin_extent_range
Currently unpin_extent_range happens in the transaction commit context, so we are protected from ->last_byte_to_unpin changing while we're unpinning, because any new transactions would have to wait for us to complete before modifying ->last_byte_to_unpin. However in the future we may want to change how this works, for instance with async unpinning or other such TODO items. To prepare for that future explicitly protect ->last_byte_to_unpin with the commit_root_sem so we are sure it won't change while we're doing our work. Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Родитель
27d56e62e4
Коммит
2ca08c56e8
|
@ -2769,11 +2769,13 @@ static int unpin_extent_range(struct btrfs_fs_info *fs_info,
|
|||
len = cache->start + cache->length - start;
|
||||
len = min(len, end + 1 - start);
|
||||
|
||||
down_read(&fs_info->commit_root_sem);
|
||||
if (start < cache->last_byte_to_unpin && return_free_space) {
|
||||
u64 add_len = min(len, cache->last_byte_to_unpin - start);
|
||||
|
||||
btrfs_add_free_space(cache, start, add_len);
|
||||
}
|
||||
up_read(&fs_info->commit_root_sem);
|
||||
|
||||
start += len;
|
||||
total_unpinned += len;
|
||||
|
|
Загрузка…
Ссылка в новой задаче