Skip to content

Commit

Permalink
btrfs: introduce helper to grab an existing extent buffer from a page
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Qu Wenruo <[email protected]>
Reviewed-by: David Sterba <[email protected]>
Signed-off-by: David Sterba <[email protected]>
  • Loading branch information
adam900710 authored and kdave committed Feb 1, 2021
1 parent e1c0bcf commit e98dcba
Showing 1 changed file with 30 additions and 20 deletions.
50 changes: 30 additions & 20 deletions fs/btrfs/extent_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -5247,6 +5247,29 @@ struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
}
#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)
{
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit e98dcba

Please sign in to comment.