Linux: Fix fallout from path_lookup commit

Fix a few issues with the recent commit to deal withg the removal
of path_lookup, spotted on RHEL 5:
- the configure tests needs fs.h to be included before namei.h, to
get the definition of struct inode
- we need to avoid the use of struct path unless its needed; on
older kernels the structure doesn't exist

Change-Id: I6251a96a371a50548dcafc70d94e91b52fc2922a
Reviewed-on: http://gerrit.openafs.org/4382
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
This commit is contained in:
Marc Dionne 2011-03-30 18:32:04 -04:00 committed by Derrick Brashear
parent 4af8c88ff2
commit f2e91cc3fe
3 changed files with 22 additions and 11 deletions

View File

@ -848,7 +848,8 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
[#include <linux/pagevec.h>],
[__pagevec_lru_add_file(NULL);])
AC_CHECK_LINUX_FUNC([path_lookup],
[#include <linux/namei.h>],
[#include <linux/fs.h>
#include <linux/namei.h>],
[path_lookup(NULL, 0, NULL);])
AC_CHECK_LINUX_FUNC([rcu_read_lock],
[#include <linux/rcupdate.h>],

View File

@ -403,17 +403,24 @@ afs_inode_setattr(struct osi_file *afile, struct iattr *newattrs) {
return code;
}
static inline int
afs_kern_path(char *aname, int flags, struct nameidata *nd, struct path *path) {
#if defined(HAVE_LINUX_PATH_LOOKUP)
static inline int
afs_kern_path(char *aname, int flags, struct nameidata *nd) {
return path_lookup(aname, flags, nd);
#else
return kern_path(aname, flags, path);
#endif
}
#else
static inline int
afs_kern_path(char *aname, int flags, struct path *path) {
return kern_path(aname, flags, path);
}
#endif
static inline void
afs_get_dentry_ref(struct nameidata *nd, struct path *path, struct vfsmount **mnt, struct dentry **dpp) {
#if defined(HAVE_LINUX_PATH_LOOKUP)
afs_get_dentry_ref(struct nameidata *nd, struct vfsmount **mnt, struct dentry **dpp) {
#else
afs_get_dentry_ref(struct path *path, struct vfsmount **mnt, struct dentry **dpp) {
#endif
#if defined(STRUCT_NAMEIDATA_HAS_PATH)
# if defined(HAVE_LINUX_PATH_LOOKUP)
*dpp = dget(nd->path.dentry);

View File

@ -59,17 +59,20 @@ osi_lookupname_internal(char *aname, int followlink, struct vfsmount **mnt,
struct dentry **dpp)
{
int code;
struct nameidata nd;
struct path path;
#if defined(HAVE_LINUX_PATH_LOOKUP)
struct nameidata path_data;
#else
struct path path_data;
#endif
int flags = LOOKUP_POSITIVE;
code = ENOENT;
if (followlink)
flags |= LOOKUP_FOLLOW;
code = afs_kern_path(aname, flags, &nd, &path);
code = afs_kern_path(aname, flags, &path_data);
if (!code)
afs_get_dentry_ref(&nd, &path, mnt, dpp);
afs_get_dentry_ref(&path_data, mnt, dpp);
return code;
}