From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Cc: Josef Bacik <josef@toxicpanda.com>, David Sterba <dsterba@suse.com>
Subject: [PATCH v5 03/18] btrfs: introduce the skeleton of btrfs_subpage structure
Date: Tue, 26 Jan 2021 16:33:47 +0800 [thread overview]
Message-ID: <20210126083402.142577-4-wqu@suse.com> (raw)
In-Reply-To: <20210126083402.142577-1-wqu@suse.com>
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>
---
fs/btrfs/Makefile | 3 ++-
fs/btrfs/subpage.c | 43 +++++++++++++++++++++++++++++++++++++++++++
fs/btrfs/subpage.h | 33 +++++++++++++++++++++++++++++++++
fs/btrfs/super.c | 1 -
4 files changed, 78 insertions(+), 2 deletions(-)
create mode 100644 fs/btrfs/subpage.c
create mode 100644 fs/btrfs/subpage.h
diff --git a/fs/btrfs/Makefile b/fs/btrfs/Makefile
index 9f1b1a88e317..942562e11456 100644
--- a/fs/btrfs/Makefile
+++ b/fs/btrfs/Makefile
@@ -11,7 +11,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 \
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 \
- 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_CHECK_INTEGRITY) += check-integrity.o
diff --git a/fs/btrfs/subpage.c b/fs/btrfs/subpage.c
new file mode 100644
index 000000000000..a3e5b6a13d54
--- /dev/null
+++ b/fs/btrfs/subpage.c
@@ -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);
+}
diff --git a/fs/btrfs/subpage.h b/fs/btrfs/subpage.h
new file mode 100644
index 000000000000..676280bc7562
--- /dev/null
+++ b/fs/btrfs/subpage.h
@@ -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
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 12d7d3be7cd4..919ed5c357e9 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -48,7 +48,6 @@
#include "tests/btrfs-tests.h"
#include "block-group.h"
#include "discard.h"
-
#include "qgroup.h"
#define CREATE_TRACE_POINTS
#include <trace/events/btrfs.h>
--
2.30.0
next prev parent reply other threads:[~2021-01-26 18:36 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-26 8:33 [PATCH v5 00/18] btrfs: add read-only support for subpage sector size Qu Wenruo
2021-01-26 8:33 ` [PATCH v5 01/18] btrfs: merge PAGE_CLEAR_DIRTY and PAGE_SET_WRITEBACK to PAGE_START_WRITEBACK Qu Wenruo
2021-01-27 15:56 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 02/18] btrfs: set UNMAPPED bit early in btrfs_clone_extent_buffer() for subpage support Qu Wenruo
2021-01-27 15:56 ` Josef Bacik
2021-01-26 8:33 ` Qu Wenruo [this message]
2021-01-26 8:33 ` [PATCH v5 04/18] btrfs: make attach_extent_buffer_page() handle subpage case Qu Wenruo
2021-01-27 16:01 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 05/18] btrfs: make grab_extent_buffer_from_page() " Qu Wenruo
2021-01-27 16:20 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 06/18] btrfs: support subpage for extent buffer page release Qu Wenruo
2021-01-27 16:21 ` Josef Bacik
2021-02-01 15:32 ` David Sterba
2021-01-26 8:33 ` [PATCH v5 07/18] btrfs: attach private to dummy extent buffer pages Qu Wenruo
2021-01-27 16:21 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 08/18] btrfs: introduce helpers for subpage uptodate status Qu Wenruo
2021-01-27 16:34 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 09/18] btrfs: introduce helpers for subpage error status Qu Wenruo
2021-01-27 16:34 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 10/18] btrfs: support subpage in set/clear_extent_buffer_uptodate() Qu Wenruo
2021-01-27 16:35 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 11/18] btrfs: support subpage in btrfs_clone_extent_buffer Qu Wenruo
2021-01-27 16:35 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 12/18] btrfs: support subpage in try_release_extent_buffer() Qu Wenruo
2021-01-27 16:37 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 13/18] btrfs: introduce read_extent_buffer_subpage() Qu Wenruo
2021-01-27 16:39 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 14/18] btrfs: support subpage in endio_readpage_update_page_status() Qu Wenruo
2021-01-27 16:42 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 15/18] btrfs: introduce subpage metadata validation check Qu Wenruo
2021-01-27 16:47 ` Josef Bacik
2021-01-26 8:34 ` [PATCH v5 16/18] btrfs: introduce btrfs_subpage for data inodes Qu Wenruo
2021-01-27 16:56 ` Josef Bacik
2021-02-01 15:42 ` David Sterba
2021-01-26 8:34 ` [PATCH v5 17/18] btrfs: integrate page status update for data read path into begin/end_page_read() Qu Wenruo
2021-01-27 17:13 ` Josef Bacik
2021-02-01 15:47 ` David Sterba
2021-01-26 8:34 ` [PATCH v5 18/18] btrfs: allow RO mount of 4K sector size fs on 64K page system Qu Wenruo
2021-01-27 17:13 ` Josef Bacik
2021-02-01 15:49 ` David Sterba
2021-01-27 16:17 ` [PATCH v5 00/18] btrfs: add read-only support for subpage sector size Josef Bacik
2021-01-28 0:30 ` Qu Wenruo
2021-01-28 10:34 ` David Sterba
2021-01-28 10:51 ` Qu Wenruo
2021-02-01 14:50 ` David Sterba
2021-02-01 15:55 ` David Sterba
2021-02-02 9:21 ` [bug report] Unable to handle kernel paging request Anand Jain
2021-02-02 10:23 ` Qu Wenruo
2021-02-02 11:28 ` Anand Jain
2021-02-02 13:37 ` Anand Jain
2021-02-04 5:13 ` Qu Wenruo
2021-02-03 13:20 ` [PATCH v5 00/18] btrfs: add read-only support for subpage sector size David Sterba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210126083402.142577-4-wqu@suse.com \
--to=wqu@suse.com \
--cc=dsterba@suse.com \
--cc=josef@toxicpanda.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).