[1835] | 1 | From 2c3b79c8c242d12398eff647753370787b7cf300 Mon Sep 17 00:00:00 2001 |
---|
| 2 | From: Marc Dionne <marc.c.dionne@gmail.com> |
---|
| 3 | Date: Fri, 28 Jan 2011 20:59:17 -0500 |
---|
| 4 | Subject: [PATCH 7/8] Linux: 2.6.38: deal with dcache_lock removal |
---|
| 5 | |
---|
| 6 | dcache_lock is gone in 2.6.38, and some of the vfs locking rules |
---|
| 7 | have changed. |
---|
| 8 | |
---|
| 9 | Of interest for openafs: |
---|
| 10 | - inode->i_lock protects the d_alias list |
---|
| 11 | - dentry->d_lock protects d_unhashed() |
---|
| 12 | |
---|
| 13 | Add a new configure test for dcache_lock, and replace its use by |
---|
| 14 | the appropriate new lock(s). |
---|
| 15 | |
---|
| 16 | Reviewed-on: http://gerrit.openafs.org/3771 |
---|
| 17 | Tested-by: BuildBot <buildbot@rampaginggeek.com> |
---|
| 18 | Reviewed-by: Derrick Brashear <shadow@dementia.org> |
---|
| 19 | (cherry picked from commit 2eca7aef7b2940e4ef5f9901ce28481af6edb6dd) |
---|
| 20 | |
---|
| 21 | Change-Id: Ie405bb1e40cca4ba83bca3e051e2ab54b8850ac6 |
---|
| 22 | Signed-off-by: Anders Kaseorg <andersk@mit.edu> |
---|
| 23 | Reviewed-on: http://gerrit.openafs.org/3998 |
---|
| 24 | Reviewed-by: Simon Wilkinson <sxw@inf.ed.ac.uk> |
---|
| 25 | Tested-by: BuildBot <buildbot@rampaginggeek.com> |
---|
| 26 | Reviewed-by: Marc Dionne <marc.c.dionne@gmail.com> |
---|
| 27 | Reviewed-by: Russ Allbery <rra@stanford.edu> |
---|
| 28 | Reviewed-on: http://gerrit.openafs.org/4043 |
---|
| 29 | Reviewed-by: Derrick Brashear <shadow@dementia.org> |
---|
| 30 | Tested-by: Derrick Brashear <shadow@dementia.org> |
---|
| 31 | --- |
---|
| 32 | acinclude.m4 | 1 + |
---|
| 33 | src/afs/afs_daemons.c | 8 ++++++++ |
---|
| 34 | src/afs/afs_vcache.c | 35 +++++++++++++++++++++++++++++++++-- |
---|
| 35 | src/cf/linux-test4.m4 | 11 +++++++++++ |
---|
| 36 | 4 files changed, 53 insertions(+), 2 deletions(-) |
---|
| 37 | |
---|
| 38 | diff --git a/acinclude.m4 b/acinclude.m4 |
---|
| 39 | index 7904e20..655fb11 100644 |
---|
| 40 | --- a/acinclude.m4 |
---|
| 41 | +++ b/acinclude.m4 |
---|
| 42 | @@ -817,6 +817,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) |
---|
| 43 | LINUX_GENERIC_FILE_AIO_READ |
---|
| 44 | LINUX_INIT_WORK_HAS_DATA |
---|
| 45 | LINUX_REGISTER_SYSCTL_TABLE_NOFLAG |
---|
| 46 | + LINUX_HAVE_DCACHE_LOCK |
---|
| 47 | LINUX_SYSCTL_TABLE_CHECKING |
---|
| 48 | LINUX_STRUCT_CTL_TABLE_HAS_CTL_NAME |
---|
| 49 | LINUX_HAVE_IGET |
---|
| 50 | diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c |
---|
| 51 | index bd5bba8..3d9d977 100644 |
---|
| 52 | --- a/src/afs/afs_daemons.c |
---|
| 53 | +++ b/src/afs/afs_daemons.c |
---|
| 54 | @@ -376,7 +376,11 @@ afs_CheckRootVolume(void) |
---|
| 55 | dp = d_find_alias(AFSTOV(afs_globalVp)); |
---|
| 56 | |
---|
| 57 | #if defined(AFS_LINUX24_ENV) |
---|
| 58 | +#if defined(HAVE_DCACHE_LOCK) |
---|
| 59 | spin_lock(&dcache_lock); |
---|
| 60 | +#else |
---|
| 61 | + spin_lock(&AFSTOV(vcp)->i_lock); |
---|
| 62 | +#endif |
---|
| 63 | #if defined(AFS_LINUX26_ENV) |
---|
| 64 | spin_lock(&dp->d_lock); |
---|
| 65 | #endif |
---|
| 66 | @@ -388,7 +392,11 @@ afs_CheckRootVolume(void) |
---|
| 67 | #if defined(AFS_LINUX26_ENV) |
---|
| 68 | spin_unlock(&dp->d_lock); |
---|
| 69 | #endif |
---|
| 70 | +#if defined(HAVE_DCACHE_LOCK) |
---|
| 71 | spin_unlock(&dcache_lock); |
---|
| 72 | +#else |
---|
| 73 | + spin_unlock(&AFSTOV(vcp)->i_lock); |
---|
| 74 | +#endif |
---|
| 75 | #endif |
---|
| 76 | dput(dp); |
---|
| 77 | |
---|
| 78 | diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c |
---|
| 79 | index 201bae7..63e6a27 100644 |
---|
| 80 | --- a/src/afs/afs_vcache.c |
---|
| 81 | +++ b/src/afs/afs_vcache.c |
---|
| 82 | @@ -673,12 +673,15 @@ afs_ShakeLooseVCaches(afs_int32 anumber) |
---|
| 83 | #if defined(AFS_LINUX22_ENV) |
---|
| 84 | if (tvc != afs_globalVp && VREFCOUNT(tvc) > 1 && tvc->opens == 0) { |
---|
| 85 | struct dentry *dentry; |
---|
| 86 | + struct inode *inode = AFSTOV(tvc); |
---|
| 87 | struct list_head *cur, *head; |
---|
| 88 | AFS_GUNLOCK(); |
---|
| 89 | + |
---|
| 90 | +#if defined(HAVE_DCACHE_LOCK) |
---|
| 91 | #if defined(AFS_LINUX24_ENV) |
---|
| 92 | spin_lock(&dcache_lock); |
---|
| 93 | #endif |
---|
| 94 | - head = &(AFSTOV(tvc))->i_dentry; |
---|
| 95 | + head = &inode->i_dentry; |
---|
| 96 | |
---|
| 97 | restart: |
---|
| 98 | cur = head; |
---|
| 99 | @@ -687,7 +690,6 @@ restart: |
---|
| 100 | |
---|
| 101 | if (d_unhashed(dentry)) |
---|
| 102 | continue; |
---|
| 103 | - |
---|
| 104 | dget_locked(dentry); |
---|
| 105 | |
---|
| 106 | #if defined(AFS_LINUX24_ENV) |
---|
| 107 | @@ -707,6 +709,35 @@ restart: |
---|
| 108 | #if defined(AFS_LINUX24_ENV) |
---|
| 109 | spin_unlock(&dcache_lock); |
---|
| 110 | #endif |
---|
| 111 | +#else /* HAVE_DCACHE_LOCK */ |
---|
| 112 | + spin_lock(&inode->i_lock); |
---|
| 113 | + head = &inode->i_dentry; |
---|
| 114 | + |
---|
| 115 | +restart: |
---|
| 116 | + cur = head; |
---|
| 117 | + while ((cur = cur->next) != head) { |
---|
| 118 | + dentry = list_entry(cur, struct dentry, d_alias); |
---|
| 119 | + |
---|
| 120 | + spin_lock(&dentry->d_lock); |
---|
| 121 | + if (d_unhashed(dentry)) { |
---|
| 122 | + spin_unlock(&dentry->d_lock); |
---|
| 123 | + continue; |
---|
| 124 | + } |
---|
| 125 | + spin_unlock(&dentry->d_lock); |
---|
| 126 | + dget(dentry); |
---|
| 127 | + |
---|
| 128 | + spin_unlock(&inode->i_lock); |
---|
| 129 | + if (d_invalidate(dentry) == -EBUSY) { |
---|
| 130 | + dput(dentry); |
---|
| 131 | + /* perhaps lock and try to continue? (use cur as head?) */ |
---|
| 132 | + goto inuse; |
---|
| 133 | + } |
---|
| 134 | + dput(dentry); |
---|
| 135 | + spin_lock(&inode->i_lock); |
---|
| 136 | + goto restart; |
---|
| 137 | + } |
---|
| 138 | + spin_unlock(&inode->i_lock); |
---|
| 139 | +#endif /* HAVE_DCACHE_LOCK */ |
---|
| 140 | inuse: |
---|
| 141 | AFS_GLOCK(); |
---|
| 142 | } |
---|
| 143 | diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 |
---|
| 144 | index 88e4863..2f426ce 100644 |
---|
| 145 | --- a/src/cf/linux-test4.m4 |
---|
| 146 | +++ b/src/cf/linux-test4.m4 |
---|
| 147 | @@ -1316,3 +1316,14 @@ AC_DEFUN([LINUX_HAVE_INODE_SETATTR], [ |
---|
| 148 | if test "x$ac_cv_linux_inode_setattr" = "xyes"; then |
---|
| 149 | AC_DEFINE([HAVE_LINUX_INODE_SETATTR], 1, [define if your kernel has inode_setattr()]) |
---|
| 150 | fi]) |
---|
| 151 | + |
---|
| 152 | +AC_DEFUN([LINUX_HAVE_DCACHE_LOCK], [ |
---|
| 153 | + AC_CHECK_LINUX_BUILD([for dcache_lock], |
---|
| 154 | + [ac_cv_linux_have_dcache_lock], |
---|
| 155 | + [#include <linux/dcache.h> ], |
---|
| 156 | + [printk("%p", &dcache_lock);], |
---|
| 157 | + [HAVE_DCACHE_LOCK], |
---|
| 158 | + [define if dcache_lock exists], |
---|
| 159 | + []) |
---|
| 160 | +]) |
---|
| 161 | + |
---|
| 162 | -- |
---|
| 163 | 1.7.3.4 |
---|
| 164 | |
---|