From: Marc Dionne Date: Tue, 14 Aug 2012 01:36:15 +0000 (-0400) Subject: Linux 3.6: dentry_open API change X-Git-Tag: upstream/1.8.0_pre1^2~2083 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=8766a65e97eb90cb6c97ccd35181c441ece14f8a;p=packages%2Fo%2Fopenafs.git 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. Change-Id: Ia29422d60d438cf4c795840566d4610649aa1f10 Reviewed-on: http://gerrit.openafs.org/7982 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/acinclude.m4 b/acinclude.m4 index 45026da6c..260c75416 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -976,6 +976,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 52c4d2d3d..a4b83a176 100644 --- a/src/afs/LINUX/osi_compat.h +++ b/src/afs/LINUX/osi_compat.h @@ -498,4 +498,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 2e57fbb3a..eacffca07 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 fefa40e6c..6c1ae52bc 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -677,3 +677,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]) +])