#endif
#if defined(AFS_LINUX24_ENV)
+/* LOOKUP_POSITIVE is becoming the default */
+#ifndef LOOKUP_POSITIVE
+#define LOOKUP_POSITIVE 0
+#endif
/* Lookup name and return vnode for same. */
int
-osi_lookupname(char *aname, uio_seg_t seg, int followlink,
- vnode_t ** dirvpp, struct dentry **dpp)
+osi_lookupname_internal(char *aname, int followlink, struct vfsmount **mnt,
+ struct dentry **dpp)
{
int code;
- extern struct nameidata afs_cacheNd;
- struct nameidata *nd = &afs_cacheNd;
-
+ struct nameidata nd;
+ int flags = LOOKUP_POSITIVE;
code = ENOENT;
- if (seg == AFS_UIOUSER) {
- code =
- followlink ? user_path_walk(aname,
- nd) : user_path_walk_link(aname, nd);
- } else {
+
+ if (followlink)
+ flags |= LOOKUP_FOLLOW;
#if defined(AFS_LINUX26_ENV)
- code = path_lookup(aname, followlink ? LOOKUP_FOLLOW : 0, nd);
+ code = path_lookup(aname, flags, &nd);
#else
- if (path_init(aname, followlink ? LOOKUP_FOLLOW : 0, nd))
- code = path_walk(aname, nd);
+ if (path_init(aname, flags, &nd))
+ code = path_walk(aname, &nd);
#endif
- }
if (!code) {
- if (nd->dentry->d_inode) {
- *dpp = dget(nd->dentry);
- code = 0;
- } else {
- code = ENOENT;
- path_release(nd);
- }
+ *dpp = dget(nd.dentry);
+ if (mnt)
+ *mnt = mntget(nd.mnt);
+ path_release(&nd);
}
return code;
}
-#else
int
osi_lookupname(char *aname, uio_seg_t seg, int followlink, vnode_t ** dirvpp,
- struct dentry **dpp)
+ struct dentry **dpp)
+{
+ int code;
+ char *tname;
+ code = ENOENT;
+ if (seg == AFS_UIOUSER) {
+ tname = getname(aname);
+ if (IS_ERR(tname))
+ return PTR_ERR(tname);
+ } else {
+ tname = aname;
+ }
+ code = osi_lookupname_internal(tname, followlink, NULL, dpp);
+ if (seg == AFS_UIOUSER) {
+ putname(tname);
+ }
+ return code;
+}
+#else
+int
+osi_lookupname(char *aname, uio_seg_t seg, int followlink, vnode_t ** dirvpp, struct dentry **dpp)
{
struct dentry *dp = NULL;
int code;
osi_InitCacheInfo(char *aname)
{
int code;
- struct dentry *dp;
+ struct dentry *dp,*dpp;
extern ino_t cacheInode;
extern struct osi_dev cacheDev;
extern afs_int32 afs_fsfragsize;
extern struct super_block *afs_cacheSBp;
- code = osi_lookupname(aname, AFS_UIOSYS, 1, NULL, &dp);
+ extern struct vfsmnt *afs_cacheMnt;
+ code = osi_lookupname_internal(aname, 1, &afs_cacheMnt, &dp);
if (code)
return ENOENT;