From ca94c83c4a7b9c4482635cf49253b56255c95bf7 Mon Sep 17 00:00:00 2001 From: Marc Dionne 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 Tested-by: BuildBot (cherry picked from commit eca04c7e52d1e777cde423cdf673d7bf579c342b) Change-Id: I967c80fac754fbee1836b84dfb50dd5fdcba35f0 Reviewed-on: http://gerrit.openafs.org/8338 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- 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 4ea8c6a6b..c6d900246 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 49da7f1a8..6ae6c1b8c 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 }; -- 2.39.5