Linux 6.3 compat: writepage_t first arg struct folio*
The type def of writepage_t in kernel 6.3 is changed to take struct folio* as the first argument. We need to detect this change and pass correct function to write_cache_pages(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Youzhong Yang <yyang@mathworks.com> Closes #14699
This commit is contained in:
parent
6ecdd35bdb
commit
8eb2f26057
26
config/kernel-writepage_t.m4
Normal file
26
config/kernel-writepage_t.m4
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_WRITEPAGE_T], [
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change
|
||||||
|
dnl # The writepage_t function type now has its first argument as
|
||||||
|
dnl # struct folio* instead of struct page*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([writepage_t_folio], [
|
||||||
|
#include <linux/writeback.h>
|
||||||
|
int putpage(struct folio *folio,
|
||||||
|
struct writeback_control *wbc, void *data)
|
||||||
|
{ return 0; }
|
||||||
|
writepage_t func = putpage;
|
||||||
|
],[])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_WRITEPAGE_T], [
|
||||||
|
AC_MSG_CHECKING([whether int (*writepage_t)() takes struct folio*])
|
||||||
|
ZFS_LINUX_TEST_RESULT([writepage_t_folio], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_WRITEPAGE_T_FOLIO, 1,
|
||||||
|
[int (*writepage_t)() takes struct folio*])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
@ -151,6 +151,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||||||
ZFS_AC_KERNEL_SRC_IDMAP_MNT_API
|
ZFS_AC_KERNEL_SRC_IDMAP_MNT_API
|
||||||
ZFS_AC_KERNEL_SRC_IATTR_VFSID
|
ZFS_AC_KERNEL_SRC_IATTR_VFSID
|
||||||
ZFS_AC_KERNEL_SRC_FILEMAP
|
ZFS_AC_KERNEL_SRC_FILEMAP
|
||||||
|
ZFS_AC_KERNEL_SRC_WRITEPAGE_T
|
||||||
case "$host_cpu" in
|
case "$host_cpu" in
|
||||||
powerpc*)
|
powerpc*)
|
||||||
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
||||||
@ -281,6 +282,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||||||
ZFS_AC_KERNEL_IDMAP_MNT_API
|
ZFS_AC_KERNEL_IDMAP_MNT_API
|
||||||
ZFS_AC_KERNEL_IATTR_VFSID
|
ZFS_AC_KERNEL_IATTR_VFSID
|
||||||
ZFS_AC_KERNEL_FILEMAP
|
ZFS_AC_KERNEL_FILEMAP
|
||||||
|
ZFS_AC_KERNEL_WRITEPAGE_T
|
||||||
case "$host_cpu" in
|
case "$host_cpu" in
|
||||||
powerpc*)
|
powerpc*)
|
||||||
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
||||||
|
@ -736,6 +736,29 @@ zpl_putpage(struct page *pp, struct writeback_control *wbc, void *data)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_WRITEPAGE_T_FOLIO
|
||||||
|
static int
|
||||||
|
zpl_putfolio(struct folio *pp, struct writeback_control *wbc, void *data)
|
||||||
|
{
|
||||||
|
(void) zpl_putpage(&pp->page, wbc, data);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
zpl_write_cache_pages(struct address_space *mapping,
|
||||||
|
struct writeback_control *wbc, void *data)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
#ifdef HAVE_WRITEPAGE_T_FOLIO
|
||||||
|
result = write_cache_pages(mapping, wbc, zpl_putfolio, data);
|
||||||
|
#else
|
||||||
|
result = write_cache_pages(mapping, wbc, zpl_putpage, data);
|
||||||
|
#endif
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
|
zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
|
||||||
{
|
{
|
||||||
@ -760,7 +783,7 @@ zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
|
|||||||
*/
|
*/
|
||||||
boolean_t for_sync = (sync_mode == WB_SYNC_ALL);
|
boolean_t for_sync = (sync_mode == WB_SYNC_ALL);
|
||||||
wbc->sync_mode = WB_SYNC_NONE;
|
wbc->sync_mode = WB_SYNC_NONE;
|
||||||
result = write_cache_pages(mapping, wbc, zpl_putpage, &for_sync);
|
result = zpl_write_cache_pages(mapping, wbc, &for_sync);
|
||||||
if (sync_mode != wbc->sync_mode) {
|
if (sync_mode != wbc->sync_mode) {
|
||||||
if ((result = zpl_enter_verify_zp(zfsvfs, zp, FTAG)) != 0)
|
if ((result = zpl_enter_verify_zp(zfsvfs, zp, FTAG)) != 0)
|
||||||
return (result);
|
return (result);
|
||||||
@ -776,8 +799,7 @@ zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
|
|||||||
* details). That being said, this is a no-op in most cases.
|
* details). That being said, this is a no-op in most cases.
|
||||||
*/
|
*/
|
||||||
wbc->sync_mode = sync_mode;
|
wbc->sync_mode = sync_mode;
|
||||||
result = write_cache_pages(mapping, wbc, zpl_putpage,
|
result = zpl_write_cache_pages(mapping, wbc, &for_sync);
|
||||||
&for_sync);
|
|
||||||
}
|
}
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user