mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
btrfs: introduce helper to grab an existing extent buffer from a page
This patch will extract the code to grab an extent buffer from a page into a helper, grab_extent_buffer_from_page(). This reduces one indent level, and provides the work place for later expansion for subapge support. Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.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
c0fab48095
commit
c0f0a9e716
@ -5247,6 +5247,29 @@ free_eb:
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct extent_buffer *grab_extent_buffer(struct page *page)
|
||||
{
|
||||
struct extent_buffer *exists;
|
||||
|
||||
/* Page not yet attached to an extent buffer */
|
||||
if (!PagePrivate(page))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* We could have already allocated an eb for this page and attached one
|
||||
* so lets see if we can get a ref on the existing eb, and if we can we
|
||||
* know it's good and we can just return that one, else we know we can
|
||||
* just overwrite page->private.
|
||||
*/
|
||||
exists = (struct extent_buffer *)page->private;
|
||||
if (atomic_inc_not_zero(&exists->refs))
|
||||
return exists;
|
||||
|
||||
WARN_ON(PageDirty(page));
|
||||
detach_page_private(page);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
|
||||
u64 start, u64 owner_root, int level)
|
||||
{
|
||||
@ -5292,26 +5315,13 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
|
||||
}
|
||||
|
||||
spin_lock(&mapping->private_lock);
|
||||
if (PagePrivate(p)) {
|
||||
/*
|
||||
* We could have already allocated an eb for this page
|
||||
* and attached one so lets see if we can get a ref on
|
||||
* the existing eb, and if we can we know it's good and
|
||||
* we can just return that one, else we know we can just
|
||||
* overwrite page->private.
|
||||
*/
|
||||
exists = (struct extent_buffer *)p->private;
|
||||
if (atomic_inc_not_zero(&exists->refs)) {
|
||||
spin_unlock(&mapping->private_lock);
|
||||
unlock_page(p);
|
||||
put_page(p);
|
||||
mark_extent_buffer_accessed(exists, p);
|
||||
goto free_eb;
|
||||
}
|
||||
exists = NULL;
|
||||
|
||||
WARN_ON(PageDirty(p));
|
||||
detach_page_private(p);
|
||||
exists = grab_extent_buffer(p);
|
||||
if (exists) {
|
||||
spin_unlock(&mapping->private_lock);
|
||||
unlock_page(p);
|
||||
put_page(p);
|
||||
mark_extent_buffer_accessed(exists, p);
|
||||
goto free_eb;
|
||||
}
|
||||
attach_extent_buffer_page(eb, p);
|
||||
spin_unlock(&mapping->private_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user