From: Pankaj Raghav <p.raghav@xxxxxxxxxxx> 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 <p.raghav@xxxxxxxxxxx> Signed-off-by: Luis Chamberlain <mcgrof@xxxxxxxxxx> Link: https://lore.kernel.org/r/20240827-xfs-fix-wformat-bs-gt-ps-v1-1-aec6717609e0@xxxxxxxxxx # fix folded Link: https://lore.kernel.org/r/20240822135018.1931258-11-kernel@xxxxxxxxxxxxxxxx Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx> Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> --- 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 1e45f091dbb5bf..733ab3f1abc557 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 fa025aeb09712b..97f5003ea53862 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 141b2d397b1fe7..43af698fa90903 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 2f7413afbf46cd..33b84a3a83ff63 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__ */