- arch/um/kernel/mem.c | 18 ++++++
- fs/dcache.c | 12 +++-
- fs/namei.c | 132 ++++++++++++++++++++++++++++++++++++++-----------
+ arch/um/kernel/mem.c | 18 ++++-
+ fs/dcache.c | 12 ++-
+ fs/namei.c | 168 +++++++++++++++++++++++++++++++++++++++----------
fs/namespace.c | 1
fs/nfsd/vfs.c | 2
- fs/open.c | 39 ++++++++++++--
- fs/stat.c | 2
+ fs/open.c | 39 +++++++++--
+ fs/stat.c | 10 ++
fs/sysfs/inode.c | 2
- include/linux/dcache.h | 28 ++++++++++
- include/linux/fs.h | 20 +++++++
- include/linux/namei.h | 3 -
+ include/linux/dcache.h | 28 ++++++++
+ include/linux/fs.h | 20 +++++
+ include/linux/namei.h | 3
include/linux/slab.h | 1
kernel/ksyms.c | 7 ++
mm/slab.c | 5 +
net/unix/af_unix.c | 2
- 15 files changed, 231 insertions(+), 43 deletions(-)
+ 15 files changed, 269 insertions(+), 49 deletions(-)
---- linux-2.5.63-nointent/arch/um/kernel/mem.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/arch/um/kernel/mem.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/arch/um/kernel/mem.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/arch/um/kernel/mem.c Mon Mar 31 22:26:55 2003
@@ -660,6 +660,22 @@ struct page *pte_mem_map(pte_t pte)
return(phys_mem_map(pte_val(pte)));
}
return(0);
}
---- linux-2.5.63-nointent/fs/namei.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/namei.c Mon Mar 24 17:08:18 2003
-@@ -101,6 +101,14 @@
+--- linux-2.5.63/fs/namei.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/fs/namei.c Mon Mar 31 22:29:22 2003
+@@ -101,6 +101,12 @@
* any extra contention...
*/
-+void intent_release(struct dentry *de, struct lookup_intent *it)
++void intent_release(struct dentry * de, struct lookup_intent *it)
+{
-+ if (it && de->d_op && de->d_op->d_intent_release)
-+ de->d_op->d_intent_release(de, it);
-+
++ if (it && de->d_op && de->d_op->d_intent_release)
++ de->d_op->d_intent_release(de, it);
+}
+
-+
/* In order to reduce some races, while at the same time doing additional
* checking and hopefully speeding things up, we copy filenames to the
* kernel data space before using them..
-@@ -273,10 +281,18 @@ void path_release(struct nameidata *nd)
+@@ -273,10 +279,18 @@ void path_release(struct nameidata *nd)
* Internal lookup() using the new generic dcache.
* SMP-safe
*/
if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
dput(dentry);
-@@ -330,7 +346,7 @@ ok:
+@@ -330,7 +344,7 @@ ok:
* make sure that nobody added the entry to the dcache in the meantime..
* SMP-safe
*/
{
struct dentry * result;
struct inode *dir = parent->d_inode;
-@@ -348,7 +364,10 @@ static struct dentry * real_lookup(struc
+@@ -348,7 +362,10 @@ static struct dentry * real_lookup(struc
struct dentry * dentry = d_alloc(parent, name);
result = ERR_PTR(-ENOMEM);
if (dentry) {
if (result)
dput(dentry);
else {
-@@ -370,6 +389,12 @@ static struct dentry * real_lookup(struc
+@@ -370,6 +387,12 @@ static struct dentry * real_lookup(struc
dput(result);
result = ERR_PTR(-ENOENT);
}
}
return result;
}
-@@ -402,6 +427,7 @@ static inline int do_follow_link(struct
+@@ -398,10 +421,14 @@ static inline int do_follow_link(struct
+ current->link_count++;
+ current->total_link_count++;
+ UPDATE_ATIME(dentry->d_inode);
+- err = dentry->d_inode->i_op->follow_link(dentry, nd);
++ if (dentry->d_inode->i_op->follow_link2)
++ err = dentry->d_inode->i_op->follow_link2(dentry, nd, &nd->it);
++ else
++ err = dentry->d_inode->i_op->follow_link(dentry, nd);
current->link_count--;
return err;
loop:
path_release(nd);
return err;
}
-@@ -447,15 +473,26 @@ static int follow_mount(struct vfsmount
+@@ -447,15 +474,26 @@ static int follow_mount(struct vfsmount
return res;
}
dput(*dentry);
mntput(mounted->mnt_parent);
*dentry = dget(mounted->mnt_root);
-@@ -467,7 +504,7 @@ static inline int __follow_down(struct v
+@@ -467,7 +505,7 @@ static inline int __follow_down(struct v
int follow_down(struct vfsmount **mnt, struct dentry **dentry)
{
}
static inline void follow_dotdot(struct vfsmount **mnt, struct dentry **dentry)
-@@ -531,7 +568,7 @@ done:
+@@ -531,7 +569,7 @@ done:
return 0;
need_lookup:
if (IS_ERR(dentry))
goto fail;
goto done;
-@@ -665,7 +702,7 @@ int link_path_walk(const char * name, st
+@@ -645,7 +683,7 @@ int link_path_walk(const char * name, st
+ if (!inode->i_op)
+ goto out_dput;
+
+- if (inode->i_op->follow_link) {
++ if (inode->i_op->follow_link || inode->i_op->follow_link2) {
+ mntget(next.mnt);
+ err = do_follow_link(next.dentry, nd);
+ dput(next.dentry);
+@@ -665,7 +703,7 @@ int link_path_walk(const char * name, st
nd->dentry = next.dentry;
}
err = -ENOTDIR;
break;
continue;
/* here ends the main loop */
-@@ -716,7 +753,8 @@ last_component:
+@@ -698,7 +736,8 @@ last_component:
+ follow_mount(&next.mnt, &next.dentry);
+ inode = next.dentry->d_inode;
+ if ((lookup_flags & LOOKUP_FOLLOW)
+- && inode && inode->i_op && inode->i_op->follow_link) {
++ && inode && inode->i_op &&
++ (inode->i_op->follow_link || inode->i_op->follow_link2)) {
+ mntget(next.mnt);
+ err = do_follow_link(next.dentry, nd);
+ dput(next.dentry);
+@@ -716,7 +755,8 @@ last_component:
break;
if (lookup_flags & LOOKUP_DIRECTORY) {
err = -ENOTDIR;
break;
}
goto return_base;
-@@ -735,6 +773,7 @@ out_dput:
+@@ -735,6 +775,8 @@ out_dput:
dput(next.dentry);
break;
}
-+ intent_release(nd->dentry, &nd->it);
++ if(err)
++ intent_release(nd->dentry, &nd->it);
path_release(nd);
return_err:
return err;
-@@ -857,7 +896,8 @@ int path_lookup(const char *name, unsign
+@@ -857,7 +899,8 @@ int path_lookup(const char *name, unsign
* needs parent already locked. Doesn't follow mounts.
* SMP-safe.
*/
{
struct dentry * dentry;
struct inode *inode;
-@@ -880,13 +920,16 @@ struct dentry * lookup_hash(struct qstr
+@@ -880,13 +923,16 @@ struct dentry * lookup_hash(struct qstr
goto out;
}
if (!dentry) {
dentry = new;
security_inode_post_lookup(inode, dentry);
-@@ -898,7 +941,7 @@ out:
+@@ -898,7 +944,7 @@ out:
}
/* SMP-safe */
{
unsigned long hash;
struct qstr this;
-@@ -918,11 +961,16 @@ struct dentry * lookup_one_len(const cha
+@@ -918,11 +964,16 @@ struct dentry * lookup_one_len(const cha
}
this.hash = end_name_hash(hash);
/*
* namei()
*
-@@ -1224,6 +1272,9 @@ int open_namei(const char * pathname, in
+@@ -1224,6 +1275,9 @@ int open_namei(const char * pathname, in
/*
* Create - we need to know the parent.
*/
error = path_lookup(pathname, LOOKUP_PARENT, nd);
if (error)
return error;
-@@ -1239,7 +1290,7 @@ int open_namei(const char * pathname, in
+@@ -1239,7 +1293,7 @@ int open_namei(const char * pathname, in
dir = nd->dentry;
down(&dir->d_inode->i_sem);
do_last:
error = PTR_ERR(dentry);
-@@ -1247,7 +1298,8 @@ do_last:
+@@ -1247,7 +1301,8 @@ do_last:
up(&dir->d_inode->i_sem);
goto exit;
}
/* Negative dentry, just create the file */
if (!dentry->d_inode) {
if (!IS_POSIXACL(dir->d_inode))
-@@ -1277,7 +1329,7 @@ do_last:
+@@ -1277,12 +1332,14 @@ do_last:
error = -ELOOP;
if (flag & O_NOFOLLOW)
goto exit_dput;
}
error = -ENOENT;
if (!dentry->d_inode)
-@@ -1297,8 +1349,10 @@ ok:
+ goto exit_dput;
+- if (dentry->d_inode->i_op && dentry->d_inode->i_op->follow_link)
++ if (dentry->d_inode->i_op &&
++ (dentry->d_inode->i_op->follow_link ||
++ dentry->d_inode->i_op->follow_link2))
+ goto do_link;
+
+ dput(nd->dentry);
+@@ -1297,8 +1354,10 @@ ok:
return 0;
exit_dput:
path_release(nd);
return error;
-@@ -1320,7 +1374,12 @@ do_link:
+@@ -1320,7 +1379,12 @@ do_link:
if (error)
goto exit_dput;
UPDATE_ATIME(dentry->d_inode);
dput(dentry);
if (error)
return error;
-@@ -1342,7 +1401,7 @@ do_link:
+@@ -1342,7 +1406,7 @@ do_link:
}
dir = nd->dentry;
down(&dir->d_inode->i_sem);
putname(nd->last.name);
goto do_last;
}
-@@ -1356,7 +1415,7 @@ static struct dentry *lookup_create(stru
+@@ -1356,7 +1420,7 @@ static struct dentry *lookup_create(stru
dentry = ERR_PTR(-EEXIST);
if (nd->last_type != LAST_NORM)
goto fail;
if (IS_ERR(dentry))
goto fail;
if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1588,7 +1647,7 @@ asmlinkage long sys_rmdir(const char * p
+@@ -1478,6 +1542,17 @@ asmlinkage long sys_mkdir(const char * p
+ error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ if (error)
+ goto out;
++ if (nd.dentry->d_inode->i_op->mkdir2) {
++ struct inode_operations *op = nd.dentry->d_inode->i_op;
++ error = op->mkdir2(nd.dentry->d_inode,
++ nd.last.name,
++ nd.last.len,
++ mode);
++ /* the file system wants to use normal vfs path now */
++ if (error != -EOPNOTSUPP)
++ goto out2;
++ }
++
+ dentry = lookup_create(&nd, 1);
+ error = PTR_ERR(dentry);
+ if (!IS_ERR(dentry)) {
+@@ -1487,6 +1562,7 @@ asmlinkage long sys_mkdir(const char * p
+ dput(dentry);
+ }
+ up(&nd.dentry->d_inode->i_sem);
++out2:
+ path_release(&nd);
+ out:
+ putname(tmp);
+@@ -1588,7 +1664,7 @@ asmlinkage long sys_rmdir(const char * p
goto exit1;
}
down(&nd.dentry->d_inode->i_sem);
error = PTR_ERR(dentry);
if (!IS_ERR(dentry)) {
error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1654,8 +1713,18 @@ asmlinkage long sys_unlink(const char *
+@@ -1654,8 +1730,18 @@ asmlinkage long sys_unlink(const char *
error = -EISDIR;
if (nd.last_type != LAST_NORM)
goto exit1;
error = PTR_ERR(dentry);
if (!IS_ERR(dentry)) {
/* Why not before? Because we want correct error value */
-@@ -1859,7 +1928,8 @@ exit:
+@@ -1725,6 +1811,16 @@ asmlinkage long sys_symlink(const char *
+ error = path_lookup(to, LOOKUP_PARENT, &nd);
+ if (error)
+ goto out;
++ if (nd.dentry->d_inode->i_op->symlink2) {
++ struct inode_operations *op = nd.dentry->d_inode->i_op;
++ error = op->symlink2(nd.dentry->d_inode,
++ nd.last.name,
++ nd.last.len,
++ from);
++ /* the file system wants to use normal vfs path now */
++ if (error != -EOPNOTSUPP)
++ goto out2;
++ }
+ dentry = lookup_create(&nd, 0);
+ error = PTR_ERR(dentry);
+ if (!IS_ERR(dentry)) {
+@@ -1732,6 +1828,7 @@ asmlinkage long sys_symlink(const char *
+ dput(dentry);
+ }
+ up(&nd.dentry->d_inode->i_sem);
++out2:
+ path_release(&nd);
+ out:
+ putname(to);
+@@ -1859,7 +1956,8 @@ exit:
* locking].
*/
int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
{
int error = 0;
struct inode *target;
-@@ -1887,6 +1957,7 @@ int vfs_rename_dir(struct inode *old_dir
+@@ -1887,6 +1985,7 @@ int vfs_rename_dir(struct inode *old_dir
error = -EBUSY;
else
error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
if (target) {
if (!error)
target->i_flags |= S_DEAD;
-@@ -1904,7 +1975,8 @@ int vfs_rename_dir(struct inode *old_dir
+@@ -1904,7 +2003,8 @@ int vfs_rename_dir(struct inode *old_dir
}
int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
{
struct inode *target;
int error;
-@@ -1921,6 +1993,7 @@ int vfs_rename_other(struct inode *old_d
+@@ -1921,6 +2021,7 @@ int vfs_rename_other(struct inode *old_d
error = -EBUSY;
else
error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
if (!error) {
/* The following d_move() should become unconditional */
if (!(old_dir->i_sb->s_type->fs_flags & FS_ODD_RENAME))
-@@ -1934,7 +2007,8 @@ int vfs_rename_other(struct inode *old_d
+@@ -1934,7 +2035,8 @@ int vfs_rename_other(struct inode *old_d
}
int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
{
int error;
int is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
-@@ -1960,9 +2034,9 @@ int vfs_rename(struct inode *old_dir, st
+@@ -1960,9 +2062,9 @@ int vfs_rename(struct inode *old_dir, st
DQUOT_INIT(new_dir);
if (is_dir)
if (!error) {
if (old_dir == new_dir)
inode_dir_notify(old_dir, DN_RENAME);
-@@ -2005,7 +2079,7 @@ static inline int do_rename(const char *
+@@ -2005,7 +2107,7 @@ static inline int do_rename(const char *
trap = lock_rename(new_dir, old_dir);
error = PTR_ERR(old_dentry);
if (IS_ERR(old_dentry))
goto exit3;
-@@ -2025,7 +2099,7 @@ static inline int do_rename(const char *
+@@ -2025,7 +2127,7 @@ static inline int do_rename(const char *
error = -EINVAL;
if (old_dentry == trap)
goto exit4;
error = PTR_ERR(new_dentry);
if (IS_ERR(new_dentry))
goto exit4;
-@@ -2035,7 +2109,7 @@ static inline int do_rename(const char *
+@@ -2035,7 +2137,7 @@ static inline int do_rename(const char *
goto exit5;
error = vfs_rename(old_dir->d_inode, old_dentry,
exit5:
dput(new_dentry);
exit4:
---- linux-2.5.63-nointent/fs/nfsd/vfs.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/nfsd/vfs.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/fs/nfsd/vfs.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/fs/nfsd/vfs.c Mon Mar 31 22:26:55 2003
@@ -1337,7 +1337,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru
err = nfserr_perm;
} else
if (!err && EX_ISSYNC(tfhp->fh_export)) {
nfsd_sync_dir(tdentry);
nfsd_sync_dir(fdentry);
---- linux-2.5.63-nointent/fs/sysfs/inode.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/sysfs/inode.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/fs/sysfs/inode.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/fs/sysfs/inode.c Mon Mar 31 22:26:55 2003
@@ -540,7 +540,7 @@ static struct dentry * get_dentry(struct
qstr.name = name;
qstr.len = strlen(name);
}
---- linux-2.5.63-nointent/include/linux/dcache.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/dcache.h Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/include/linux/dcache.h~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/include/linux/dcache.h Mon Mar 31 22:26:55 2003
@@ -12,6 +12,27 @@
struct vfsmount;
extern spinlock_t dcache_lock;
extern rwlock_t dparent_lock;
---- linux-2.5.63-nointent/include/linux/fs.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/fs.h Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/include/linux/fs.h~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/include/linux/fs.h Mon Mar 31 22:26:55 2003
@@ -234,6 +234,9 @@ typedef int (get_blocks_t)(struct inode
#define ATTR_ATTR_FLAG 1024
#define ATTR_KILL_SUID 2048
extern long do_mount(char *, char *, char *, unsigned long, void *);
extern int vfs_statfs(struct super_block *, struct statfs *);
---- linux-2.5.63-nointent/include/linux/namei.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/namei.h Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/include/linux/namei.h~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/include/linux/namei.h Mon Mar 31 22:26:55 2003
@@ -11,6 +11,7 @@ struct nameidata {
struct qstr last;
unsigned int flags;
extern int follow_down(struct vfsmount **, struct dentry **);
extern int follow_up(struct vfsmount **, struct dentry **);
---- linux-2.5.63-nointent/include/linux/slab.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/include/linux/slab.h Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/include/linux/slab.h~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/include/linux/slab.h Mon Mar 31 22:26:55 2003
@@ -55,6 +55,7 @@ extern int kmem_cache_destroy(kmem_cache
extern int kmem_cache_shrink(kmem_cache_t *);
extern void *kmem_cache_alloc(kmem_cache_t *, int);
extern unsigned int kmem_cache_size(kmem_cache_t *);
extern void *kmalloc(size_t, int);
---- linux-2.5.63-nointent/kernel/ksyms.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/kernel/ksyms.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/kernel/ksyms.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/kernel/ksyms.c Mon Mar 31 22:26:55 2003
@@ -377,6 +377,7 @@ EXPORT_SYMBOL(unregister_filesystem);
EXPORT_SYMBOL(kern_mount);
EXPORT_SYMBOL(__mntput);
/* waitqueue handling */
EXPORT_SYMBOL(add_wait_queue);
EXPORT_SYMBOL(add_wait_queue_exclusive);
---- linux-2.5.63-nointent/mm/slab.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/mm/slab.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/mm/slab.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/mm/slab.c Mon Mar 31 22:26:55 2003
@@ -1792,6 +1792,11 @@ static inline void __cache_free (kmem_ca
}
}
/**
* kmem_cache_alloc - Allocate an object
* @cachep: The cache to allocate from.
---- linux-2.5.63-nointent/net/unix/af_unix.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/net/unix/af_unix.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/net/unix/af_unix.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/net/unix/af_unix.c Mon Mar 31 22:26:55 2003
@@ -720,7 +720,7 @@ static int unix_bind(struct socket *sock
/*
* Do the final lookup.
err = PTR_ERR(dentry);
if (IS_ERR(dentry))
goto out_mknod_unlock;
---- linux-2.5.63-nointent/fs/dcache.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/dcache.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/fs/dcache.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/fs/dcache.c Mon Mar 31 22:26:55 2003
@@ -1111,15 +1111,21 @@ void d_delete(struct dentry * dentry)
* Adds a dentry to the hash according to its name.
*/
}
#define do_switch(x,y) do { \
---- linux-2.5.63-nointent/fs/namespace.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003
-+++ linux-2.5.63-nointent-root/fs/namespace.c Tue Mar 18 15:02:10 2003
+--- linux-2.5.63/fs/namespace.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/fs/namespace.c Mon Mar 31 22:26:55 2003
@@ -925,6 +925,7 @@ void set_fs_pwd(struct fs_struct *fs, st
mntput(old_pwdmnt);
}
static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd)
{
---- linux-2.5.63-nointent/fs/open.c~lustre-2.5.63 Thu Mar 20 12:43:39 2003
-+++ linux-2.5.63-nointent-root/fs/open.c Mon Mar 24 16:25:47 2003
+--- linux-2.5.63/fs/open.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/fs/open.c Mon Mar 31 22:29:31 2003
@@ -97,7 +97,8 @@ static inline long do_sys_truncate(const
struct nameidata nd;
struct inode * inode;
return f;
cleanup_all:
---- linux-2.5.63-nointent/fs/stat.c~lustre-2.5.63 Fri Mar 21 21:15:40 2003
-+++ linux-2.5.63-nointent-root/fs/stat.c Fri Mar 21 21:16:53 2003
-@@ -65,6 +65,7 @@ int vfs_stat(char *name, struct kstat *s
+--- linux-2.5.63/fs/stat.c~lustre-2.5.63 Mon Mar 31 22:26:55 2003
++++ linux-2.5.63-root/fs/stat.c Mon Mar 31 22:29:44 2003
+@@ -60,10 +60,13 @@ int vfs_stat(char *name, struct kstat *s
+ {
+ struct nameidata nd;
+ int error;
+-
++ struct lookup_intent it = { .it_op = IT_GETATTR };
++ nd.it = it;
++
error = user_path_walk(name, &nd);
if (!error) {
error = vfs_getattr(nd.mnt, nd.dentry, stat);
path_release(&nd);
}
return error;
-@@ -80,6 +81,7 @@ int vfs_lstat(char *name, struct kstat *
+@@ -73,10 +76,13 @@ int vfs_lstat(char *name, struct kstat *
+ {
+ struct nameidata nd;
+ int error;
+-
++ struct lookup_intent it = { .it_op = IT_GETATTR };
++ nd.it = it;
++
error = user_path_walk_link(name, &nd);
if (!error) {
error = vfs_getattr(nd.mnt, nd.dentry, stat);