Linux 3.19: struct nameidata becomes opaque

With kernel 3.19 struct nameidata becomes opaque.  As a result
we cannot rely on STRUCT_NAMEIDATA_HAS_PATH being true for
new kernels.

Rework the conditions here so that STRUCT_NAMEIDATA_HAS_PATH
is only tested when we're using a nameidata structure and
the result matters.

Also modify a configure test to use a nameidata pointer
instead of an actual structure.

Change-Id: I0d71fca44a67570ac3b86151c70f2969dc463f4f
Reviewed-on: http://gerrit.openafs.org/11648
Reviewed-by: Daria Brashear <shadow@your-file-system.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
This commit is contained in:
Marc Dionne 2015-01-05 07:17:14 -05:00 committed by Jeffrey Altman
parent ec9a7c2db8
commit 72e22eb00f
2 changed files with 10 additions and 10 deletions

View File

@ -493,23 +493,23 @@ afs_get_dentry_ref(struct nameidata *nd, struct vfsmount **mnt, struct dentry **
#else #else
afs_get_dentry_ref(afs_linux_path_t *path, struct vfsmount **mnt, struct dentry **dpp) { afs_get_dentry_ref(afs_linux_path_t *path, struct vfsmount **mnt, struct dentry **dpp) {
#endif #endif
#if defined(STRUCT_NAMEIDATA_HAS_PATH) #if defined(HAVE_LINUX_PATH_LOOKUP)
# if defined(HAVE_LINUX_PATH_LOOKUP) # if defined(STRUCT_NAMEIDATA_HAS_PATH)
*dpp = dget(nd->path.dentry); *dpp = dget(nd->path.dentry);
if (mnt) if (mnt)
*mnt = mntget(nd->path.mnt); *mnt = mntget(nd->path.mnt);
path_put(&nd->path); path_put(&nd->path);
# else # else
*dpp = dget(path->dentry);
if (mnt)
*mnt = mntget(path->mnt);
path_put(path);
# endif
#else
*dpp = dget(nd->dentry); *dpp = dget(nd->dentry);
if (mnt) if (mnt)
*mnt = mntget(nd->mnt); *mnt = mntget(nd->mnt);
path_release(nd); path_release(nd);
# endif
#else
*dpp = dget(path->dentry);
if (mnt)
*mnt = mntget(path->mnt);
path_put(path);
#endif #endif
} }

View File

@ -278,9 +278,9 @@ AC_DEFUN([LINUX_IOP_I_PUT_LINK_TAKES_COOKIE], [
#include <linux/namei.h>], #include <linux/namei.h>],
[struct inode _inode; [struct inode _inode;
struct dentry _dentry; struct dentry _dentry;
struct nameidata _nameidata; struct nameidata *_nameidata;
void *cookie; void *cookie;
(void)_inode.i_op->put_link(&_dentry, &_nameidata, cookie);], (void)_inode.i_op->put_link(&_dentry, _nameidata, cookie);],
[IOP_PUT_LINK_TAKES_COOKIE], [IOP_PUT_LINK_TAKES_COOKIE],
[define if your iops.put_link takes a cookie], [define if your iops.put_link takes a cookie],
[]) [])