From 8a04405248abc604e569d2d20fa6852c012b82fe Mon Sep 17 00:00:00 2001
From: Pankaj Raghav
Date: Sun, 20 Oct 2024 17:10:46 -0700
Subject: [PATCH] xfs: enable block size larger than page size support
Source kernel commit: 7df7c204c678e24cd32d33360538670b7b90e330
Page cache now has the ability to have a minimum order when allocating
a folio which is a prerequisite to add support for block size > page
size.
Signed-off-by: Pankaj Raghav
Signed-off-by: Luis Chamberlain
Link: https://lore.kernel.org/r/20240827-xfs-fix-wformat-bs-gt-ps-v1-1-aec6717609e0@kernel.org # fix folded
Link: https://lore.kernel.org/r/20240822135018.1931258-11-kernel@pankajraghav.com
Reviewed-by: Darrick J. Wong
Reviewed-by: Dave Chinner
Signed-off-by: Christian Brauner
---
libxfs/init.c | 5 +++++
libxfs/libxfs_priv.h | 1 +
libxfs/xfs_ialloc.c | 5 +++++
libxfs/xfs_shared.h | 3 +++
4 files changed, 14 insertions(+)
diff --git a/libxfs/init.c b/libxfs/init.c
index 1e45f091..733ab3f1 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -22,6 +22,7 @@
#include "xfs_rmap_btree.h"
#include "xfs_refcount_btree.h"
#include "libfrog/platform.h"
+#include "libfrog/util.h"
#include "libxfs/xfile.h"
#include "libxfs/buf_mem.h"
@@ -44,6 +45,8 @@ int use_xfs_buf_lock; /* global flag: use xfs_buf locks for MT */
static int nextfakedev = -1; /* device number to give to next fake device */
+unsigned int PAGE_SHIFT;
+
/*
* Checks whether a given device has a mounted, writable
* filesystem, returns 1 if it does & fatal (just warns
@@ -257,6 +260,8 @@ libxfs_close_devices(
int
libxfs_init(struct libxfs_init *a)
{
+ if (!PAGE_SHIFT)
+ PAGE_SHIFT = log2_roundup(PAGE_SIZE);
xfs_check_ondisk_structs();
xmbuf_libinit();
rcu_init();
diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h
index fa025aeb..97f5003e 100644
--- a/libxfs/libxfs_priv.h
+++ b/libxfs/libxfs_priv.h
@@ -224,6 +224,7 @@ uint32_t get_random_u32(void);
#endif
#define PAGE_SIZE getpagesize()
+extern unsigned int PAGE_SHIFT;
#define inode_peek_iversion(inode) (inode)->i_version
#define inode_set_iversion_queried(inode, version) do { \
diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c
index 141b2d39..43af698f 100644
--- a/libxfs/xfs_ialloc.c
+++ b/libxfs/xfs_ialloc.c
@@ -3029,6 +3029,11 @@ xfs_ialloc_setup_geometry(
igeo->ialloc_align = mp->m_dalign;
else
igeo->ialloc_align = 0;
+
+ if (mp->m_sb.sb_blocksize > PAGE_SIZE)
+ igeo->min_folio_order = mp->m_sb.sb_blocklog - PAGE_SHIFT;
+ else
+ igeo->min_folio_order = 0;
}
/* Compute the location of the root directory inode that is laid out by mkfs. */
diff --git a/libxfs/xfs_shared.h b/libxfs/xfs_shared.h
index 2f7413af..33b84a3a 100644
--- a/libxfs/xfs_shared.h
+++ b/libxfs/xfs_shared.h
@@ -224,6 +224,9 @@ struct xfs_ino_geometry {
/* precomputed value for di_flags2 */
uint64_t new_diflags2;
+ /* minimum folio order of a page cache allocation */
+ unsigned int min_folio_order;
+
};
#endif /* __XFS_SHARED_H__ */
--
2.47.2