mirror of https://gitee.com/openkylin/linux.git
btrfs: attach private to dummy extent buffer pages
There are locations where we allocate dummy extent buffers for temporary usage, like in tree_mod_log_rewind() or get_old_root(). These dummy extent buffers will be handled by the same eb accessors, and if they don't have page::private subpage eb accessors could fail. To address such problems, make __alloc_dummy_extent_buffer() attach page private for dummy extent buffers too. Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
8ff8466d29
commit
09bc1f0fb8
|
@ -5185,9 +5185,14 @@ struct extent_buffer *__alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
|
|||
|
||||
num_pages = num_extent_pages(eb);
|
||||
for (i = 0; i < num_pages; i++) {
|
||||
int ret;
|
||||
|
||||
eb->pages[i] = alloc_page(GFP_NOFS);
|
||||
if (!eb->pages[i])
|
||||
goto err;
|
||||
ret = attach_extent_buffer_page(eb, eb->pages[i], NULL);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
}
|
||||
set_extent_buffer_uptodate(eb);
|
||||
btrfs_set_header_nritems(eb, 0);
|
||||
|
@ -5195,8 +5200,10 @@ struct extent_buffer *__alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
|
|||
|
||||
return eb;
|
||||
err:
|
||||
for (; i > 0; i--)
|
||||
for (; i > 0; i--) {
|
||||
detach_extent_buffer_page(eb, eb->pages[i - 1]);
|
||||
__free_page(eb->pages[i - 1]);
|
||||
}
|
||||
__free_extent_buffer(eb);
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue