From e85cb87ce15c7254133101e9a023be1c167e4b07 Mon Sep 17 00:00:00 2001
From: Marc Dionne <marc.c.dionne@gmail.com>
Date: Mon, 15 Oct 2012 12:26:09 -0400
Subject: [PATCH] Linux 3.7: putname is no longer exported

putname is unexported in kernel 3.7.  Add a compatibility inline
afs_putname function and open code it if necessary.

Reviewed-on: http://gerrit.openafs.org/8237
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
(cherry picked from commit fa3116567e2998af73eb116751032713850c9459)

Change-Id: Icf0e249f87bfe80a262e5599ab9958355ed9a90f
---
 acinclude.m4               |    4 ++++
 src/afs/LINUX/osi_compat.h |    9 +++++++++
 src/afs/LINUX/osi_misc.c   |    4 ++--
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/acinclude.m4 b/acinclude.m4
index b61f55c..dec509e 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -891,6 +891,10 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
 				     [#include <linux/fs.h>
 				      #include <linux/namei.h>],
 				     [path_lookup(NULL, 0, NULL);])
+		 AC_CHECK_LINUX_FUNC([putname],
+				     [#include <linux/fs.h>
+				      #include <linux/namei.h>],
+				     [putname(NULL);])
 		 AC_CHECK_LINUX_FUNC([rcu_read_lock],
 				     [#include <linux/rcupdate.h>],
 				     [rcu_read_lock();])
diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
index 84fcaa5..8c0b805 100644
--- a/src/afs/LINUX/osi_compat.h
+++ b/src/afs/LINUX/osi_compat.h
@@ -461,4 +461,13 @@ afs_dentry_open(struct dentry *dp, struct vfsmount *mnt, int flags, const struct
 }
 #endif
 
+static inline void
+afs_putname(struct filename *name) {
+#if defined(HAVE_LINUX_PUTNAME)
+    putname(name);
+#else
+    kmem_cache_free(names_cachep, (void *)name);
+#endif
+}
+
 #endif /* AFS_LINUX_OSI_COMPAT_H */
diff --git a/src/afs/LINUX/osi_misc.c b/src/afs/LINUX/osi_misc.c
index fb740db..49da7f1 100644
--- a/src/afs/LINUX/osi_misc.c
+++ b/src/afs/LINUX/osi_misc.c
@@ -93,7 +93,7 @@ osi_lookupname(char *aname, uio_seg_t seg, int followlink,
     }
     code = osi_lookupname_internal(tname, followlink, NULL, dpp);   
     if (seg == AFS_UIOUSER) {
-        putname(tname);
+        afs_putname(tname);
     }
     return code;
 }
@@ -129,7 +129,7 @@ int osi_abspath(char *aname, char *buf, int buflen,
 	mntput(mnt);
     }
 
-    putname(tname);
+    afs_putname(tname);
     return code;
 }
 
-- 
1.7.2.5

From 3ebae2a235bdee6a06c91da7c7d1147719fab264 Mon Sep 17 00:00:00 2001
From: Marc Dionne <marc.c.dionne@gmail.com>
Date: Fri, 19 Oct 2012 18:31:53 +0100
Subject: [PATCH] Linux: fix afs_putname wrapper for pre-3.7 kernels

Make the compatibility function use the right type for pre-3.7
kernels.

Reviewed-on: http://gerrit.openafs.org/8276
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
(cherry picked from commit 115850076c09625e37d75da6dc29a68b0a2d638e)

Change-Id: I820340058a6cdecbd438fdc13ed3d54a439340e0
---
 src/afs/LINUX/osi_compat.h |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
