Patch from SuSE:
revalidate_special() is called from link_path_walk as the last path component is
(".."). In revalidate_special() we called
real_lookup(dentry->d_parent,&dentry->d_name, nd), which called cifs_lookup().
which doesnot initialises dentry->d_op pointer if there is no corresponding
inode to the dentry. cifs_lookup() returned NULL dentry with d_op() as NULL.
so, in the second iteration of the loop in revalidate_special() we have d_op
as NULL and hence the crash in
if (!dentry->d_op->d_revalidate(dentry, nd)) {
+ struct dentry *dentry = nd->dentry;
+ int err, counter = 0;
+
++ revalidate_again:
+ if (!dentry->d_op || !dentry->d_op->d_revalidate)
+ return 0;
-+ revalidate_again:
+ if (!dentry->d_op->d_revalidate(dentry, nd)) {
+ struct dentry *new;
+ if ((err = permission(dentry->d_parent->d_inode, MAY_EXEC,nd)))
+ struct dentry *dentry = nd->dentry;
+ int err, counter = 0;
+
++ revalidate_again:
+ if (!dentry->d_op || !dentry->d_op->d_revalidate)
+ return 0;
-+ revalidate_again:
+ if (!dentry->d_op->d_revalidate(dentry, nd)) {
+ struct dentry *new;
+ if ((err = permission(dentry->d_parent->d_inode, MAY_EXEC, nd)))