From 1bba9760b26bdb1ef1e17f9d1e15be9d565828cc Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Mon, 13 Aug 2012 21:36:15 -0400 Subject: [PATCH] Linux 3.6: dentry_open API change dentry_open now takes a path argument that combines the dentry and the vfsmount pointers. Add a configure test and a new compat inline function to keep things cleaner in the main source file. Reviewed-on: http://gerrit.openafs.org/7982 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit 8766a65e97eb90cb6c97ccd35181c441ece14f8a) Change-Id: I2c0f59ad9aa6e544a2a613e902933d463f22a5b6 Reviewed-on: http://gerrit.openafs.org/8079 Reviewed-by: Ken Dreyer Tested-by: BuildBot Reviewed-by: Derrick Brashear --- acinclude.m4 | 1 + src/afs/LINUX/osi_compat.h | 16 ++++++++++++++++ src/afs/LINUX/osi_file.c | 4 ++-- src/cf/linux-test4.m4 | 12 ++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index bf81d3ec2..1a1ba2ff2 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -961,6 +961,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_IOP_CREATE_TAKES_UMODE_T LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE + LINUX_DENTRY_OPEN_TAKES_PATH dnl If we are guaranteed that keyrings will work - that is dnl a) The kernel has keyrings enabled diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h index 4c7c261ef..84fcaa5d7 100644 --- a/src/afs/LINUX/osi_compat.h +++ b/src/afs/LINUX/osi_compat.h @@ -445,4 +445,20 @@ afs_get_dentry_ref(struct path *path, struct vfsmount **mnt, struct dentry **dpp #endif } +#if defined(STRUCT_TASK_STRUCT_HAS_CRED) +static inline struct file * +afs_dentry_open(struct dentry *dp, struct vfsmount *mnt, int flags, const struct cred *creds) { +#if defined(DENTRY_OPEN_TAKES_PATH) + struct path path; + struct file *filp; + path.mnt = mnt; + path.dentry = dp; + filp = dentry_open(&path, flags, creds); + return filp; +#else + return dentry_open(dp, mntget(mnt), flags, creds); +#endif +} +#endif + #endif /* AFS_LINUX_OSI_COMPAT_H */ diff --git a/src/afs/LINUX/osi_file.c b/src/afs/LINUX/osi_file.c index 0aba82bda..01cc42fcb 100644 --- a/src/afs/LINUX/osi_file.c +++ b/src/afs/LINUX/osi_file.c @@ -56,9 +56,9 @@ afs_linux_raw_open(afs_dcache_id_t *ainode) #if defined(STRUCT_TASK_STRUCT_HAS_CRED) /* Use stashed credentials - prevent selinux/apparmor problems */ - filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, cache_creds); + filp = afs_dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, cache_creds); if (IS_ERR(filp)) - filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, current_cred()); + filp = afs_dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, current_cred()); #else filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR); #endif diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 7db805fb4..427c5e1c8 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -687,3 +687,15 @@ AC_DEFUN([LINUX_KMAP_ATOMIC_TAKES_NO_KM_TYPE], [ [define if kmap_atomic takes no km_type argument], [-Werror]) ]) + + +AC_DEFUN([LINUX_DENTRY_OPEN_TAKES_PATH], [ + AC_CHECK_LINUX_BUILD([whether dentry_open takes a path argument], + [ac_cv_linux_dentry_open_takes_path], + [#include ], + [struct path p; + dentry_open(&p, 0, NULL);], + [DENTRY_OPEN_TAKES_PATH], + [define if dentry_open takes a path argument], + [-Werror]) +]) -- 2.39.5