From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
To: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>,
ntfs3@lists.linux.dev, linux-fsdevel@vger.kernel.org
Subject: [PATCH 08/10] ntfs3: Use a folio to read UpCase
Date: Wed, 17 Apr 2024 18:09:36 +0100 [thread overview]
Message-ID: <20240417170941.797116-9-willy@infradead.org> (raw)
In-Reply-To: <20240417170941.797116-1-willy@infradead.org>
Add a memcpy_from_folio_le16() which does the byteswapping.
This is now large folio safe and avoids kmap().
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/ntfs3/super.c | 25 +++++++++++--------------
include/linux/highmem.h | 31 +++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index f6a9ab0f5cad..00700598a717 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -1493,26 +1493,23 @@ static int ntfs_fill_super(struct super_block *sb, struct fs_context *fc)
goto put_inode_out;
}
- for (idx = 0; idx < (0x10000 * sizeof(short) >> PAGE_SHIFT); idx++) {
- const __le16 *src;
+ idx = 0;
+ while (idx < (0x10000 * sizeof(u16) >> PAGE_SHIFT)) {
u16 *dst = Add2Ptr(sbi->upcase, idx << PAGE_SHIFT);
- struct page *page = ntfs_map_page(inode->i_mapping, idx);
+ struct folio *folio = read_mapping_folio(inode->i_mapping,
+ idx, NULL);
+ size_t limit = 0x10000 * sizeof(u16) - idx * PAGE_SIZE;
- if (IS_ERR(page)) {
- err = PTR_ERR(page);
+ if (IS_ERR(folio)) {
+ err = PTR_ERR(folio);
ntfs_err(sb, "Failed to read $UpCase (%d).", err);
goto put_inode_out;
}
- src = page_address(page);
-
-#ifdef __BIG_ENDIAN
- for (i = 0; i < PAGE_SIZE / sizeof(u16); i++)
- *dst++ = le16_to_cpu(*src++);
-#else
- memcpy(dst, src, PAGE_SIZE);
-#endif
- ntfs_unmap_page(page);
+ memcpy_from_folio_le16(dst, folio, 0,
+ min(limit, folio_size(folio)));
+ idx += folio_nr_pages(folio);
+ folio_put(folio);
}
shared = ntfs_set_shared(sbi->upcase, 0x10000 * sizeof(short));
diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 00341b56d291..20b5d5a5feaf 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -467,6 +467,37 @@ static inline void memcpy_from_folio(char *to, struct folio *folio,
} while (len > 0);
}
+#ifdef __BIG_ENDIAN
+static inline void memcpy_from_folio_le16(u16 *to, struct folio *folio,
+ size_t offset, size_t len)
+{
+ VM_BUG_ON(offset + len > folio_size(folio));
+
+ do {
+ const __le16 *from = kmap_local_folio(folio, offset);
+ size_t chunk = len;
+
+ if (folio_test_highmem(folio) &&
+ chunk > PAGE_SIZE - offset_in_page(offset))
+ chunk = PAGE_SIZE - offset_in_page(offset);
+
+ for (i = 0; i < chunk / sizeof(*to); i++)
+ *to++ = le16_to_cpu(*from++);
+ kunmap_local(from);
+
+ to += chunk / sizeof(*to);
+ offset += chunk;
+ len -= chunk;
+ } while (len > 0);
+}
+#else
+static inline void memcpy_from_folio_le16(u16 *to, struct folio *folio,
+ size_t offset, size_t len)
+{
+ memcpy_from_folio((char *)to, folio, offset, len);
+}
+#endif
+
/**
* memcpy_to_folio - Copy a range of bytes to a folio.
* @folio: The folio to write to.
--
2.43.0
next prev parent reply other threads:[~2024-04-17 17:09 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-17 17:09 [PATCH 00/10] ntfs3: Convert (most of) ntfs3 to use folios Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 01/10] ntfs3: Convert ntfs_read_folio to use a folio Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 02/10] ntfs3: Convert ntfs_write_begin " Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 03/10] ntfs3: Convert attr_data_read_resident() to take " Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 04/10] ntfs3: Convert ntfs_write_end() to work on " Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 05/10] ntfs3: Convert attr_data_write_resident to use " Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 06/10] ntfs3: Convert attr_make_nonresident " Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 07/10] ntfs3: Convert reading $AttrDef to use folios Matthew Wilcox (Oracle)
2024-04-17 17:09 ` Matthew Wilcox (Oracle) [this message]
2024-04-17 17:32 ` [PATCH 08/10] ntfs3: Use a folio to read UpCase Matthew Wilcox
2024-04-19 0:30 ` kernel test robot
2024-04-19 1:12 ` kernel test robot
2024-04-17 17:09 ` [PATCH 09/10] ntfs3: Remove inode_write_data() Matthew Wilcox (Oracle)
2024-04-17 17:09 ` [PATCH 10/10] ntfs3: Remove ntfs_map_page and ntfs_unmap_page Matthew Wilcox (Oracle)
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=20240417170941.797116-9-willy@infradead.org \
--to=willy@infradead.org \
--cc=almaz.alexandrovich@paragon-software.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=ntfs3@lists.linux.dev \
/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).