index 8c0b805..4ea8c6a 100644
--- a/src/afs/LINUX/osi_compat.h
+++ b/src/afs/LINUX/osi_compat.h
@@ -462,10 +462,11 @@ afs_dentry_open(struct dentry *dp, struct vfsmount *mnt, int flags, const struct
 #endif
 
 static inline void
-afs_putname(struct filename *name) {
 #if defined(HAVE_LINUX_PUTNAME)
+afs_putname(char *name) {
     putname(name);
 #else
+afs_putname(struct filename *name) {
     kmem_cache_free(names_cachep, (void *)name);
 #endif
 }
-- 
1.7.2.5

From 06cad25d90ac7ff7f2b396074f2366bdf0bac3d7 Mon Sep 17 00:00:00 2001
From: Marc Dionne <marc.c.dionne@gmail.com>
Date: Sat, 20 Oct 2012 17:59:01 +0100
Subject: [PATCH] Linux: Rework handling of names in the lookup functions

Rework the name lookup functions in the kernel to deal more cleanly
with the change of API for kernel 3.7

Reviewed-on: http://gerrit.openafs.org/8278
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
(cherry picked from commit eca04c7e52d1e777cde423cdf673d7bf579c342b)

Change-Id: I967c80fac754fbee1836b84dfb50dd5fdcba35f0
---
 src/afs/LINUX/osi_compat.h |   36 +++++++++++++++++++++++++++++++-----
 src/afs/LINUX/osi_misc.c   |   26 +++++++++++++++-----------
 2 files changed, 46 insertions(+), 16 deletions(-)

diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
index 4ea8c6a..c6d9002 100644
--- a/src/afs/LINUX/osi_compat.h
+++ b/src/afs/LINUX/osi_compat.h
@@ -461,14 +461,40 @@ afs_dentry_open(struct dentry *dp, struct vfsmount *mnt, int flags, const struct
 }
 #endif
 
-static inline void
 #if defined(HAVE_LINUX_PUTNAME)
-afs_putname(char *name) {
-    putname(name);
+typedef char *afs_name_t;
+
+static inline char *
+afs_name_to_string(afs_name_t s) {
+    return (char *)s;
+}
+
+static inline void
+afs_putname(afs_name_t name) {
+    putname((char *)name);
+}
+
+static inline void
+afs_set_name(afs_name_t name, char *string) {
+    name = string;
+}
 #else
-afs_putname(struct filename *name) {
+typedef struct filename *afs_name_t;
+
+static inline char *
+afs_name_to_string(afs_name_t s) {
+    return (char *)s->name;
+}
+
+static inline void
+afs_putname(afs_name_t name) {
     kmem_cache_free(names_cachep, (void *)name);
-#endif
 }
 
+static inline void
+afs_set_name(afs_name_t aname, char *string) {
+    aname->name = string;
+}
+#endif
+
 #endif /* AFS_LINUX_OSI_COMPAT_H */
diff --git a/src/afs/LINUX/osi_misc.c b/src/afs/LINUX/osi_misc.c
index 49da7f1..6ae6c1b 100644
--- a/src/afs/LINUX/osi_misc.c
+++ b/src/afs/LINUX/osi_misc.c
@@ -78,22 +78,25 @@ osi_lookupname_internal(char *aname, int followlink, struct vfsmount **mnt,
 }
 
 int
-osi_lookupname(char *aname, uio_seg_t seg, int followlink, 
+osi_lookupname(char *aname, uio_seg_t seg, int followlink,
 	       struct dentry **dpp)
 {
     int code;
-    char *tname;
+    afs_name_t tname = NULL;
+    char *name;
+
     code = ENOENT;
     if (seg == AFS_UIOUSER) {
-        tname = getname(aname);
-        if (IS_ERR(tname)) 
-            return PTR_ERR(tname);
+	tname = getname(aname);
+	if (IS_ERR(tname))
+	    return PTR_ERR(tname);
+	name = afs_name_to_string(tname);
     } else {
-        tname = aname;
+	name = aname;
     }
-    code = osi_lookupname_internal(tname, followlink, NULL, dpp);   
+    code = osi_lookupname_internal(name, followlink, NULL, dpp);
     if (seg == AFS_UIOUSER) {
-        afs_putname(tname);
+	afs_putname(tname);
     }
     return code;
 }
@@ -103,14 +106,15 @@ int osi_abspath(char *aname, char *buf, int buflen,
 {
     struct dentry *dp = NULL;
     struct vfsmount *mnt = NULL;
-    char *tname, *path;
+    afs_name_t tname;
+    char *path;
     int code;
 
     code = ENOENT;
     tname = getname(aname);
-    if (IS_ERR(tname)) 
+    if (IS_ERR(tname))
 	return -PTR_ERR(tname);
-    code = osi_lookupname_internal(tname, followlink, &mnt, &dp);   
+    code = osi_lookupname_internal(afs_name_to_string(tname), followlink, &mnt, &dp);
     if (!code) {
 #if defined(D_PATH_TAKES_STRUCT_PATH)
 	struct path p = { mnt, dp };
-- 
1.7.2.5

