Linux-5.19: Remove flags from aops->write_begin

The Linux 5.19 commits:

 fs: Remove aop flags parameter from grab_cache_page_write_begin()
  (b7446e7c)
 fs: Remove flags parameter from aops->write_begin (9d6b0cd7)

removed the flags parameter from the address space operations
'write_begin' as well as removing the flags parameter from the Linux
function 'grab_cache_page_write_begin'.

Add an autoconf test to see if grab_cache_page_write_begin takes 2 or
3 parameters. Use this as a test to determine if the address space
operations 'write_begin' takes a flags parameter.

Create a version of afs_linux_write_begin that does not take a flags
parameter, which also calls grab_cache_page_write_begin without flags.

Change-Id: Ib98c615e6964202748c78037c9ecac459fc3372b
Reviewed-on: https://gerrit.openafs.org/15041
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
This commit is contained in:
Cheyenne Wills 2022-07-05 10:33:19 -06:00 committed by Benjamin Kaduk
parent bfb852197e
commit 52d8df218f
3 changed files with 38 additions and 3 deletions

View File

@ -138,7 +138,9 @@ hlist_unhashed(const struct hlist_node *h) {
#define AOP_WRITEPAGE_ACTIVATE WRITEPAGE_ACTIVATE
#endif
#if defined(STRUCT_ADDRESS_SPACE_OPERATIONS_HAS_WRITE_BEGIN) && !defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN)
#if defined(STRUCT_ADDRESS_SPACE_OPERATIONS_HAS_WRITE_BEGIN) && \
!defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_WITHFLAGS) && \
!defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_NOFLAGS)
static inline struct page *
grab_cache_page_write_begin(struct address_space *mapping, pgoff_t index,
unsigned int flags) {

View File

@ -3476,6 +3476,33 @@ afs_linux_write_end(struct file *file, struct address_space *mapping,
return code;
}
# if defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_NOFLAGS)
static int
afs_linux_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len,
struct page **pagep, void **fsdata)
{
struct page *page;
pgoff_t index = pos >> PAGE_SHIFT;
unsigned int from = pos & (PAGE_SIZE - 1);
int code;
page = grab_cache_page_write_begin(mapping, index);
if (!page) {
return -ENOMEM;
}
*pagep = page;
code = afs_linux_prepare_write(file, page, from, from + len);
if (code) {
unlock_page(page);
put_page(page);
}
return code;
}
# else
static int
afs_linux_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
@ -3501,7 +3528,8 @@ afs_linux_write_begin(struct file *file, struct address_space *mapping,
return code;
}
#endif
# endif /* HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_NOFLAGS */
#endif /* STRUCT_ADDRESS_SPACE_OPERATIONS_HAS_WRITE_BEGIN */
#ifndef STRUCT_DENTRY_OPERATIONS_HAS_D_AUTOMOUNT
static void *

View File

@ -59,9 +59,14 @@ AC_CHECK_LINUX_FUNC([find_task_by_pid],
AC_CHECK_LINUX_FUNC([generic_file_aio_read],
[#include <linux/fs.h>],
[generic_file_aio_read(NULL,NULL,0,0);])
AC_CHECK_LINUX_FUNC([grab_cache_page_write_begin],
dnl - linux 5.19 removed the flags parameter, need to test
dnl - with and without the flags parameter
AC_CHECK_LINUX_FUNC([grab_cache_page_write_begin_withflags],
[#include <linux/pagemap.h>],
[grab_cache_page_write_begin(NULL, 0, 0);])
AC_CHECK_LINUX_FUNC([grab_cache_page_write_begin_noflags],
[#include <linux/pagemap.h>],
[grab_cache_page_write_begin(NULL, 0);])
AC_CHECK_LINUX_FUNC([hlist_unhashed],
[#include <linux/list.h>],
[hlist_unhashed(0);])