From: pravin shelar <Pravin.Shelar@Sun.COM>
To: linux-fsdevel@vger.kernel.org
Subject: [patch] add dentry revalidate to follow mount.
Date: Mon, 08 Jun 2009 19:14:15 +0530 [thread overview]
Message-ID: <4A2D15AF.8090000@sun.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 333 bytes --]
Hi
i have seen error in lustre while setting permission on fs root
from a client. problem is permission are not getting propagated to
other clients.
this is because of do_lookup() call path which does not revalidate
fs root dentry in follow_mount()
attached patch adds revalidation call in follow_mount.
Thanks,
Pravin
[-- Attachment #2: follow-mount-2630.patch --]
[-- Type: text/x-diff, Size: 1891 bytes --]
Signed-off-by: pravin shelar <pravin.shelar@sun.com>
Index: linux-2.6-latest/fs/namei.c
===================================================================
--- linux-2.6-latest.orig/fs/namei.c
+++ linux-2.6-latest/fs/namei.c
@@ -691,9 +691,11 @@ int follow_up(struct vfsmount **mnt, str
/* no need for dcache_lock, as serialization is taken care in
* namespace.c
*/
-static int __follow_mount(struct path *path)
+static int __follow_mount(struct nameidata *nd, struct path *path)
{
int res = 0;
+ struct dentry *dentry;
+
while (d_mountpoint(path->dentry)) {
struct vfsmount *mounted = lookup_mnt(path->mnt, path->dentry);
if (!mounted)
@@ -703,6 +705,18 @@ static int __follow_mount(struct path *p
mntput(path->mnt);
path->mnt = mounted;
path->dentry = dget(mounted->mnt_root);
+ dentry = path->dentry;
+
+ if (dentry->d_op && dentry->d_op->d_revalidate){
+ dentry = do_revalidate(dentry, nd);
+ if (!dentry)
+ return -EINVAL;
+ if (IS_ERR(dentry))
+ return PTR_ERR(dentry);
+ }
+
+ path->dentry = dentry;
+
res = 1;
}
return res;
@@ -788,6 +802,7 @@ static int do_lookup(struct nameidata *n
{
struct vfsmount *mnt = nd->path.mnt;
struct dentry *dentry = __d_lookup(nd->path.dentry, name);
+ int rc;
if (!dentry)
goto need_lookup;
@@ -796,7 +811,9 @@ static int do_lookup(struct nameidata *n
done:
path->mnt = mnt;
path->dentry = dentry;
- __follow_mount(path);
+ rc = __follow_mount(nd, path);
+ if (rc < 0)
+ return rc;
return 0;
need_lookup:
@@ -1747,11 +1764,15 @@ do_last:
if (flag & O_EXCL)
goto exit_dput;
- if (__follow_mount(&path)) {
- error = -ELOOP;
- if (flag & O_NOFOLLOW)
+ error = __follow_mount(&nd, &path);
+ if (error == 1) {
+ if (flag & O_NOFOLLOW) {
+ error = -ELOOP;
goto exit_dput;
+ }
}
+ if (error < 0)
+ goto exit_dput;
error = -ENOENT;
if (!path.dentry->d_inode)
next reply other threads:[~2009-06-08 13:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-08 13:44 pravin shelar [this message]
2009-06-08 14:13 ` [patch] add dentry revalidate to follow mount Al Viro
2009-06-08 20:23 ` pravin shelar
2009-06-08 20:17 ` Al Viro
2009-06-09 3:43 ` Andreas Dilger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A2D15AF.8090000@sun.com \
--to=pravin.shelar@sun.com \
--cc=linux-fsdevel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.