Wrapfs assumes that the d_fsdata field has already been initialized whenever
it is passed one of its own dentries, but it doesn't give the lower fs a chance
to allocate their d_fsdata field when it creates a new lower_dentry. This is
fixed by simply replacing a call to d_add in __wrapfs_lookup with a call to
->lookup on the lower fs inode.
Signed-off-by: Andrew Burford <aburford@cs.stonybrook.edu>
err = -ENOMEM;
goto out;
}
- d_add(lower_dentry, NULL); /* instantiate and hash */
+
+ /*
+ * Calling ->lookup instead of d_add will give the lower fs a chance
+ * to allocate the d_fsdata field but will still instantiate and hash the
+ * lower_dentry. Without this, wrapfs could not stack on top of itself.
+ */
+ d_inode(lower_dir_dentry)->i_op->lookup(d_inode(lower_dir_dentry),
+ lower_dentry, flags);
setup_lower:
lower_path.dentry = lower_dentry;
goto out;
}
- if (lower_path.dentry->d_sb->s_type == &wrapfs_fs_type) {
- err = -EINVAL;
- printk(KERN_ERR "Mount on filesystem of type "
- "wrapfs explicitly disallowed due to "
- "known incompatibilities\n");
- goto out_pput;
- }
-
if (mnt_user_ns(lower_path.mnt) != &init_user_ns) {
err = -EINVAL;
printk(KERN_ERR "Mounting on idmapped mounts currently "