summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO6
-rw-r--r--0001-Linux-4.10-have_submounts-is-gone.patch99
-rw-r--r--PKGBUILD12
3 files changed, 112 insertions, 5 deletions
diff --git a/.SRCINFO b/.SRCINFO
index f860a1ecf1e9..5f02ad37f6f5 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,9 +1,9 @@
# Generated by mksrcinfo v8
-# Fri Dec 16 19:49:56 UTC 2016
+# Tue Feb 28 15:39:00 UTC 2017
pkgbase = openafs-modules-dkms
pkgdesc = Kernel module for OpenAFS (dkms)
pkgver = 1.6.20.1
- pkgrel = 1
+ pkgrel = 2
url = http://www.openafs.org
arch = i686
arch = x86_64
@@ -18,8 +18,10 @@ pkgbase = openafs-modules-dkms
options = !emptydirs
source = http://openafs.org/dl/1.6.20.1/openafs-1.6.20.1-src.tar.bz2
source = dkms.conf
+ source = 0001-Linux-4.10-have_submounts-is-gone.patch
sha256sums = dc869eecf6c81949d3dd2021eaf87118ef9b90ec5012a35f64836a02a58a8826
sha256sums = ea7d1e6dfb5006016e25738be722c8793765f52ad55c0bbf588dd7fdf2bdd2bf
+ sha256sums = 48efa08f0c384df84ce114f418a2db8607ab3e4f32bbcfd60ef54b8c1bae2e94
pkgname = openafs-modules-dkms
diff --git a/0001-Linux-4.10-have_submounts-is-gone.patch b/0001-Linux-4.10-have_submounts-is-gone.patch
new file mode 100644
index 000000000000..429a1126dc92
--- /dev/null
+++ b/0001-Linux-4.10-have_submounts-is-gone.patch
@@ -0,0 +1,99 @@
+From 20fd9eadba0b46033571debc8927f29fc1b6c246 Mon Sep 17 00:00:00 2001
+From: Mark Vitale <mvitale@sinenomine.net>
+Date: Wed, 7 Dec 2016 11:11:45 -0500
+Subject: [PATCH] Linux 4.10: have_submounts is gone
+
+Linux commit f74e7b33c37e vfs: remove unused have_submounts() function
+(v4.10-rc2) removes have_submounts from the tree after providing a
+replacement (path_has_submounts) for its last in-tree caller, autofs.
+
+However, it turns out that OpenAFS is better off not using the new
+path_has_submounts. Instead, OpenAFS could/should have stopped using
+have_submounts() much earlier, back in Linux v3.18 when d_invalidate
+became void. At that time, most in-tree callers of have_submounts had
+already been converted to use check_submounts_and_drop back in v3.12.
+At v3.18, a series of commits modified check_submounts_and_drop to
+automatically remove child submounts (instead of returning -EBUSY if a
+submount was detected), then subsumed it into d_invalidate. The end
+result was that VFS now implicitly handles much of the housekeeping
+previously called explicitly by the various filesystem d_revalidate
+routines:
+- shrink_dcache_parent
+- check_submounts_and_drop
+- d_drop
+- d_invalidate
+All in-tree filesystem d_revalidate routines were updated to take
+advantage of this new VFS support.
+
+Modify afs_linux_dentry_revalidate to no longer perform any special
+handling for invalid dentries when D_INVALIDATE_IS_VOID. Instead, allow
+our VFS caller to properly clean up any invalid dentry when we return 0.
+
+Reviewed-on: https://gerrit.openafs.org/12506
+Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
+Tested-by: BuildBot <buildbot@rampaginggeek.com>
+Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
+(cherry picked from commit 789319bf0f2b26ad67995f8cbe88cee87a1bbdc0)
+
+Change-Id: I7ed22338e7896f69a204be78ed0a4f6136a3dab8
+---
+ src/afs/LINUX/osi_vnodeops.c | 27 ++++++++++++++++++++-------
+ 1 file changed, 20 insertions(+), 7 deletions(-)
+
+diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
+index 4a8f0e9dc..816cdddd9 100644
+--- a/src/afs/LINUX/osi_vnodeops.c
++++ b/src/afs/LINUX/osi_vnodeops.c
+@@ -1318,6 +1318,24 @@ afs_linux_dentry_revalidate(struct dentry *dp, int flags)
+
+ good_dentry:
+ valid = 1;
++ goto done;
++
++ bad_dentry:
++ valid = 0;
++#ifndef D_INVALIDATE_IS_VOID
++ /* When (v3.18) d_invalidate was converted to void, it also started
++ * being called automatically from revalidate, and automatically
++ * handled:
++ * - shrink_dcache_parent
++ * - automatic detach of submounts
++ * - d_drop
++ * Therefore, after that point, OpenAFS revalidate logic no longer needs
++ * to do any of those things itself for invalid dentry structs. We only need
++ * to tell VFS it's invalid (by returning 0), and VFS will handle the rest.
++ */
++ if (have_submounts(dp))
++ valid = 1;
++#endif
+
+ done:
+ /* Clean up */
+@@ -1328,6 +1346,7 @@ afs_linux_dentry_revalidate(struct dentry *dp, int flags)
+ if (credp)
+ crfree(credp);
+
++#ifndef D_INVALIDATE_IS_VOID
+ if (!valid) {
+ /*
+ * If we had a negative lookup for the name we want to forcibly
+@@ -1340,15 +1359,9 @@ afs_linux_dentry_revalidate(struct dentry *dp, int flags)
+ } else
+ d_invalidate(dp);
+ }
+-
++#endif
+ return valid;
+
+- bad_dentry:
+- if (have_submounts(dp))
+- valid = 1;
+- else
+- valid = 0;
+- goto done;
+ }
+
+ static void
+--
+2.12.0
+
diff --git a/PKGBUILD b/PKGBUILD
index 098c923dbbf9..51c799447628 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,4 +1,5 @@
# Maintainer: Michael Lass <bevan@bi-co.net>
+# Contributor: Konstantin Gizdov <arch at kge dot pw>
# This PKGBUILD is maintained on github:
# https://github.com/michaellass/AUR
@@ -6,7 +7,7 @@
pkgname=openafs-modules-dkms
_srcname=openafs
pkgver=1.6.20.1
-pkgrel=1
+pkgrel=2
pkgdesc="Kernel module for OpenAFS (dkms)"
arch=('i686' 'x86_64' 'armv7h')
url="http://www.openafs.org"
@@ -16,13 +17,18 @@ provides=("openafs-modules=$pkgver")
conflicts=('openafs-features-libafs' 'openafs-modules' 'openafs<1.6.6-2')
options=(!emptydirs)
source=(http://openafs.org/dl/${pkgver}/${_srcname}-${pkgver}-src.tar.bz2
- dkms.conf)
+ dkms.conf
+ 0001-Linux-4.10-have_submounts-is-gone.patch)
sha256sums=('dc869eecf6c81949d3dd2021eaf87118ef9b90ec5012a35f64836a02a58a8826'
- 'ea7d1e6dfb5006016e25738be722c8793765f52ad55c0bbf588dd7fdf2bdd2bf')
+ 'ea7d1e6dfb5006016e25738be722c8793765f52ad55c0bbf588dd7fdf2bdd2bf'
+ '48efa08f0c384df84ce114f418a2db8607ab3e4f32bbcfd60ef54b8c1bae2e94')
prepare() {
cd ${srcdir}/${_srcname}-${pkgver}
+ # add upstream patch for kernel 4.10
+ patch -p1 -i "${srcdir}"/0001-Linux-4.10-have_submounts-is-gone.patch
+
# Only needed when changes to configure were made
# ./regen.sh -q
}