Whamcloud - gitweb
LU-16328 llite: migrate_folio, vfs_setxattr 65/49265/14
authorShaun Tancheff <shaun.tancheff@hpe.com>
Sun, 2 Apr 2023 11:47:51 +0000 (06:47 -0500)
committerOleg Drokin <green@whamcloud.com>
Tue, 11 Apr 2023 20:06:35 +0000 (20:06 +0000)
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 <shaun.tancheff@hpe.com>
Change-Id: Id1fa6db94172c0a61008ba4b066907950bdd6473
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/49265
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: xinliang <xinliang.liu@linaro.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/autoconf/lustre-core.m4
lustre/include/lustre_compat.h
lustre/llite/rw26.c

index c80f0b5..87f461b 100644 (file)
@@ -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 <linux/fs.h>
+       ],[
+               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 <linux/mm.h>
+       ],[
+               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 <linux/xattr.h>
+       ],[
+               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 <linux/uio.h>
+       ],[
+               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
 ])
index 696a9df..ade2beb 100644 (file)
@@ -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
 
index 0480952..63c0f8f 100644 (file)
@@ -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
 };