1 Index: linus-2.6.7/fs/namei.c
2 ===================================================================
3 --- linus-2.6.7.orig/fs/namei.c 2005-03-05 20:24:52.000000000 +0200
4 +++ linus-2.6.7/fs/namei.c 2005-03-28 17:11:20.486991680 +0300
8 if (inode->i_op->follow_link) {
9 + int saved_flags = nd->flags;
11 + nd->flags |= LOOKUP_LINK_NOTLAST;
12 err = do_follow_link(next.dentry, nd);
13 + nd->flags = saved_flags;
21 + nd->flags |= LOOKUP_LAST;
22 err = do_lookup(nd, &this, &next);
23 + nd->flags &= ~LOOKUP_LAST;
26 follow_mount(&next.mnt, &next.dentry);
29 if (nd->dentry && nd->dentry->d_sb &&
30 (nd->dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)) {
32 + nd->flags |= LOOKUP_LAST;
33 + err = !nd->dentry->d_op->d_revalidate(nd->dentry, nd);
34 + nd->flags &= ~LOOKUP_LAST;
35 /* Note: we do not d_invalidate() */
36 - if (!nd->dentry->d_op->d_revalidate(nd->dentry, nd))
46 nd->flags &= ~LOOKUP_PARENT;
47 down(&dir->d_inode->i_sem);
48 + nd->flags |= LOOKUP_LAST;
49 dentry = __lookup_hash(&nd->last, nd->dentry, nd);
50 + nd->flags &= ~LOOKUP_LAST;
53 error = PTR_ERR(dentry);
57 down(&dir->d_inode->i_sem);
58 + nd->flags |= LOOKUP_LAST;
59 dentry = __lookup_hash(&nd->last, nd->dentry, nd);
60 + nd->flags &= ~LOOKUP_LAST;
61 putname(nd->last.name);
64 Index: linus-2.6.7/include/linux/namei.h
65 ===================================================================
66 --- linus-2.6.7.orig/include/linux/namei.h 2005-03-05 20:24:52.000000000 +0200
67 +++ linus-2.6.7/include/linux/namei.h 2005-03-05 20:24:52.000000000 +0200
69 #define LOOKUP_CONTINUE 4
70 #define LOOKUP_PARENT 16
71 #define LOOKUP_NOALT 32
72 +#define LOOKUP_LAST 64
73 +#define LOOKUP_LINK_NOTLAST 128