mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-04 16:15:11 +00:00
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>
This commit is contained in:
parent
62c053fbb2
commit
cac06d843f
4 changed files with 78 additions and 2 deletions
|
@ -27,7 +27,8 @@ btrfs-y += super.o ctree.o extent-tree.o print-tree.o root-tree.o dir-item.o \
|
||||||
compression.o delayed-ref.o relocation.o delayed-inode.o scrub.o \
|
compression.o delayed-ref.o relocation.o delayed-inode.o scrub.o \
|
||||||
reada.o backref.o ulist.o qgroup.o send.o dev-replace.o raid56.o \
|
reada.o backref.o ulist.o qgroup.o send.o dev-replace.o raid56.o \
|
||||||
uuid-tree.o props.o free-space-tree.o tree-checker.o space-info.o \
|
uuid-tree.o props.o free-space-tree.o tree-checker.o space-info.o \
|
||||||
block-rsv.o delalloc-space.o block-group.o discard.o reflink.o
|
block-rsv.o delalloc-space.o block-group.o discard.o reflink.o \
|
||||||
|
subpage.o
|
||||||
|
|
||||||
btrfs-$(CONFIG_BTRFS_FS_POSIX_ACL) += acl.o
|
btrfs-$(CONFIG_BTRFS_FS_POSIX_ACL) += acl.o
|
||||||
btrfs-$(CONFIG_BTRFS_FS_CHECK_INTEGRITY) += check-integrity.o
|
btrfs-$(CONFIG_BTRFS_FS_CHECK_INTEGRITY) += check-integrity.o
|
||||||
|
|
43
fs/btrfs/subpage.c
Normal file
43
fs/btrfs/subpage.c
Normal file
|
@ -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);
|
||||||
|
}
|
33
fs/btrfs/subpage.h
Normal file
33
fs/btrfs/subpage.h
Normal file
|
@ -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
|
|
@ -48,7 +48,6 @@
|
||||||
#include "tests/btrfs-tests.h"
|
#include "tests/btrfs-tests.h"
|
||||||
#include "block-group.h"
|
#include "block-group.h"
|
||||||
#include "discard.h"
|
#include "discard.h"
|
||||||
|
|
||||||
#include "qgroup.h"
|
#include "qgroup.h"
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/btrfs.h>
|
#include <trace/events/btrfs.h>
|
||||||
|
|
Loading…
Reference in a new issue