OSDN Git Service

btrfs: explicitly protect ->last_byte_to_unpin in unpin_extent_range
authorJosef Bacik <josef@toxicpanda.com>
Fri, 23 Oct 2020 13:58:06 +0000 (09:58 -0400)
committerDavid Sterba <dsterba@suse.com>
Tue, 8 Dec 2020 14:54:02 +0000 (15:54 +0100)
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>
fs/btrfs/extent-tree.c

index 27523e6..d7a6820 100644 (file)
@@ -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;