source: trunk/server/common/patches/openafs-linux-support.patch @ 2343

Last change on this file since 2343 was 2337, checked in by andersk, 12 years ago
Revert to OpenAFS 1.6.1 plus minimal patches for Linux 3.6
File size: 33.5 KB
RevLine 
[2337]1From 53774c945e91ea344cbe51c9fafae8acf711f558 Mon Sep 17 00:00:00 2001
2From: Marc Dionne <marc.c.dionne@gmail.com>
3Date: Mon, 28 May 2012 21:43:12 -0400
4Subject: [PATCH 01/12] Linux 3.4: replace end_writeback with clear_inode
5
6end_writeback() is renamed to clear_inode().  Add a configure test
7and cope.
8
9Change-Id: Icaf5b6b54d0ee377fabcf0b295d690eaa6b4be5e
10Reviewed-on: http://gerrit.openafs.org/7503
11Reviewed-by: Derrick Brashear <shadow@dementix.org>
12Tested-by: BuildBot <buildbot@rampaginggeek.com>
13(cherry picked from commit 2b33384a4a7b88842281021129ffccc837d91d36)
14---
15 acinclude.m4               | 3 +++
16 src/afs/LINUX/osi_vfsops.c | 4 ++++
17 2 files changed, 7 insertions(+)
18
19diff --git a/acinclude.m4 b/acinclude.m4
20index 6e2c9ae..c14b581 100644
21--- a/acinclude.m4
22+++ b/acinclude.m4
23@@ -840,6 +840,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
24 #include <linux/page-flags.h>],
25                                     [struct page *_page;
26                                       int bchecked = PageFsMisc(_page);])
27+                AC_CHECK_LINUX_FUNC([clear_inode],
28+                                    [#include <linux/fs.h>],
29+                                    [clear_inode(NULL);])
30                 AC_CHECK_LINUX_FUNC([current_kernel_time],
31                                     [#include <linux/time.h>],
32                                     [struct timespec s;
33diff --git a/src/afs/LINUX/osi_vfsops.c b/src/afs/LINUX/osi_vfsops.c
34index a6be1b3..bc951a2 100644
35--- a/src/afs/LINUX/osi_vfsops.c
36+++ b/src/afs/LINUX/osi_vfsops.c
37@@ -284,7 +284,11 @@ afs_evict_inode(struct inode *ip)
38        osi_Panic("inode freed while still hashed");
39 
40     truncate_inode_pages(&ip->i_data, 0);
41+#if defined(HAVE_LINUX_CLEAR_INODE)
42+    clear_inode(ip);
43+#else
44     end_writeback(ip);
45+#endif
46 
47 #if !defined(STRUCT_SUPER_OPERATIONS_HAS_ALLOC_INODE)
48     afs_osi_Free(ip->u.generic_ip, sizeof(struct vcache));
49--
501.8.0
51
52
53From 235dee4c449bb5d5307f9b14d5effa4509d58efc Mon Sep 17 00:00:00 2001
54From: Marc Dionne <marc.c.dionne@gmail.com>
55Date: Sat, 2 Jun 2012 21:35:53 -0400
56Subject: [PATCH 02/12] Linux 3.5: encode_fh API change
57
58The encode_fh export operation now expects two inode arguments
59instead of a dentry and a "connectable" flag.  Use the inode of
60the dentry we're interested in, and NULL as the parent inode which
61is the same as passing a 0 flag in the previous API.
62
63Change-Id: I05cf146fb2a4bacdca20a9f108d04ccb11530804
64Reviewed-on: http://gerrit.openafs.org/7523
65Tested-by: BuildBot <buildbot@rampaginggeek.com>
66Reviewed-by: Derrick Brashear <shadow@dementix.org>
67(cherry picked from commit 5227148ae17949705487ea673d558ebfe143e635)
68---
69 acinclude.m4               |  1 +
70 src/afs/LINUX/osi_compat.h |  4 ++++
71 src/cf/linux-test4.m4      | 14 ++++++++++++++
72 3 files changed, 19 insertions(+)
73
74diff --git a/acinclude.m4 b/acinclude.m4
75index c14b581..25484cf 100644
76--- a/acinclude.m4
77+++ b/acinclude.m4
78@@ -958,6 +958,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
79                 LINUX_D_COUNT_IS_INT
80                 LINUX_IOP_MKDIR_TAKES_UMODE_T
81                 LINUX_IOP_CREATE_TAKES_UMODE_T
82+                LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES
83 
84                 dnl If we are guaranteed that keyrings will work - that is
85                 dnl  a) The kernel has keyrings enabled
86diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
87index b94295c..4c7c261 100644
88--- a/src/afs/LINUX/osi_compat.h
89+++ b/src/afs/LINUX/osi_compat.h
90@@ -333,7 +333,11 @@ afs_get_dentry_from_fh(struct super_block *afs_cacheSBp, afs_dcache_id_t *ainode
91 static inline int
92 afs_get_fh_from_dentry(struct dentry *dp, afs_ufs_dcache_id_t *ainode, int *max_lenp) {
93     if (dp->d_sb->s_export_op->encode_fh)
94+#if defined(EXPORT_OP_ENCODE_FH_TAKES_INODES)
95+        return dp->d_sb->s_export_op->encode_fh(dp->d_inode, &ainode->raw[0], max_lenp, NULL);
96+#else
97         return dp->d_sb->s_export_op->encode_fh(dp, &ainode->raw[0], max_lenp, 0);
98+#endif
99 #if defined(NEW_EXPORT_OPS)
100     /* If fs doesn't provide an encode_fh method, assume the default INO32 type */
101     *max_lenp = sizeof(struct fid)/4;
102diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4
103index f5e91b1..f13e97d 100644
104--- a/src/cf/linux-test4.m4
105+++ b/src/cf/linux-test4.m4
106@@ -661,3 +661,17 @@ AC_DEFUN([LINUX_IOP_CREATE_TAKES_UMODE_T], [
107                        [define if inode.i_op->create takes a umode_t argument],
108                        [-Werror])
109 ])
110+
111+
112+AC_DEFUN([LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES], [
113+  AC_CHECK_LINUX_BUILD([whether export operation encode_fh takes inode arguments],
114+                       [ac_cv_linux_export_op_encode_fh__takes_inodes],
115+                       [#include <linux/exportfs.h>],
116+                       [struct export_operations _exp_ops;
117+                       int _encode_fh(struct inode *i, __u32 *fh, int *len, struct inode *p)
118+                               {return 0;};
119+                       _exp_ops.encode_fh = _encode_fh;],
120+                       [EXPORT_OP_ENCODE_FH_TAKES_INODES],
121+                       [define if encode_fh export op takes inode arguments],
122+                       [-Werror])
123+])
124--
1251.8.0
126
127
128From f6093c4716d36b7499b5c84950e6ec4480745467 Mon Sep 17 00:00:00 2001
129From: Marc Dionne <marc.c.dionne@gmail.com>
130Date: Sat, 2 Jun 2012 20:45:08 -0400
131Subject: [PATCH 03/12] afsd: include sys/resource.h in afsd_kernel.c
132
133With a recent glibc update, sys/wait.h no longer includes
134sys/resource.h unless __USE_SVID, __USE_XOPEN or __USE_XOPEN2K8
135are set.
136
137Don't rely on the indirect inclusion to get the bits we need;
138include it directly in afsd_kernel.c.  This include used to be
139there but was dropped when afsd_kernel.c was split off.
140
141Reviewed-on: http://gerrit.openafs.org/7522
142Tested-by: BuildBot <buildbot@rampaginggeek.com>
143Reviewed-by: Derrick Brashear <shadow@dementix.org>
144(cherry picked from commit bc3a32a84facb8114a8c7de87025f972d0281098)
145
146Change-Id: Ia5ba6a0e662607e680b4431f146c969b7069bcfd
147Reviewed-on: http://gerrit.openafs.org/8155
148Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
149Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
150Tested-by: Derrick Brashear <shadow@your-file-system.com>
151(cherry picked from commit 5842f856652051a4386b1e0170f18dca911ca4c6)
152---
153 src/afsd/afsd_kernel.c | 4 ++++
154 1 file changed, 4 insertions(+)
155
156diff --git a/src/afsd/afsd_kernel.c b/src/afsd/afsd_kernel.c
157index 1f7fdbb..e1e87a7 100644
158--- a/src/afsd/afsd_kernel.c
159+++ b/src/afsd/afsd_kernel.c
160@@ -37,6 +37,10 @@
161 #include <sys/param.h>
162 #endif
163 
164+#if defined(AFS_LINUX20_ENV)
165+#include <sys/resource.h>
166+#endif
167+
168 #ifdef HAVE_SYS_FS_TYPES_H
169 #include <sys/fs_types.h>
170 #endif
171--
1721.8.0
173
174
175From 31a7f5ef2fcb81c2510834befd15fb057d067eaf Mon Sep 17 00:00:00 2001
176From: Marc Dionne <marc.c.dionne@gmail.com>
177Date: Mon, 13 Aug 2012 20:32:08 -0400
178Subject: [PATCH 04/12] Linux: bypass: consolidate copy_page macros into a
179 single function
180
181The copy_page(s) macros are very similar; combine them into a
182single function that can be used for all cases.
183
184This will make it easier to add some pre-processor logic around
185the kmap_atomic calls to adapt to Linux API changes.
186
187Reviewed-on: http://gerrit.openafs.org/7980
188Tested-by: BuildBot <buildbot@rampaginggeek.com>
189Reviewed-by: Derrick Brashear <shadow@dementix.org>
190(cherry picked from commit 0a8256a26fafb490b454f2a857b0c15d859572c5)
191
192Change-Id: I6835a024428b26a8cd8d073f6304d0d0b3042b24
193Reviewed-on: http://gerrit.openafs.org/8077
194Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
195Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
196Tested-by: BuildBot <buildbot@rampaginggeek.com>
197(cherry picked from commit 54db9af1a87c03d6f00ab70565c9d1f733813fc2)
198---
199 src/afs/afs_bypasscache.c | 63 ++++++++++++++++++-----------------------------
200 1 file changed, 24 insertions(+), 39 deletions(-)
201
202diff --git a/src/afs/afs_bypasscache.c b/src/afs/afs_bypasscache.c
203index e447024..b350233 100644
204--- a/src/afs/afs_bypasscache.c
205+++ b/src/afs/afs_bypasscache.c
206@@ -270,49 +270,12 @@ done:
207 #ifdef UKERNEL
208 typedef void * bypass_page_t;
209 
210-#define copy_page(pp, pageoff, rxiov, iovno, iovoff, auio, curiov)     \
211-    do { \
212-       int dolen = auio->uio_iov[curiov].iov_len - pageoff; \
213-       memcpy(((char *)pp) + pageoff,                 \
214-              ((char *)rxiov[iovno].iov_base) + iovoff, dolen);        \
215-       auio->uio_resid -= dolen; \
216-    } while(0)
217-
218-#define copy_pages(pp, pageoff, rxiov, iovno, iovoff, auio, curiov)    \
219-    do { \
220-       int dolen = rxiov[iovno].iov_len - iovoff; \
221-       memcpy(((char *)pp) + pageoff,                          \
222-              ((char *)rxiov[iovno].iov_base) + iovoff, dolen);        \
223-       auio->uio_resid -= dolen;       \
224-    } while(0)
225-
226 #define unlock_and_release_pages(auio)
227 #define release_full_page(pp, pageoff)
228 
229 #else
230 typedef struct page * bypass_page_t;
231 
232-#define copy_page(pp, pageoff, rxiov, iovno, iovoff, auio, curiov)     \
233-    do { \
234-        char *address;                                         \
235-       int dolen = auio->uio_iov[curiov].iov_len - pageoff; \
236-       address = kmap_atomic(pp, KM_USER0); \
237-       memcpy(address + pageoff, \
238-              (char *)(rxiov[iovno].iov_base) + iovoff, dolen);        \
239-       kunmap_atomic(address, KM_USER0); \
240-    } while(0)
241-
242-#define copy_pages(pp, pageoff, rxiov, iovno, iovoff, auio, curiov)    \
243-    do { \
244-        char *address; \
245-       int dolen = rxiov[iovno].iov_len - iovoff; \
246-       address = kmap_atomic(pp, KM_USER0); \
247-       memcpy(address + pageoff, \
248-              (char *)(rxiov[iovno].iov_base) + iovoff, dolen);        \
249-       kunmap_atomic(address, KM_USER0); \
250-    } while(0)
251-
252-
253 #define unlock_and_release_pages(auio) \
254     do { \
255        struct iovec *ciov;     \
256@@ -347,8 +310,30 @@ typedef struct page * bypass_page_t;
257            afs_warn("afs_NoCacheFetchProc: page not locked!\n"); \
258        put_page(pp); /* decrement refcount */ \
259     } while(0)
260+#endif
261+
262+static void
263+afs_bypass_copy_page(bypass_page_t pp, int pageoff, struct iovec *rxiov,
264+       int iovno, int iovoff, struct uio *auio, int curiov, int partial)
265+{
266+    char *address;
267+    int dolen;
268+
269+    if (partial)
270+       dolen = rxiov[iovno].iov_len - iovoff;
271+    else
272+       dolen = auio->uio_iov[curiov].iov_len - pageoff;
273 
274+#if !defined(UKERNEL)
275+    address = kmap_atomic(pp, KM_USER0);
276+#else
277+    address = pp;
278 #endif
279+    memcpy(address + pageoff, (char *)(rxiov[iovno].iov_base) + iovoff, dolen);
280+#if !defined(UKERNEL)
281+    kunmap_atomic(address, KM_USER0);
282+#endif
283+}
284 
285 /* no-cache prefetch routine */
286 static afs_int32
287@@ -447,7 +432,7 @@ afs_NoCacheFetchProc(struct rx_call *acall,
288                if (pageoff + (rxiov[iovno].iov_len - iovoff) <= auio->uio_iov[curpage].iov_len) {
289                    /* Copy entire (or rest of) current iovec into current page */
290                    if (pp)
291-                       copy_pages(pp, pageoff, rxiov, iovno, iovoff, auio, curpage);
292+                       afs_bypass_copy_page(pp, pageoff, rxiov, iovno, iovoff, auio, curpage, 0);
293                    length -= (rxiov[iovno].iov_len - iovoff);
294                    pageoff += rxiov[iovno].iov_len - iovoff;
295                    iovno++;
296@@ -455,7 +440,7 @@ afs_NoCacheFetchProc(struct rx_call *acall,
297                } else {
298                    /* Copy only what's needed to fill current page */
299                    if (pp)
300-                       copy_page(pp, pageoff, rxiov, iovno, iovoff, auio, curpage);
301+                       afs_bypass_copy_page(pp, pageoff, rxiov, iovno, iovoff, auio, curpage, 1);
302                    length -= (auio->uio_iov[curpage].iov_len - pageoff);
303                    iovoff += auio->uio_iov[curpage].iov_len - pageoff;
304                    pageoff = auio->uio_iov[curpage].iov_len;
305--
3061.8.0
307
308
309From 51102503174a33c0bbb74a062a9413a0f041588e Mon Sep 17 00:00:00 2001
310From: Marc Dionne <marc.c.dionne@gmail.com>
311Date: Tue, 14 Aug 2012 16:34:42 -0400
312Subject: [PATCH 05/12] Linux 3.6: kmap_atomic API change
313
314kmap_atomic no longer requires a KM_TYPE argument.  Test for this
315and adjust the affected code.
316
317Reviewed-on: http://gerrit.openafs.org/7981
318Tested-by: BuildBot <buildbot@rampaginggeek.com>
319Reviewed-by: Derrick Brashear <shadow@dementix.org>
320(cherry picked from commit 049c485b4a39ba510035788b4959d839ef668c55)
321
322Change-Id: Iac8be7901da4b277864b1b6cc987cf5087992789
323Reviewed-on: http://gerrit.openafs.org/8078
324Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
325Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
326Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
327Tested-by: BuildBot <buildbot@rampaginggeek.com>
328(cherry picked from commit 76ab286feb1570efa9763e076020fc43fb0a95fa)
329---
330 acinclude.m4              |  1 +
331 src/afs/afs_bypasscache.c |  8 ++++++++
332 src/cf/linux-test4.m4     | 12 ++++++++++++
333 3 files changed, 21 insertions(+)
334
335diff --git a/acinclude.m4 b/acinclude.m4
336index 25484cf..20fd15e 100644
337--- a/acinclude.m4
338+++ b/acinclude.m4
339@@ -959,6 +959,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
340                 LINUX_IOP_MKDIR_TAKES_UMODE_T
341                 LINUX_IOP_CREATE_TAKES_UMODE_T
342                 LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES
343+                LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE
344 
345                 dnl If we are guaranteed that keyrings will work - that is
346                 dnl  a) The kernel has keyrings enabled
347diff --git a/src/afs/afs_bypasscache.c b/src/afs/afs_bypasscache.c
348index b350233..1138f89 100644
349--- a/src/afs/afs_bypasscache.c
350+++ b/src/afs/afs_bypasscache.c
351@@ -325,13 +325,21 @@ afs_bypass_copy_page(bypass_page_t pp, int pageoff, struct iovec *rxiov,
352        dolen = auio->uio_iov[curiov].iov_len - pageoff;
353 
354 #if !defined(UKERNEL)
355+# if defined(KMAP_ATOMIC_TAKES_NO_KM_TYPE)
356+    address = kmap_atomic(pp);
357+# else
358     address = kmap_atomic(pp, KM_USER0);
359+# endif
360 #else
361     address = pp;
362 #endif
363     memcpy(address + pageoff, (char *)(rxiov[iovno].iov_base) + iovoff, dolen);
364 #if !defined(UKERNEL)
365+# if defined(KMAP_ATOMIC_TAKES_NO_KM_TYPE)
366+    kunmap_atomic(address);
367+# else
368     kunmap_atomic(address, KM_USER0);
369+# endif
370 #endif
371 }
372 
373diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4
374index f13e97d..7db805f 100644
375--- a/src/cf/linux-test4.m4
376+++ b/src/cf/linux-test4.m4
377@@ -675,3 +675,15 @@ AC_DEFUN([LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES], [
378                        [define if encode_fh export op takes inode arguments],
379                        [-Werror])
380 ])
381+
382+
383+AC_DEFUN([LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE], [
384+  AC_CHECK_LINUX_BUILD([whether kmap_atomic takes no km_type argument],
385+                       [ac_cv_linux_kma_atomic_takes_no_km_type],
386+                       [#include <linux/highmem.h>],
387+                       [struct page *p = NULL;
388+                       kmap_atomic(p);],
389+                       [KMAP_ATOMIC_TAKES_NO_KM_TYPE],
390+                       [define if kmap_atomic takes no km_type argument],
391+                       [-Werror])
392+])
393--
3941.8.0
395
396
397From f842c54d6cba963ce34f2d092c9586c6ee21a13c Mon Sep 17 00:00:00 2001
398From: Marc Dionne <marc.c.dionne@gmail.com>
399Date: Mon, 13 Aug 2012 21:36:15 -0400
400Subject: [PATCH 06/12] Linux 3.6: dentry_open API change
401
402dentry_open now takes a path argument that combines the dentry and
403the vfsmount pointers.
404Add a configure test and a new compat inline function to keep things
405cleaner in the main source file.
406
407Reviewed-on: http://gerrit.openafs.org/7982
408Tested-by: BuildBot <buildbot@rampaginggeek.com>
409Reviewed-by: Derrick Brashear <shadow@dementix.org>
410(cherry picked from commit 8766a65e97eb90cb6c97ccd35181c441ece14f8a)
411
412Change-Id: I2c0f59ad9aa6e544a2a613e902933d463f22a5b6
413Reviewed-on: http://gerrit.openafs.org/8079
414Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
415Tested-by: BuildBot <buildbot@rampaginggeek.com>
416Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
417(cherry picked from commit 1bba9760b26bdb1ef1e17f9d1e15be9d565828cc)
418---
419 acinclude.m4               |  1 +
420 src/afs/LINUX/osi_compat.h | 16 ++++++++++++++++
421 src/afs/LINUX/osi_file.c   |  4 ++--
422 src/cf/linux-test4.m4      | 12 ++++++++++++
423 4 files changed, 31 insertions(+), 2 deletions(-)
424
425diff --git a/acinclude.m4 b/acinclude.m4
426index 20fd15e..d99c755 100644
427--- a/acinclude.m4
428+++ b/acinclude.m4
429@@ -960,6 +960,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
430                 LINUX_IOP_CREATE_TAKES_UMODE_T
431                 LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES
432                 LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE
433+                LINUX_DENTRY_OPEN_TAKES_PATH
434 
435                 dnl If we are guaranteed that keyrings will work - that is
436                 dnl  a) The kernel has keyrings enabled
437diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
438index 4c7c261..84fcaa5 100644
439--- a/src/afs/LINUX/osi_compat.h
440+++ b/src/afs/LINUX/osi_compat.h
441@@ -445,4 +445,20 @@ afs_get_dentry_ref(struct path *path, struct vfsmount **mnt, struct dentry **dpp
442 #endif
443 }
444 
445+#if defined(STRUCT_TASK_STRUCT_HAS_CRED)
446+static inline struct file *
447+afs_dentry_open(struct dentry *dp, struct vfsmount *mnt, int flags, const struct cred *creds) {
448+#if defined(DENTRY_OPEN_TAKES_PATH)
449+    struct path path;
450+    struct file *filp;
451+    path.mnt = mnt;
452+    path.dentry = dp;
453+    filp = dentry_open(&path, flags, creds);
454+    return filp;
455+#else
456+    return dentry_open(dp, mntget(mnt), flags, creds);
457+#endif
458+}
459+#endif
460+
461 #endif /* AFS_LINUX_OSI_COMPAT_H */
462diff --git a/src/afs/LINUX/osi_file.c b/src/afs/LINUX/osi_file.c
463index 3c20fd9..27806ab 100644
464--- a/src/afs/LINUX/osi_file.c
465+++ b/src/afs/LINUX/osi_file.c
466@@ -56,9 +56,9 @@ afs_linux_raw_open(afs_dcache_id_t *ainode)
467 
468 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
469     /* Use stashed credentials - prevent selinux/apparmor problems  */
470-    filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, cache_creds);
471+    filp = afs_dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, cache_creds);
472     if (IS_ERR(filp))
473-       filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, current_cred());
474+       filp = afs_dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, current_cred());
475 #else
476     filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR);
477 #endif
478diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4
479index 7db805f..427c5e1 100644
480--- a/src/cf/linux-test4.m4
481+++ b/src/cf/linux-test4.m4
482@@ -687,3 +687,15 @@ AC_DEFUN([LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE], [
483                        [define if kmap_atomic takes no km_type argument],
484                        [-Werror])
485 ])
486+
487+
488+AC_DEFUN([LINUX_DENTRY_OPEN_TAKES_PATH], [
489+  AC_CHECK_LINUX_BUILD([whether dentry_open takes a path argument],
490+                       [ac_cv_linux_dentry_open_takes_path],
491+                       [#include <linux/fs.h>],
492+                       [struct path p;
493+                       dentry_open(&p, 0, NULL);],
494+                       [DENTRY_OPEN_TAKES_PATH],
495+                       [define if dentry_open takes a path argument],
496+                       [-Werror])
497+])
498--
4991.8.0
500
501
502From 1aebd8757ba9684e0be18d722797a594146cefce Mon Sep 17 00:00:00 2001
503From: Marc Dionne <marc.c.dionne@gmail.com>
504Date: Mon, 13 Aug 2012 21:55:25 -0400
505Subject: [PATCH 07/12] Linux 3.6: d_alias and i_dentry are now hlists
506
507The d_alias pointer is now the head of an hlist.  This means the
508iterator is a different macro and has no "reverse" version since
509hlists have no direct pointer to the list tail.
510
511inode->i_dentry gets the same treatment.  Adjust where we use it.
512
513Reviewed-on: http://gerrit.openafs.org/7983
514Tested-by: BuildBot <buildbot@rampaginggeek.com>
515Reviewed-by: Derrick Brashear <shadow@dementix.org>
516(cherry picked from commit 6bea047fb404bde828c6358ae06f7941aa2bc959)
517
518Change-Id: I7e7b87e5f5c240f3f0ff25fa723c857ab9d0108c
519Reviewed-on: http://gerrit.openafs.org/8080
520Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
521Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
522Tested-by: BuildBot <buildbot@rampaginggeek.com>
523(cherry picked from commit b5a66fb391b47848f023042e96c87a1b7d49b888)
524---
525 acinclude.m4               |  1 +
526 src/afs/LINUX/osi_vcache.c | 12 ++++++++++++
527 src/afs/afs_daemons.c      |  5 +++++
528 src/cf/linux-test4.m4      | 13 +++++++++++++
529 4 files changed, 31 insertions(+)
530
531diff --git a/acinclude.m4 b/acinclude.m4
532index d99c755..d52d149 100644
533--- a/acinclude.m4
534+++ b/acinclude.m4
535@@ -961,6 +961,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
536                 LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES
537                 LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE
538                 LINUX_DENTRY_OPEN_TAKES_PATH
539+                LINUX_D_ALIAS_IS_HLIST
540 
541                 dnl If we are guaranteed that keyrings will work - that is
542                 dnl  a) The kernel has keyrings enabled
543diff --git a/src/afs/LINUX/osi_vcache.c b/src/afs/LINUX/osi_vcache.c
544index e82d78e..cd61c65 100644
545--- a/src/afs/LINUX/osi_vcache.c
546+++ b/src/afs/LINUX/osi_vcache.c
547@@ -19,7 +19,11 @@ osi_TryEvictVCache(struct vcache *avc, int *slept, int defersleep) {
548 
549     struct dentry *dentry;
550     struct inode *inode = AFSTOV(avc);
551+#if defined(D_ALIAS_IS_HLIST)
552+    struct hlist_node *cur, *head;
553+#else
554     struct list_head *cur, *head;
555+#endif
556 
557     /* First, see if we can evict the inode from the dcache */
558     if (defersleep && avc != afs_globalVp && VREFCOUNT(avc) > 1 && avc->opens == 0) {
559@@ -53,12 +57,20 @@ restart:
560        spin_unlock(&dcache_lock);
561 #else /* HAVE_DCACHE_LOCK */
562        spin_lock(&inode->i_lock);
563+#if defined(D_ALIAS_IS_HLIST)
564+       head = inode->i_dentry.first;
565+#else
566        head = &inode->i_dentry;
567+#endif
568 
569 restart:
570        cur = head;
571        while ((cur = cur->next) != head) {
572+#if defined(D_ALIAS_IS_HLIST)
573+           dentry = hlist_entry(cur, struct dentry, d_alias);
574+#else
575            dentry = list_entry(cur, struct dentry, d_alias);
576+#endif
577 
578            spin_lock(&dentry->d_lock);
579            if (d_unhashed(dentry)) {
580diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c
581index 23655e3..f47be0e 100644
582--- a/src/afs/afs_daemons.c
583+++ b/src/afs/afs_daemons.c
584@@ -396,8 +396,13 @@ afs_CheckRootVolume(void)
585                    spin_lock(&dp->d_lock);
586 #endif
587 #endif
588+#if defined(D_ALIAS_IS_HLIST)
589+                   hlist_del_init(&dp->d_alias);
590+                   hlist_add_head(&dp->d_alias, &(AFSTOV(vcp)->i_dentry));
591+#else
592                    list_del_init(&dp->d_alias);
593                    list_add(&dp->d_alias, &(AFSTOV(vcp)->i_dentry));
594+#endif
595                    dp->d_inode = AFSTOV(vcp);
596 #if defined(AFS_LINUX24_ENV)
597 #if defined(AFS_LINUX26_ENV)
598diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4
599index 427c5e1..6b70059 100644
600--- a/src/cf/linux-test4.m4
601+++ b/src/cf/linux-test4.m4
602@@ -699,3 +699,16 @@ AC_DEFUN([LINUX_DENTRY_OPEN_TAKES_PATH], [
603                        [define if dentry_open takes a path argument],
604                        [-Werror])
605 ])
606+
607+
608+AC_DEFUN([LINUX_D_ALIAS_IS_HLIST], [
609+  AC_CHECK_LINUX_BUILD([whether dentry->d_alias is an hlist],
610+                       [ac_cv_linux_d_alias_is_hlist],
611+                       [#include <linux/fs.h>],
612+                       [struct dentry *d = NULL;
613+                       struct hlist_node *hn = NULL;
614+                       d->d_alias = *hn;],
615+                       [D_ALIAS_IS_HLIST],
616+                       [define if dentry->d_alias is an hlist],
617+                       [])
618+])
619--
6201.8.0
621
622
623From 10f8f641542d9bc16c9a9c953324fa9d89b81607 Mon Sep 17 00:00:00 2001
624From: Marc Dionne <marc.c.dionne@gmail.com>
625Date: Tue, 14 Aug 2012 17:11:08 -0400
626Subject: [PATCH 08/12] Linux: fix variable used to test for the iop create
627 API
628
629Use correct variable when testing for the create API to use.
630
631This is just for looks - there is no effect since mkdir and create
632were changed in the same kernel release.
633
634Reviewed-on: http://gerrit.openafs.org/7984
635Reviewed-by: Alistair Ferguson <alistair.ferguson@mac.com>
636Tested-by: BuildBot <buildbot@rampaginggeek.com>
637Reviewed-by: Derrick Brashear <shadow@dementix.org>
638(cherry picked from commit c633a92a1bc7881f18ee641082ff2efe7da1a8cb)
639
640Change-Id: Ib23fe9a34bc07227614c149b0f16d3b0a067501b
641Reviewed-on: http://gerrit.openafs.org/8081
642Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
643Tested-by: BuildBot <buildbot@rampaginggeek.com>
644Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
645(cherry picked from commit aecd183acb34a0a9b850fb69eed472d2c9a27612)
646---
647 src/afs/LINUX/osi_vnodeops.c | 2 +-
648 1 file changed, 1 insertion(+), 1 deletion(-)
649
650diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
651index 4cda547..b3bf115 100644
652--- a/src/afs/LINUX/osi_vnodeops.c
653+++ b/src/afs/LINUX/osi_vnodeops.c
654@@ -1094,7 +1094,7 @@ struct dentry_operations afs_dentry_operations = {
655  * name is in kernel space at this point.
656  */
657 static int
658-#if defined(IOP_MKDIR_TAKES_UMODE_T)
659+#if defined(IOP_CREATE_TAKES_UMODE_T)
660 afs_linux_create(struct inode *dip, struct dentry *dp, umode_t mode,
661                 struct nameidata *nd)
662 #else
663--
6641.8.0
665
666
667From 6cbb9a258b73c28c0295f93b75cbd437efe3713a Mon Sep 17 00:00:00 2001
668From: Marc Dionne <marc.c.dionne@gmail.com>
669Date: Tue, 14 Aug 2012 17:28:50 -0400
670Subject: [PATCH 09/12] Linux 3.6: create inode operation API change
671
672The nameidata argument is dropped and a flag is added.
673
674Reviewed-on: http://gerrit.openafs.org/7985
675Tested-by: BuildBot <buildbot@rampaginggeek.com>
676Reviewed-by: Derrick Brashear <shadow@dementix.org>
677(cherry picked from commit 020e32779c103817ca89caa51259fb53bc3dde79)
678
679Change-Id: Iae2a0301a1c4acb6835eb0bdca6ae22b143b2cda
680Reviewed-on: http://gerrit.openafs.org/8082
681Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
682Tested-by: BuildBot <buildbot@rampaginggeek.com>
683Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
684(cherry picked from commit 5210d97865d974d5e14f68eec6a58b292d6b7893)
685---
686 acinclude.m4                 |  1 +
687 src/afs/LINUX/osi_vnodeops.c |  9 +++++----
688 src/cf/linux-test4.m4        | 15 +++++++++++++++
689 3 files changed, 21 insertions(+), 4 deletions(-)
690
691diff --git a/acinclude.m4 b/acinclude.m4
692index d52d149..1c84354 100644
693--- a/acinclude.m4
694+++ b/acinclude.m4
695@@ -962,6 +962,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
696                 LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE
697                 LINUX_DENTRY_OPEN_TAKES_PATH
698                 LINUX_D_ALIAS_IS_HLIST
699+                LINUX_IOP_I_CREATE_TAKES_BOOL
700 
701                 dnl If we are guaranteed that keyrings will work - that is
702                 dnl  a) The kernel has keyrings enabled
703diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
704index b3bf115..8c8045b 100644
705--- a/src/afs/LINUX/osi_vnodeops.c
706+++ b/src/afs/LINUX/osi_vnodeops.c
707@@ -1094,17 +1094,18 @@ struct dentry_operations afs_dentry_operations = {
708  * name is in kernel space at this point.
709  */
710 static int
711-#if defined(IOP_CREATE_TAKES_UMODE_T)
712+#if defined(IOP_CREATE_TAKES_BOOL)
713+afs_linux_create(struct inode *dip, struct dentry *dp, umode_t mode,
714+                bool excl)
715+#elif defined(IOP_CREATE_TAKES_UMODE_T)
716 afs_linux_create(struct inode *dip, struct dentry *dp, umode_t mode,
717                 struct nameidata *nd)
718-#else
719-#ifdef IOP_CREATE_TAKES_NAMEIDATA
720+#elif defined(IOP_CREATE_TAKES_NAMEIDATA)
721 afs_linux_create(struct inode *dip, struct dentry *dp, int mode,
722                 struct nameidata *nd)
723 #else
724 afs_linux_create(struct inode *dip, struct dentry *dp, int mode)
725 #endif
726-#endif
727 {
728     struct vattr vattr;
729     cred_t *credp = crref();
730diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4
731index 6b70059..dc30770 100644
732--- a/src/cf/linux-test4.m4
733+++ b/src/cf/linux-test4.m4
734@@ -712,3 +712,18 @@ AC_DEFUN([LINUX_D_ALIAS_IS_HLIST], [
735                        [define if dentry->d_alias is an hlist],
736                        [])
737 ])
738+
739+
740+AC_DEFUN([LINUX_IOP_I_CREATE_TAKES_BOOL], [
741+  AC_CHECK_LINUX_BUILD([whether inode_operations.create takes a bool],
742+                       [ac_cv_linux_func_i_create_takes_bool],
743+                       [#include <linux/fs.h>
744+                       #include <linux/namei.h>],
745+                       [struct inode _inode = {};
746+                       struct dentry _dentry;
747+                       bool b = true;
748+                       (void)_inode.i_op->create(&_inode, &_dentry, 0, b);],
749+                      [IOP_CREATE_TAKES_BOOL],
750+                      [define if your iops.create takes a bool argument],
751+                      [-Werror])
752+])
753--
7541.8.0
755
756
757From ebfd3de107e0dd97127aa12e572684cc98a457cf Mon Sep 17 00:00:00 2001
758From: Marc Dionne <marc.c.dionne@gmail.com>
759Date: Tue, 14 Aug 2012 18:08:51 -0400
760Subject: [PATCH 10/12] Linux 3.6: revalidate dentry op API change
761
762The nameidata argument is dropped, replaced by an unsigned flags
763value.  The configure test is very specific; kernels with the
764older API with a signed int flags value should fall through.
765
766Reviewed-on: http://gerrit.openafs.org/7986
767Tested-by: BuildBot <buildbot@rampaginggeek.com>
768Reviewed-by: Derrick Brashear <shadow@dementix.org>
769(cherry picked from commit 7413cd09a53f89882a46fd100bf6c501348f2188)
770
771Change-Id: Ie68d70dcf414d24e7e980c8a8f35b83550d2da7c
772Reviewed-on: http://gerrit.openafs.org/8083
773Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
774Tested-by: BuildBot <buildbot@rampaginggeek.com>
775Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
776(cherry picked from commit 4ab59d7ee924a6be1d553f75a67b0b253cc85e88)
777---
778 acinclude.m4                 |  1 +
779 src/afs/LINUX/osi_vnodeops.c |  8 +++++++-
780 src/cf/linux-test4.m4        | 14 ++++++++++++++
781 3 files changed, 22 insertions(+), 1 deletion(-)
782
783diff --git a/acinclude.m4 b/acinclude.m4
784index 1c84354..8bb5bf7 100644
785--- a/acinclude.m4
786+++ b/acinclude.m4
787@@ -963,6 +963,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
788                 LINUX_DENTRY_OPEN_TAKES_PATH
789                 LINUX_D_ALIAS_IS_HLIST
790                 LINUX_IOP_I_CREATE_TAKES_BOOL
791+                LINUX_DOP_D_REVALIDATE_TAKES_UNSIGNED
792 
793                 dnl If we are guaranteed that keyrings will work - that is
794                 dnl  a) The kernel has keyrings enabled
795diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
796index 8c8045b..49f8b96 100644
797--- a/src/afs/LINUX/osi_vnodeops.c
798+++ b/src/afs/LINUX/osi_vnodeops.c
799@@ -906,7 +906,9 @@ afs_linux_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *sta
800  * later on, we shouldn't have to do it until later. Perhaps in the future..
801  */
802 static int
803-#ifdef DOP_REVALIDATE_TAKES_NAMEIDATA
804+#if defined(DOP_REVALIDATE_TAKES_UNSIGNED)
805+afs_linux_dentry_revalidate(struct dentry *dp, unsigned int flags)
806+#elif defined(DOP_REVALIDATE_TAKES_NAMEIDATA)
807 afs_linux_dentry_revalidate(struct dentry *dp, struct nameidata *nd)
808 #else
809 afs_linux_dentry_revalidate(struct dentry *dp, int flags)
810@@ -921,7 +923,11 @@ afs_linux_dentry_revalidate(struct dentry *dp, int flags)
811 
812 #ifdef LOOKUP_RCU
813     /* We don't support RCU path walking */
814+# if defined(DOP_REVALIDATE_TAKES_UNSIGNED)
815+    if (flags & LOOKUP_RCU)
816+# else
817     if (nd->flags & LOOKUP_RCU)
818+# endif
819        return -ECHILD;
820 #endif
821     AFS_GLOCK();
822diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4
823index dc30770..4a6ec02 100644
824--- a/src/cf/linux-test4.m4
825+++ b/src/cf/linux-test4.m4
826@@ -727,3 +727,17 @@ AC_DEFUN([LINUX_IOP_I_CREATE_TAKES_BOOL], [
827                       [define if your iops.create takes a bool argument],
828                       [-Werror])
829 ])
830+
831+
832+AC_DEFUN([LINUX_DOP_D_REVALIDATE_TAKES_UNSIGNED], [
833+  AC_CHECK_LINUX_BUILD([whether dentry_operations.d_revalidate takes an unsigned int],
834+                       [ac_cv_linux_func_d_revalidate_takes_unsigned],
835+                       [#include <linux/fs.h>
836+                       #include <linux/namei.h>],
837+                       [struct dentry_operations dops;
838+                       int reval(struct dentry *d, unsigned int i) { return 0; };
839+                       dops.d_revalidate = reval;],
840+                      [DOP_REVALIDATE_TAKES_UNSIGNED],
841+                      [define if your dops.d_revalidate takes an unsigned int argument],
842+                      [-Werror])
843+])
844--
8451.8.0
846
847
848From 208d7925bd59490712bfd6bedc41ba5e3a8f4a6c Mon Sep 17 00:00:00 2001
849From: Marc Dionne <marc.c.dionne@gmail.com>
850Date: Tue, 14 Aug 2012 18:26:24 -0400
851Subject: [PATCH 11/12] Linux 3.6: lookup inode operation API change
852
853The nameidata argument is replaced with an unsigned int flags
854argument.
855
856Reviewed-on: http://gerrit.openafs.org/7987
857Tested-by: BuildBot <buildbot@rampaginggeek.com>
858Reviewed-by: Derrick Brashear <shadow@dementix.org>
859(cherry picked from commit ec48dca871ef98adb69792a34047c6be5818f1b2)
860
861Change-Id: Ic8be26141ede6e1c4062872c79a846efb0045bda
862Reviewed-on: http://gerrit.openafs.org/8084
863Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
864Tested-by: BuildBot <buildbot@rampaginggeek.com>
865Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
866(cherry picked from commit 6c22f2e1de91fa3080221df22fdcd05064b57307)
867---
868 acinclude.m4                 |  1 +
869 src/afs/LINUX/osi_vnodeops.c |  5 ++++-
870 src/cf/linux-test4.m4        | 14 ++++++++++++++
871 3 files changed, 19 insertions(+), 1 deletion(-)
872
873diff --git a/acinclude.m4 b/acinclude.m4
874index 8bb5bf7..4b49449 100644
875--- a/acinclude.m4
876+++ b/acinclude.m4
877@@ -964,6 +964,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
878                 LINUX_D_ALIAS_IS_HLIST
879                 LINUX_IOP_I_CREATE_TAKES_BOOL
880                 LINUX_DOP_D_REVALIDATE_TAKES_UNSIGNED
881+                LINUX_IOP_LOOKUP_TAKES_UNSIGNED
882 
883                 dnl If we are guaranteed that keyrings will work - that is
884                 dnl  a) The kernel has keyrings enabled
885diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
886index 49f8b96..c376bd1 100644
887--- a/src/afs/LINUX/osi_vnodeops.c
888+++ b/src/afs/LINUX/osi_vnodeops.c
889@@ -1147,7 +1147,10 @@ afs_linux_create(struct inode *dip, struct dentry *dp, int mode)
890 
891 /* afs_linux_lookup */
892 static struct dentry *
893-#ifdef IOP_LOOKUP_TAKES_NAMEIDATA
894+#if defined(IOP_LOOKUP_TAKES_UNSIGNED)
895+afs_linux_lookup(struct inode *dip, struct dentry *dp,
896+                unsigned flags)
897+#elif defined(IOP_LOOKUP_TAKES_NAMEIDATA)
898 afs_linux_lookup(struct inode *dip, struct dentry *dp,
899                 struct nameidata *nd)
900 #else
901diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4
902index 4a6ec02..fc0149f 100644
903--- a/src/cf/linux-test4.m4
904+++ b/src/cf/linux-test4.m4
905@@ -741,3 +741,17 @@ AC_DEFUN([LINUX_DOP_D_REVALIDATE_TAKES_UNSIGNED], [
906                       [define if your dops.d_revalidate takes an unsigned int argument],
907                       [-Werror])
908 ])
909+
910+
911+AC_DEFUN([LINUX_IOP_LOOKUP_TAKES_UNSIGNED], [
912+  AC_CHECK_LINUX_BUILD([whether inode operation lookup takes an unsigned int],
913+                       [ac_cv_linux_func_lookup_takes_unsigned],
914+                       [#include <linux/fs.h>
915+                       #include <linux/namei.h>],
916+                       [struct inode_operations iops;
917+                       struct dentry *look(struct inode *i, struct dentry *d, unsigned int j) { return NULL; };
918+                       iops.lookup = look;],
919+                      [IOP_LOOKUP_TAKES_UNSIGNED],
920+                      [define if your iops.lookup takes an unsigned int argument],
921+                      [-Werror])
922+])
923--
9241.8.0
925
926
927From 6c53a1dea7d8fe3174405febf2bf7b98a219824d Mon Sep 17 00:00:00 2001
928From: Marc Dionne <marc.c.dionne@gmail.com>
929Date: Fri, 12 Oct 2012 16:25:43 -0400
930Subject: [PATCH 12/12] Linux: osi_vcache: Fix loop for the hlist case
931
932An hlist is not circular, and the end is marked by a NULL next
933pointer.
934
935Reviewed-on: http://gerrit.openafs.org/8233
936Tested-by: BuildBot <buildbot@rampaginggeek.com>
937Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
938(cherry picked from commit 78ae01fb9837d79e7bbdb2918872ab106d4c7e98)
939
940Change-Id: I7e4e3ed2515dd8c2ec765d8acbb97eba189d6aeb
941Reviewed-on: http://gerrit.openafs.org/8239
942Tested-by: BuildBot <buildbot@rampaginggeek.com>
943Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
944(cherry picked from commit 0506af9c058e22e3475f7e152c022571c0823253)
945---
946 src/afs/LINUX/osi_vcache.c | 8 +++++---
947 1 file changed, 5 insertions(+), 3 deletions(-)
948
949diff --git a/src/afs/LINUX/osi_vcache.c b/src/afs/LINUX/osi_vcache.c
950index cd61c65..dc3685b 100644
951--- a/src/afs/LINUX/osi_vcache.c
952+++ b/src/afs/LINUX/osi_vcache.c
953@@ -20,9 +20,9 @@ osi_TryEvictVCache(struct vcache *avc, int *slept, int defersleep) {
954     struct dentry *dentry;
955     struct inode *inode = AFSTOV(avc);
956 #if defined(D_ALIAS_IS_HLIST)
957-    struct hlist_node *cur, *head;
958+    struct hlist_node *cur, *head, *list_end;
959 #else
960-    struct list_head *cur, *head;
961+    struct list_head *cur, *head, *list_end;
962 #endif
963 
964     /* First, see if we can evict the inode from the dcache */
965@@ -59,13 +59,15 @@ restart:
966        spin_lock(&inode->i_lock);
967 #if defined(D_ALIAS_IS_HLIST)
968        head = inode->i_dentry.first;
969+       list_end = NULL;
970 #else
971        head = &inode->i_dentry;
972+       list_end = head;
973 #endif
974 
975 restart:
976        cur = head;
977-       while ((cur = cur->next) != head) {
978+       while ((cur = cur->next) != list_end) {
979 #if defined(D_ALIAS_IS_HLIST)
980            dentry = hlist_entry(cur, struct dentry, d_alias);
981 #else
982--
9831.8.0
984
Note: See TracBrowser for help on using the repository browser.