From 0006eb36440dcb4dc06aa61c35db40bf7dec0ddc Mon Sep 17 00:00:00 2001 From: Shaun Tancheff Date: Sun, 2 Apr 2023 06:47:51 -0500 Subject: [PATCH] LU-16328 llite: migrate_folio, vfs_setxattr Linux commit v5.19-rc3-392-g5490da4f06d1 fs: Add aops->migrate_folio Linux commit v5.19-rc4-52-ge33c267ab70d mm: shrinkers: provide shrinkers with names From Linux commit v5.19-rc5-17-g0c5fd887d2bb acl: move idmapped mount fixup into vfs_{g,s}etxattr() Until Linux commit v6.0-rc3-6-g6344e66970c6 xattr: constify value argument in vfs_setxattr() Cast away const when required. Linux commit v5.19-10313-geba2d3d79829 get rid of non-advancing variants iov_iter_get_pages_alloc2() replaces iov_iter_get_pages_alloc() Test-Parameters: trivial HPE-bug-id: LUS-11358 Signed-off-by: Shaun Tancheff Change-Id: Id1fa6db94172c0a61008ba4b066907950bdd6473 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/49265 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: xinliang Reviewed-by: Oleg Drokin --- lustre/autoconf/lustre-core.m4 | 118 +++++++++++++++++++++++++++++++++++++++++ lustre/include/lustre_compat.h | 19 ++++++- lustre/llite/rw26.c | 18 +++---- 3 files changed, 142 insertions(+), 13 deletions(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index c80f0b5..87f461b 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -3391,6 +3391,112 @@ AC_DEFUN([LC_HAVE_ADDRESS_SPACE_OPERATIONS_RELEASE_FOLIO], [ ]) # LC_HAVE_ADDRESS_SPACE_OPERATIONS_RELEASE_FOLIO # +# LC_HAVE_ADDRESS_SPACE_OPERATIONS_MIGRATE_FOLIO +# +# Linux commit v5.19-rc3-392-g5490da4f06d1 +# fs: Add aops->migrate_folio +# +AC_DEFUN([LC_SRC_HAVE_ADDRESS_SPACE_OPERATIONS_MIGRATE_FOLIO], [ + LB2_LINUX_TEST_SRC([address_space_operations_migrate_folio], [ + #include + ],[ + struct address_space_operations *aops = NULL; + struct address_space *m = NULL; + struct folio *src = NULL; + struct folio *dst = NULL; + int err = aops->migrate_folio(m, dst, src, MIGRATE_ASYNC); + (void)err; + ],[-Werror]) +]) +AC_DEFUN([LC_HAVE_ADDRESS_SPACE_OPERATIONS_MIGRATE_FOLIO], [ + AC_MSG_CHECKING([if struct address_space_operations() has migrate_folio()]) + LB2_LINUX_TEST_RESULT([address_space_operations_migrate_folio], [ + AC_DEFINE(HAVE_AOPS_MIGRATE_FOLIO, 1, + [struct address_space_operations() has migrate_folio()]) + ]) +]) # LC_HAVE_ADDRESS_SPACE_OPERATIONS_MIGRATE_FOLIO + +# +# LC_REGISTER_SHRINKER_FORMAT_NAMED +# +# Linux commit v5.19-rc4-52-ge33c267ab70d +# mm: shrinkers: provide shrinkers with names +# +AC_DEFUN([LC_SRC_REGISTER_SHRINKER_FORMAT_NAMED], [ + LB2_LINUX_TEST_SRC([register_shrinker_format], [ + #include + ],[ + if (register_shrinker(NULL, "lustre-%ps", __func__)) + unregister_shrinker(NULL); + ],[-Werror]) +]) +AC_DEFUN([LC_REGISTER_SHRINKER_FORMAT_NAMED], [ + AC_MSG_CHECKING([if register_shrinker() returns status]) + LB2_LINUX_TEST_RESULT([address_space_operations_migrate_folio], [ + AC_DEFINE(HAVE_REGISTER_SHRINKER_FORMAT_NAMED, 1, + [register_shrinker() returns status]) + ]) +]) # LC_REGISTER_SHRINKER_FORMAT_NAMED + +# +# LC_HAVE_VFS_SETXATTR_NON_CONST_VALUE +# +# From Linux commit v5.19-rc5-17-g0c5fd887d2bb +# acl: move idmapped mount fixup into vfs_{g,s}etxattr() +# Until Linux commit v6.0-rc3-6-g6344e66970c6 +# xattr: constify value argument in vfs_setxattr() +# +AC_DEFUN([LC_SRC_HAVE_VFS_SETXATTR_NON_CONST_VALUE], [ + LB2_LINUX_TEST_SRC([vfs_setxattr_non_const_value_arg], [ + #include + ],[ + struct dentry *de = NULL; + const char *name = "an.xattr"; + const void *value = NULL; + int err = vfs_setxattr(&init_user_ns, de, name, value, 0, 0); + (void)err; + ],[-Werror]) +]) # LC_HAVE_VFS_SETXATTR_NON_CONST_VALUE +AC_DEFUN([LC_HAVE_VFS_SETXATTR_NON_CONST_VALUE], [ + AC_MSG_CHECKING([if vfs_setxattr() value argument is non-const]) + LB2_LINUX_TEST_RESULT([vfs_setxattr_non_const_value_arg], [ + AC_DEFINE([VFS_SETXATTR_VALUE(value)], + [(value)], + [vfs_setxattr() value argument is const void *]) + ],[ + AC_DEFINE([VFS_SETXATTR_VALUE(value)], + [((void *)(value))], + [vfs_setxattr() value argument is non-const]) + ]) +]) # LC_HAVE_VFS_SETXATTR_NON_CONST_VALUE + +# +# LC_HAVE_IOV_ITER_GET_PAGES_ALLOC2 +# +# Linux commit v5.19-10313-geba2d3d79829 +# get rid of non-advancing variants +# +AC_DEFUN([LC_SRC_HAVE_IOV_ITER_GET_PAGES_ALLOC2], [ + LB2_LINUX_TEST_SRC([iov_iter_get_pages_alloc2], [ + #include + ],[ + struct iov_iter *iter = NULL; + struct page ***pages = NULL; + size_t maxsize = 1; + size_t start; + size_t result __attribute__ ((unused)); + result = iov_iter_get_pages_alloc2(iter, pages, maxsize, &start); + ],[-Werror]) +]) +AC_DEFUN([LC_HAVE_IOV_ITER_GET_PAGES_ALLOC2], [ + AC_MSG_CHECKING([if iov_iter_get_pages_alloc2() is available]) + LB2_LINUX_TEST_RESULT([iov_iter_get_pages_alloc2], [ + AC_DEFINE(HAVE_IOV_ITER_GET_PAGES_ALLOC2, 1, + [iov_iter_get_pages_alloc2() is available]) + ]) +]) # LC_HAVE_IOV_ITER_GET_PAGES_ALLOC2 + +# # LC_PROG_LINUX # # Lustre linux kernel checks @@ -3615,6 +3721,12 @@ AC_DEFUN([LC_PROG_LINUX_SRC], [ LC_SRC_HAVE_READ_CACHE_PAGE_FILLER_WITH_FILE LC_SRC_HAVE_ADDRESS_SPACE_OPERATIONS_RELEASE_FOLIO + # 6.0 + LC_SRC_HAVE_ADDRESS_SPACE_OPERATIONS_MIGRATE_FOLIO + LC_SRC_REGISTER_SHRINKER_FORMAT_NAMED + LC_SRC_HAVE_VFS_SETXATTR_NON_CONST_VALUE + LC_SRC_HAVE_IOV_ITER_GET_PAGES_ALLOC2 + # kernel patch to extend integrity interface LC_SRC_BIO_INTEGRITY_PREP_FN ]) @@ -3854,6 +3966,12 @@ AC_DEFUN([LC_PROG_LINUX_RESULTS], [ LC_HAVE_READ_CACHE_PAGE_FILLER_WITH_FILE LC_HAVE_ADDRESS_SPACE_OPERATIONS_RELEASE_FOLIO + # 6.0 + LC_HAVE_ADDRESS_SPACE_OPERATIONS_MIGRATE_FOLIO + LC_REGISTER_SHRINKER_FORMAT_NAMED + LC_HAVE_VFS_SETXATTR_NON_CONST_VALUE + LC_HAVE_IOV_ITER_GET_PAGES_ALLOC2 + # kernel patch to extend integrity interface LC_BIO_INTEGRITY_PREP_FN ]) diff --git a/lustre/include/lustre_compat.h b/lustre/include/lustre_compat.h index 696a9df..ade2beb 100644 --- a/lustre/include/lustre_compat.h +++ b/lustre/include/lustre_compat.h @@ -510,7 +510,8 @@ static inline int ll_vfs_setxattr(struct dentry *dentry, struct inode *inode, const void *value, size_t size, int flags) { #ifdef HAVE_USER_NAMESPACE_ARG - return vfs_setxattr(&init_user_ns, dentry, name, value, size, flags); + return vfs_setxattr(&init_user_ns, dentry, name, + VFS_SETXATTR_VALUE(value), size, flags); #elif defined(HAVE_VFS_SETXATTR) return __vfs_setxattr(dentry, inode, name, value, size, flags); #else @@ -559,7 +560,21 @@ static inline bool is_root_inode(struct inode *inode) } #endif -#ifndef HAVE_REGISTER_SHRINKER_RET +#ifndef HAVE_IOV_ITER_GET_PAGES_ALLOC2 +#define iov_iter_get_pages_alloc2(i, p, m, s) \ + iov_iter_get_pages_alloc((i), (p), (m), (s)) +#endif + +#ifdef HAVE_AOPS_MIGRATE_FOLIO +#define folio_migr folio +#else +#define folio_migr page +#define migrate_folio migratepage +#endif + +#ifdef HAVE_REGISTER_SHRINKER_FORMAT_NAMED +#define register_shrinker(_s) register_shrinker((_s), "%ps", (_s)) +#elif !defined(HAVE_REGISTER_SHRINKER_RET) #define register_shrinker(_s) (register_shrinker(_s), 0) #endif diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c index 0480952..63c0f8f 100644 --- a/lustre/llite/rw26.c +++ b/lustre/llite/rw26.c @@ -255,11 +255,7 @@ static ssize_t ll_get_user_pages(int rw, struct iov_iter *iter, size_t start; size_t result; - /* - * iov_iter_get_pages_alloc() is introduced in 3.16 similar - * to HAVE_DIO_ITER. - */ - result = iov_iter_get_pages_alloc(iter, pages, maxsize, &start); + result = iov_iter_get_pages_alloc2(iter, pages, maxsize, &start); if (result > 0) *npages = DIV_ROUND_UP(result + start, PAGE_SIZE); @@ -989,12 +985,12 @@ out: } #ifdef CONFIG_MIGRATION -static int ll_migratepage(struct address_space *mapping, - struct page *newpage, struct page *page, - enum migrate_mode mode) +static int ll_migrate_folio(struct address_space *mapping, + struct folio_migr *newpage, struct folio_migr *page, + enum migrate_mode mode) { - /* Always fail page migration until we have a proper implementation */ - return -EIO; + /* Always fail page migration until we have a proper implementation */ + return -EIO; } #endif @@ -1025,6 +1021,6 @@ const struct address_space_operations ll_aops = { .write_begin = ll_write_begin, .write_end = ll_write_end, #ifdef CONFIG_MIGRATION - .migratepage = ll_migratepage, + .migrate_folio = ll_migrate_folio, #endif }; -- 1.8.3.1