All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pankaj Raghav <p.raghav@samsung.com>
To: brauner@kernel.org, willy@infradead.org, viro@zeniv.linux.org.uk,
	akpm@linux-foundation.org
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	mcgrof@kernel.org, gost.dev@samsung.com, hare@suse.de,
	Pankaj Raghav <p.raghav@samsung.com>
Subject: [RFC 3/4] fs/buffer: add folio_create_empty_buffers helper
Date: Fri, 14 Apr 2023 13:08:20 +0200	[thread overview]
Message-ID: <20230414110821.21548-4-p.raghav@samsung.com> (raw)
In-Reply-To: <20230414110821.21548-1-p.raghav@samsung.com>

Folio version of create_empty_buffers(). This is required to convert
create_page_buffers() to create_folio_buffers() later in the series.

It removes several calls to compound_head() as it works directly on folio
compared to create_empty_buffers().

Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>
---
 fs/buffer.c                 | 34 ++++++++++++++++++++++++++++++++++
 include/linux/buffer_head.h |  2 ++
 2 files changed, 36 insertions(+)

diff --git a/fs/buffer.c b/fs/buffer.c
index 0f9c2127543d..9e6a1a738fb5 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -1645,6 +1645,40 @@ void block_invalidate_folio(struct folio *folio, size_t offset, size_t length)
 }
 EXPORT_SYMBOL(block_invalidate_folio);
 
+/*
+ * We attach and possibly dirty the buffers atomically wrt
+ * block_dirty_folio() via private_lock.  try_to_free_buffers
+ * is already excluded via the folio lock.
+ */
+void folio_create_empty_buffers(struct folio *folio, unsigned long blocksize,
+				unsigned long b_state)
+{
+	struct buffer_head *bh, *head, *tail;
+
+	head = alloc_folio_buffers(folio, blocksize, true);
+	bh = head;
+	do {
+		bh->b_state |= b_state;
+		tail = bh;
+		bh = bh->b_this_page;
+	} while (bh);
+	tail->b_this_page = head;
+
+	spin_lock(&folio->mapping->private_lock);
+	if (folio_test_uptodate(folio) || folio_test_dirty(folio)) {
+		bh = head;
+		do {
+			if (folio_test_dirty(folio))
+				set_buffer_dirty(bh);
+			if (folio_test_uptodate(folio))
+				set_buffer_uptodate(bh);
+			bh = bh->b_this_page;
+		} while (bh != head);
+	}
+	folio_attach_private(folio, head);
+	spin_unlock(&folio->mapping->private_lock);
+}
+EXPORT_SYMBOL(folio_create_empty_buffers);
 
 /*
  * We attach and possibly dirty the buffers atomically wrt
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
index d5a2ef9b4cdf..8afa91cbb8e2 100644
--- a/include/linux/buffer_head.h
+++ b/include/linux/buffer_head.h
@@ -203,6 +203,8 @@ struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
 		bool retry);
 void create_empty_buffers(struct page *, unsigned long,
 			unsigned long b_state);
+void folio_create_empty_buffers(struct folio *, unsigned long,
+				unsigned long b_state);
 void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
 void end_buffer_write_sync(struct buffer_head *bh, int uptodate);
 void end_buffer_async_write(struct buffer_head *bh, int uptodate);
-- 
2.34.1


  parent reply	other threads:[~2023-04-14 11:08 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20230414110825eucas1p1ed4d16627889ef8542dfa31b1183063d@eucas1p1.samsung.com>
2023-04-14 11:08 ` [RFC 0/4] convert create_page_buffers to create_folio_buffers Pankaj Raghav
2023-04-14 11:08   ` [RFC 1/4] fs/buffer: add set_bh_folio helper Pankaj Raghav
2023-04-14 11:08   ` [RFC 2/4] buffer: add alloc_folio_buffers() helper Pankaj Raghav
2023-04-14 13:06     ` Matthew Wilcox
2023-04-14 15:01       ` Pankaj Raghav
2023-04-14 14:04     ` kernel test robot
2023-04-14 14:45     ` kernel test robot
2023-04-14 11:08   ` Pankaj Raghav [this message]
2023-04-14 13:16     ` [RFC 3/4] fs/buffer: add folio_create_empty_buffers helper Matthew Wilcox
2023-04-14 11:08   ` [RFC 4/4] fs/buffer: convert create_page_buffers to create_folio_buffers Pankaj Raghav
2023-04-14 13:21     ` Matthew Wilcox
2023-04-14 13:47   ` [RFC 0/4] " Hannes Reinecke
2023-04-14 13:51     ` Matthew Wilcox
2023-04-14 13:56       ` Hannes Reinecke
2023-04-14 15:00     ` Pankaj Raghav
2023-04-15  1:01     ` Luis Chamberlain
2023-04-15  2:31       ` Matthew Wilcox
2023-04-15  3:24         ` Luis Chamberlain
2023-04-15  3:44           ` Matthew Wilcox
2023-04-15 13:14             ` Hannes Reinecke
2023-04-15 17:09               ` Matthew Wilcox
2023-04-16  1:28                 ` Luis Chamberlain
2023-04-16  3:40                   ` Matthew Wilcox
2023-04-16  5:26                     ` Luis Chamberlain
2023-04-16 14:07                       ` Matthew Wilcox
2023-04-17 15:40                         ` Darrick J. Wong
2023-04-16 22:57                       ` Dave Chinner
2023-04-17  2:27     ` Luis Chamberlain
2023-04-17  6:04       ` Hannes Reinecke

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=20230414110821.21548-4-p.raghav@samsung.com \
    --to=p.raghav@samsung.com \
    --cc=akpm@linux-foundation.org \
    --cc=brauner@kernel.org \
    --cc=gost.dev@samsung.com \
    --cc=hare@suse.de \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mcgrof@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willy@infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.