-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
btrfs: introduce the skeleton of btrfs_subpage structure
For sectorsize < page size support, we need a structure to record extra status info for each sector of a page. Introduce the skeleton structure, all subpage related code would go to subpage.[ch]. 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>
- Loading branch information
Qu Wenruo
authored and
David Sterba
committed
Feb 8, 2021
1 parent
62c053f
commit cac06d8
Showing
4 changed files
with
78 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
#include <linux/slab.h> | ||
#include "ctree.h" | ||
#include "subpage.h" | ||
|
||
int btrfs_attach_subpage(const struct btrfs_fs_info *fs_info, | ||
struct page *page, enum btrfs_subpage_type type) | ||
{ | ||
struct btrfs_subpage *subpage; | ||
|
||
/* | ||
* We have cases like a dummy extent buffer page, which is not mappped | ||
* and doesn't need to be locked. | ||
*/ | ||
if (page->mapping) | ||
ASSERT(PageLocked(page)); | ||
/* Either not subpage, or the page already has private attached */ | ||
if (fs_info->sectorsize == PAGE_SIZE || PagePrivate(page)) | ||
return 0; | ||
|
||
subpage = kzalloc(sizeof(struct btrfs_subpage), GFP_NOFS); | ||
if (!subpage) | ||
return -ENOMEM; | ||
|
||
spin_lock_init(&subpage->lock); | ||
attach_page_private(page, subpage); | ||
return 0; | ||
} | ||
|
||
void btrfs_detach_subpage(const struct btrfs_fs_info *fs_info, | ||
struct page *page) | ||
{ | ||
struct btrfs_subpage *subpage; | ||
|
||
/* Either not subpage, or already detached */ | ||
if (fs_info->sectorsize == PAGE_SIZE || !PagePrivate(page)) | ||
return; | ||
|
||
subpage = (struct btrfs_subpage *)detach_page_private(page); | ||
ASSERT(subpage); | ||
kfree(subpage); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
|
||
#ifndef BTRFS_SUBPAGE_H | ||
#define BTRFS_SUBPAGE_H | ||
|
||
#include <linux/spinlock.h> | ||
|
||
/* | ||
* Maximum page size we support is 64K, minimum sector size is 4K, u16 bitmap | ||
* is sufficient. Regular bitmap_* is not used due to size reasons. | ||
*/ | ||
#define BTRFS_SUBPAGE_BITMAP_SIZE 16 | ||
|
||
/* | ||
* Structure to trace status of each sector inside a page, attached to | ||
* page::private for both data and metadata inodes. | ||
*/ | ||
struct btrfs_subpage { | ||
/* Common members for both data and metadata pages */ | ||
spinlock_t lock; | ||
}; | ||
|
||
enum btrfs_subpage_type { | ||
BTRFS_SUBPAGE_METADATA, | ||
BTRFS_SUBPAGE_DATA, | ||
}; | ||
|
||
int btrfs_attach_subpage(const struct btrfs_fs_info *fs_info, | ||
struct page *page, enum btrfs_subpage_type type); | ||
void btrfs_detach_subpage(const struct btrfs_fs_info *fs_info, | ||
struct page *page); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters