From Bugzilla Helper: User-Agent: Mozilla/4.77 [en] (X11; U; Linux 2.4.2-2 i686) Description of problem: The kernel fails to revalidate the symlink provided by Amd. The remote filesystem is mounted, then timed-out, and then it is never auto-mounted again. The kernel doesn't allow unmounting the direct mountpoint itself, making it impossible to restart Amd without rebooting. How reproducible: Additional info: Kernel 2.4 diff -u /mnt/3/linux-2.4/fs/nfs/inode.c linux-2.4.4/fs/nfs/inode.c --- /mnt/3/linux-2.4/fs/nfs/inode.c Sat Apr 28 00:45:22 2001 +++ linux-2.4.4/fs/nfs/inode.c Sat Apr 28 14:47:16 2001 @@ -380,6 +380,7 @@ goto out_no_root; sb->s_root->d_op = &nfs_dentry_operations; + sb->s_root->d_time = jiffies; /* Get some general file system info */ if (server->rpc_ops->statfs(server, root, &fsinfo) >= 0) { diff -u /mnt/3/linux-2.4/fs/super.c linux-2.4.4/fs/super.c --- /mnt/3/linux-2.4/fs/super.c Sat Apr 28 00:45:25 2001 +++ linux-2.4.4/fs/super.c Sat Apr 28 13:33:01 2001 @@ -1116,7 +1116,7 @@ if (IS_ERR(kname)) goto out; retval = 0; - if (path_init(kname, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &nd)) + if (path_init(kname, LOOKUP_POSITIVE, &nd)) retval = path_walk(kname, &nd); putname(kname); if (retval) diff -u /mnt/3/linux-2.4/fs/namei.c linux-2.4.4/fs/namei.c --- /mnt/3/linux-2.4/fs/namei.c Sat Apr 28 00:45:22 2001 +++ linux-2.4.4/fs/namei.c Sat Apr 28 20:31:35 2001 @@ -358,12 +358,17 @@ struct vfsmount *tmp; tmp = list_entry(p, struct vfsmount, mnt_clash); if (tmp->mnt_parent == *mnt) { + struct dentry *tmp_root = tmp->mnt_root; + if (tmp_root->d_op && tmp_root->d_op->d_revalidate) { + if (!tmp_root->d_op->d_revalidate(tmp_root, LOOKUP_CONTINUE) && !d_invalidate(tmp_root)) + return 0; + } *mnt = mntget(tmp); spin_unlock(&dcache_lock); mntput(tmp->mnt_parent); /* tmp holds the mountpoint, so... */ dput(*dentry); - *dentry = dget(tmp->mnt_root); + *dentry = dget(tmp_root); return 1; } p = p->next; Kernel 2.2.19 diff -urNX /misc/unpack/diff_kernel_excludes /mnt/3/linux-2.2.19/fs/namei.c linux-2.2.19/fs/namei.c --- /mnt/3/linux-2.2.19/fs/namei.c Sun Mar 25 08:30:58 2001 +++ linux-2.2.19/fs/namei.c Sat Apr 28 03:56:30 2001 @@ -301,11 +302,17 @@ return dentry; } -static inline struct dentry * follow_mount(struct dentry * dentry) +static inline struct dentry * follow_mount(struct dentry * dentry, int flags) { struct dentry * mnt= dentry->d_mounts; if (mnt != dentry) { + /* revalidate first */ + if (mnt->d_op && mnt->d_op->d_revalidate) { + if (!mnt->d_op->d_revalidate(mnt, flags) && !d_invalidate(mnt)) + /* don't follow the mount if we can't validate it */ + return dentry; + } dget(mnt); dput(dentry); dentry = mnt; @@ -405,7 +412,7 @@ } /* Check mountpoints.. */ - dentry = follow_mount(dentry); + dentry = follow_mount(dentry, flags); base = do_follow_link(base, dentry, flags); if (IS_ERR(base)) diff -urNX /misc/unpack/diff_kernel_excludes /mnt/3/linux-2.2.19/fs/nfs/inode.c linux-2.2.19/fs/nfs/inode.c --- /mnt/3/linux-2.2.19/fs/nfs/inode.c Sun Mar 25 08:37:38 2001 +++ linux-2.2.19/fs/nfs/inode.c Sat Apr 28 04:34:57 2001 @@ -435,6 +435,7 @@ goto failure_put_root; sb->s_root->d_op = &nfs_dentry_operations; + sb->s_root->d_time = jiffies; /* Get some general file system info */ if (server->rpc_ops->statfs(server, &fh, &fsinfo) >= 0) { diff -urNX /misc/unpack/diff_kernel_excludes /mnt/3/linux-2.2.19/fs/nfs/symlink.c linux-2.2.19/fs/nfs/symlink.c --- /mnt/3/linux-2.2.19/fs/nfs/symlink.c Sun Mar 25 08:37:38 2001 +++ linux-2.2.19/fs/nfs/symlink.c Sat Apr 28 03:11:52 2001 @@ -32,26 +32,9 @@ * symlinks can't do much... */ struct inode_operations nfs_symlink_inode_operations = { - NULL, /* no file-operations */ - NULL, /* create */ - NULL, /* lookup */ - NULL, /* link */ - NULL, /* unlink */ - NULL, /* symlink */ - NULL, /* mkdir */ - NULL, /* rmdir */ - NULL, /* mknod */ - NULL, /* rename */ - nfs_readlink, /* readlink */ - nfs_follow_link, /* follow_link */ - NULL, /* get_block */ - NULL, /* readpage */ - NULL, /* writepage */ - NULL, /* flushpage */ - NULL, /* truncate */ - NULL, /* permission */ - NULL, /* smap */ - NULL /* revalidate */ + readlink: nfs_readlink, + follow_link: nfs_follow_link, + revalidate: nfs_revalidate, }; /* Symlink caching in the page cache is even more simplistic diff -urNX /misc/unpack/diff_kernel_excludes /mnt/3/linux-2.2.19/fs/super.c linux-2.2.19/fs/super.c --- /mnt/3/linux-2.2.19/fs/super.c Sun Mar 25 08:30:58 2001 +++ linux-2.2.19/fs/super.c Sat Apr 28 01:01:38 2001 @@ -782,7 +782,7 @@ return -EPERM; lock_kernel(); - dentry = namei(name); + dentry = lnamei(name); retval = PTR_ERR(dentry); if (!IS_ERR(dentry)) { struct inode * inode = dentry->d_inode;
Reclassifying for kernel, as this is where the patches go.
Is this patch sent to Linus / Alan ?
Thanks for the bug report. However, Red Hat no longer maintains this version of the product. Please upgrade to the latest version and open a new bug if the problem persists. The Fedora Legacy project (http://fedoralegacy.org/) maintains some older releases, and if you believe this bug is interesting to them, please report the problem in the bug tracker at: http://bugzilla.fedora.us/