From 9cc49a0805b05dcee27d96572d41008eb885eafe Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Wed, 30 Nov 2016 04:52:56 -0500 Subject: [PATCH] Add patches for Linux 4.9 Signed-off-by: Anders Kaseorg --- debian/changelog | 4 + ...nux-4.9-deal-with-demise-of-GROUP_AT.patch | 54 +++++++++++ ...de_change_ok-becomes-setattr_prepare.patch | 54 +++++++++++ ...ode_operation-rename-now-takes-flags.patch | 95 +++++++++++++++++++ debian/patches/series | 3 + 5 files changed, 210 insertions(+) create mode 100644 debian/patches/Linux-4.9-deal-with-demise-of-GROUP_AT.patch create mode 100644 debian/patches/Linux-4.9-inode_change_ok-becomes-setattr_prepare.patch create mode 100644 debian/patches/Linux-4.9-inode_operation-rename-now-takes-flags.patch diff --git a/debian/changelog b/debian/changelog index 5ada66794..951746877 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,10 @@ openafs (1.6.20-2) UNRELEASED; urgency=medium LINUX-do-not-use-d_invalidate-to-evict-dentries.patch, afs-shake-harder-in-shake-loose-vcaches.patch: Avoid system hangs on busy machines due to vcache deallocation failures. + - Linux-4.9-deal-with-demise-of-GROUP_AT.patch, + Linux-4.9-inode_operation-rename-now-takes-flags.patch, + Linux-4.9-inode_change_ok-becomes-setattr_prepare.patch: Support + Linux kernel 4.9. (Closes: #847011) -- Anders Kaseorg Thu, 01 Dec 2016 00:13:01 -0500 diff --git a/debian/patches/Linux-4.9-deal-with-demise-of-GROUP_AT.patch b/debian/patches/Linux-4.9-deal-with-demise-of-GROUP_AT.patch new file mode 100644 index 000000000..00976a259 --- /dev/null +++ b/debian/patches/Linux-4.9-deal-with-demise-of-GROUP_AT.patch @@ -0,0 +1,54 @@ +From 10fd7e53aa9086b6fba94dd3340517cbc7294655 Mon Sep 17 00:00:00 2001 +From: Mark Vitale +Date: Wed, 14 Sep 2016 18:01:22 -0400 +Subject: Linux 4.9: deal with demise of GROUP_AT + +Linux commit 81243eacfa40 "cred: simpler, 1D supplementary groups" +refactors the group_info struct, removing some members (which OpenAFS +references only through the GROUP_AT macro) and adding a gid member. +The GROUP_AT macro is also removed from the tree. + +Add an autoconfigure test for the new group_info member gid and define a +replacement GROUP_AT macro to do the right thing under the new regime. + +Change-Id: I85a52c0ae0d91fc141a523f443a4ffc05eb72a2b +Reviewed-on: https://gerrit.openafs.org/12390 +Tested-by: BuildBot +Reviewed-by: Benjamin Kaduk +(cherry picked from commit 8e81b182e36cde28ec5708e5fcbe56e4900b1ea3) +--- + acinclude.m4 | 1 + + src/afs/LINUX/osi_machdep.h | 5 +++++ + 2 files changed, 6 insertions(+) + +diff --git a/acinclude.m4 b/acinclude.m4 +index c645c3d03..38eefceb6 100644 +--- a/acinclude.m4 ++++ b/acinclude.m4 +@@ -878,6 +878,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) + AC_CHECK_LINUX_STRUCT([ctl_table], [ctl_name], [sysctl.h]) + AC_CHECK_LINUX_STRUCT([dentry], [d_u.d_alias], [dcache.h]) + AC_CHECK_LINUX_STRUCT([dentry_operations], [d_automount], [dcache.h]) ++ AC_CHECK_LINUX_STRUCT([group_info], [gid], [cred.h]) + AC_CHECK_LINUX_STRUCT([inode], [i_alloc_sem], [fs.h]) + AC_CHECK_LINUX_STRUCT([inode], [i_blkbits], [fs.h]) + AC_CHECK_LINUX_STRUCT([inode], [i_blksize], [fs.h]) +diff --git a/src/afs/LINUX/osi_machdep.h b/src/afs/LINUX/osi_machdep.h +index 54efc99b6..4448fdcfd 100644 +--- a/src/afs/LINUX/osi_machdep.h ++++ b/src/afs/LINUX/osi_machdep.h +@@ -146,6 +146,11 @@ static inline long copyinstr(char *from, char *to, int count, int *length) { + #define NGROUPS NGROUPS_SMALL + #endif + ++#ifdef STRUCT_GROUP_INFO_HAS_GID ++/* compat macro for Linux 4.9 */ ++#define GROUP_AT(gi,x) ((gi)->gid[x]) ++#endif ++ + typedef struct task_struct afs_proc_t; + + #ifdef HAVE_LINUX_KUID_T +-- +2.11.0 + diff --git a/debian/patches/Linux-4.9-inode_change_ok-becomes-setattr_prepare.patch b/debian/patches/Linux-4.9-inode_change_ok-becomes-setattr_prepare.patch new file mode 100644 index 000000000..1842b7152 --- /dev/null +++ b/debian/patches/Linux-4.9-inode_change_ok-becomes-setattr_prepare.patch @@ -0,0 +1,54 @@ +From 89199cf23e8d61bc010eebb45c987d531927f3b2 Mon Sep 17 00:00:00 2001 +From: Mark Vitale +Date: Thu, 20 Oct 2016 00:49:37 -0400 +Subject: Linux 4.9: inode_change_ok() becomes setattr_prepare() + +Linux commit 31051c85b5e2 "fs: Give dentry to inode_change_ok() instead +of inode" renames and modifies inode_change_ok(inode, attrs) to +setattr_prepare(dentry, attrs). + +Modify OpenAFS to cope. + +Change-Id: I72f8dfbdbd25d7c775e9c35116e323ea4359e95c +Reviewed-on: https://gerrit.openafs.org/12418 +Tested-by: BuildBot +Reviewed-by: Benjamin Kaduk +(cherry picked from commit 8aeb711eeaa5ddac5a74c354091e2d4f7ac0cd63) +--- + acinclude.m4 | 3 +++ + src/afs/LINUX/osi_file.c | 4 ++++ + 2 files changed, 7 insertions(+) + +diff --git a/acinclude.m4 b/acinclude.m4 +index c9291bfdb..966d05d8f 100644 +--- a/acinclude.m4 ++++ b/acinclude.m4 +@@ -1020,6 +1020,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) + AC_CHECK_LINUX_FUNC([set_nlink], + [#include ], + [set_nlink(NULL, 1);]) ++ AC_CHECK_LINUX_FUNC([setattr_prepare], ++ [#include ], ++ [setattr_prepare(NULL, NULL);]) + AC_CHECK_LINUX_FUNC([sock_create_kern], + [#include ], + [sock_create_kern(0, 0, 0, NULL);]) +diff --git a/src/afs/LINUX/osi_file.c b/src/afs/LINUX/osi_file.c +index ea0ea5d23..b230c0bf5 100644 +--- a/src/afs/LINUX/osi_file.c ++++ b/src/afs/LINUX/osi_file.c +@@ -184,7 +184,11 @@ osi_UFSTruncate(struct osi_file *afile, afs_int32 asize) + newattrs.ia_ctime = CURRENT_TIME; + + /* avoid notify_change() since it wants to update dentry->d_parent */ ++#ifdef HAVE_LINUX_SETATTR_PREPARE ++ code = setattr_prepare(file_dentry(afile->filp), &newattrs); ++#else + code = inode_change_ok(inode, &newattrs); ++#endif + if (!code) + code = afs_inode_setattr(afile, &newattrs); + if (!code) +-- +2.11.0 + diff --git a/debian/patches/Linux-4.9-inode_operation-rename-now-takes-flags.patch b/debian/patches/Linux-4.9-inode_operation-rename-now-takes-flags.patch new file mode 100644 index 000000000..3b236238a --- /dev/null +++ b/debian/patches/Linux-4.9-inode_operation-rename-now-takes-flags.patch @@ -0,0 +1,95 @@ +From b025473a664a5dcbdeb496aafebace60820377e1 Mon Sep 17 00:00:00 2001 +From: Mark Vitale +Date: Fri, 16 Sep 2016 19:01:19 -0400 +Subject: Linux 4.9: inode_operation rename now takes flags + +In Linux 3.15 commit 520c8b16505236fc82daa352e6c5e73cd9870cff, +inode_operation rename2() was added. It takes the same arguments as +rename(), with an added flags argument supporting the following values: + +RENAME_NOREPLACE: if "new" name exists, fail with -EEXIST. Without +this flag, the default behavior is to replace the "new" existing file. + +RENAME_EXCHANGE: exchange source and target; both must exist. + +OpenAFS never implemented a .rename2() routine because it was optional +when introduced at Linux v3.15. + +In Linux 4.9-rc1 the following commits remove the last in-tree uses of +.rename() and converts .rename2() to .rename(). +aadfa8019e81 vfs: add note about i_op->rename changes to porting +2773bf00aeb9 fs: rename "rename2" i_op to "rename" +18fc84dafaac vfs: remove unused i_op->rename +1cd66c93ba8c fs: make remaining filesystems use .rename2 +e0e0be8a8355 libfs: support RENAME_NOREPLACE in simple_rename() +f03b8ad8d386 fs: support RENAME_NOREPLACE for local filesystems + +With these changes, it is now mandatory for OpenAFS afs_linux_rename() +to accept a 5th flag argument. + +Add an autoconfig test to determine the signature of .rename(). Use this +information to implement afs_linux_rename() with the appropriate number +of arguments. Implement "toleration support" for the flags option by +treating a zero flag as a normal rename; if any flags are specified, +return -EINVAL to indicate the OpenAFS filesystem does not yet support +any flags. + +Change-Id: I165d2b7956942446d97beda8504ac1ed5185a036 +Reviewed-on: https://gerrit.openafs.org/12391 +Tested-by: BuildBot +Reviewed-by: Benjamin Kaduk +(cherry picked from commit f21e3ef8ce5093b4e0578d29666f76bd99aef1a2) +--- + acinclude.m4 | 6 ++++++ + src/afs/LINUX/osi_vnodeops.c | 11 ++++++++++- + 2 files changed, 16 insertions(+), 1 deletion(-) + +diff --git a/acinclude.m4 b/acinclude.m4 +index 38eefceb6..c9291bfdb 100644 +--- a/acinclude.m4 ++++ b/acinclude.m4 +@@ -854,6 +854,12 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) + [#include ], + [void], + [struct inode *inode, void *link_data]) ++ AC_CHECK_LINUX_OPERATION([inode_operations], [rename], [takes_flags], ++ [#include ], ++ [int], ++ [struct inode *oinode, struct dentry *odentry, ++ struct inode *ninode, struct dentry *ndentry, ++ unsigned int flags]) + + dnl Check for header files + AC_CHECK_LINUX_HEADER([config.h]) +diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c +index ce89ebfb2..4a8f0e9dc 100644 +--- a/src/afs/LINUX/osi_vnodeops.c ++++ b/src/afs/LINUX/osi_vnodeops.c +@@ -1821,7 +1821,11 @@ afs_linux_rmdir(struct inode *dip, struct dentry *dp) + + static int + afs_linux_rename(struct inode *oldip, struct dentry *olddp, +- struct inode *newip, struct dentry *newdp) ++ struct inode *newip, struct dentry *newdp ++#ifdef HAVE_LINUX_INODE_OPERATIONS_RENAME_TAKES_FLAGS ++ , unsigned int flags ++#endif ++ ) + { + int code; + cred_t *credp = crref(); +@@ -1829,6 +1833,11 @@ afs_linux_rename(struct inode *oldip, struct dentry *olddp, + const char *newname = newdp->d_name.name; + struct dentry *rehash = NULL; + ++#ifdef HAVE_LINUX_INODE_OPERATIONS_RENAME_TAKES_FLAGS ++ if (flags) ++ return -EINVAL; /* no support for new flags yet */ ++#endif ++ + /* Prevent any new references during rename operation. */ + + if (!d_unhashed(newdp)) { +-- +2.11.0 + diff --git a/debian/patches/series b/debian/patches/series index 722ab5864..68f207a11 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -3,3 +3,6 @@ LINUX-split-dentry-eviction-from-osi_TryEvictVCache.patch Reformat-src-afs-LINUX-osi_vcache.c.patch LINUX-do-not-use-d_invalidate-to-evict-dentries.patch afs-shake-harder-in-shake-loose-vcaches.patch +Linux-4.9-deal-with-demise-of-GROUP_AT.patch +Linux-4.9-inode_operation-rename-now-takes-flags.patch +Linux-4.9-inode_change_ok-becomes-setattr_prepare.patch -- 2.39.5