On Wed, 14 Mar 2001, Petr Vandrovec wrote:

> Hey, it is reproducible:
> 
> mount -t vfat /dev/hda1 /dos/c
> mount --bind / /xxx
> echo "a" > /xxx/dos/c
> 
> and it stops here... ^C does not work. umount /dos/c fixes it
> (creat() returns EISDIR)

Very interesting. <thinks>
OK, so path_walk() gives us (vfsmnt of /xxx, dentry of /dos).
Then we do down() on ->i_sem of inode of /dos. OK.
We find dentry of /dos/c (mountpoint)
It's positive, so we drop ->i_sem of parent.
Dentry is a mountpoint.
We call __follow_down(). Since nothing is mounted under xxx we get
unchanged... What the fuck?

OK, I'm an idiot. Linus, please apply the following:

--- fs/namei.c.old    Wed Mar 14 16:37:45 2001
+++ fs/namei.c        Wed Mar 14 16:38:23 2001
@@ -1013,7 +1013,7 @@
                error = -ELOOP;
                if (flag & O_NOFOLLOW)
                        goto exit_dput;
-               do __follow_down(&nd->mnt,&dentry); while(d_mountpoint(dentry));
+               while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
        }
        error = -ENOENT;
        if (!dentry->d_inode)

                                                        Cheers,
                                                                Al

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to