Commit bf6c7f6c authored by Al Viro's avatar Al Viro

don't pass nameidata to vfs_create() from ecryptfs_create()

Instead of playing with removal of LOOKUP_OPEN, mangling (and
restoring) nd->path, just pass NULL to vfs_create().  The whole
point of what's being done there is to suppress any attempts
to open file by underlying fs, which is what nd == NULL indicates.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 8a5e929d
...@@ -147,7 +147,6 @@ static int ecryptfs_interpose(struct dentry *lower_dentry, ...@@ -147,7 +147,6 @@ static int ecryptfs_interpose(struct dentry *lower_dentry,
* @lower_dir_inode: inode of the parent in the lower fs of the new file * @lower_dir_inode: inode of the parent in the lower fs of the new file
* @dentry: New file's dentry * @dentry: New file's dentry
* @mode: The mode of the new file * @mode: The mode of the new file
* @nd: nameidata of ecryptfs' parent's dentry & vfsmount
* *
* Creates the file in the lower file system. * Creates the file in the lower file system.
* *
...@@ -155,31 +154,10 @@ static int ecryptfs_interpose(struct dentry *lower_dentry, ...@@ -155,31 +154,10 @@ static int ecryptfs_interpose(struct dentry *lower_dentry,
*/ */
static int static int
ecryptfs_create_underlying_file(struct inode *lower_dir_inode, ecryptfs_create_underlying_file(struct inode *lower_dir_inode,
struct dentry *dentry, int mode, struct dentry *dentry, int mode)
struct nameidata *nd)
{ {
struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
struct vfsmount *lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry); return vfs_create(lower_dir_inode, lower_dentry, mode, NULL);
struct dentry *dentry_save;
struct vfsmount *vfsmount_save;
unsigned int flags_save;
int rc;
if (nd) {
dentry_save = nd->path.dentry;
vfsmount_save = nd->path.mnt;
flags_save = nd->flags;
nd->path.dentry = lower_dentry;
nd->path.mnt = lower_mnt;
nd->flags &= ~LOOKUP_OPEN;
}
rc = vfs_create(lower_dir_inode, lower_dentry, mode, nd);
if (nd) {
nd->path.dentry = dentry_save;
nd->path.mnt = vfsmount_save;
nd->flags = flags_save;
}
return rc;
} }
/** /**
...@@ -197,8 +175,7 @@ ecryptfs_create_underlying_file(struct inode *lower_dir_inode, ...@@ -197,8 +175,7 @@ ecryptfs_create_underlying_file(struct inode *lower_dir_inode,
*/ */
static int static int
ecryptfs_do_create(struct inode *directory_inode, ecryptfs_do_create(struct inode *directory_inode,
struct dentry *ecryptfs_dentry, int mode, struct dentry *ecryptfs_dentry, int mode)
struct nameidata *nd)
{ {
int rc; int rc;
struct dentry *lower_dentry; struct dentry *lower_dentry;
...@@ -213,7 +190,7 @@ ecryptfs_do_create(struct inode *directory_inode, ...@@ -213,7 +190,7 @@ ecryptfs_do_create(struct inode *directory_inode,
goto out; goto out;
} }
rc = ecryptfs_create_underlying_file(lower_dir_dentry->d_inode, rc = ecryptfs_create_underlying_file(lower_dir_dentry->d_inode,
ecryptfs_dentry, mode, nd); ecryptfs_dentry, mode);
if (rc) { if (rc) {
printk(KERN_ERR "%s: Failure to create dentry in lower fs; " printk(KERN_ERR "%s: Failure to create dentry in lower fs; "
"rc = [%d]\n", __func__, rc); "rc = [%d]\n", __func__, rc);
...@@ -294,7 +271,7 @@ ecryptfs_create(struct inode *directory_inode, struct dentry *ecryptfs_dentry, ...@@ -294,7 +271,7 @@ ecryptfs_create(struct inode *directory_inode, struct dentry *ecryptfs_dentry,
int rc; int rc;
/* ecryptfs_do_create() calls ecryptfs_interpose() */ /* ecryptfs_do_create() calls ecryptfs_interpose() */
rc = ecryptfs_do_create(directory_inode, ecryptfs_dentry, mode, nd); rc = ecryptfs_do_create(directory_inode, ecryptfs_dentry, mode);
if (unlikely(rc)) { if (unlikely(rc)) {
ecryptfs_printk(KERN_WARNING, "Failed to create file in" ecryptfs_printk(KERN_WARNING, "Failed to create file in"
"lower filesystem\n"); "lower filesystem\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment