|
@@ -231,7 +231,6 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry)
|
|
|
int lower_flags;
|
|
|
struct ecryptfs_crypt_stat *crypt_stat;
|
|
|
struct dentry *lower_dentry;
|
|
|
- struct dentry *tlower_dentry = NULL;
|
|
|
struct file *lower_file;
|
|
|
struct inode *inode, *lower_inode;
|
|
|
struct vfsmount *lower_mnt;
|
|
@@ -241,30 +240,19 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry)
|
|
|
lower_dentry->d_name.name);
|
|
|
inode = ecryptfs_dentry->d_inode;
|
|
|
crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
|
|
|
- tlower_dentry = dget(lower_dentry);
|
|
|
- if (!tlower_dentry) {
|
|
|
- rc = -ENOMEM;
|
|
|
- ecryptfs_printk(KERN_ERR, "Error dget'ing lower_dentry\n");
|
|
|
- goto out;
|
|
|
- }
|
|
|
lower_flags = ((O_CREAT | O_WRONLY | O_TRUNC) & O_ACCMODE) | O_RDWR;
|
|
|
#if BITS_PER_LONG != 32
|
|
|
lower_flags |= O_LARGEFILE;
|
|
|
#endif
|
|
|
lower_mnt = ecryptfs_dentry_to_lower_mnt(ecryptfs_dentry);
|
|
|
- mntget(lower_mnt);
|
|
|
/* Corresponding fput() at end of this function */
|
|
|
- lower_file = dentry_open(tlower_dentry, lower_mnt, lower_flags);
|
|
|
- if (IS_ERR(lower_file)) {
|
|
|
- rc = PTR_ERR(lower_file);
|
|
|
+ if ((rc = ecryptfs_open_lower_file(&lower_file, lower_dentry, lower_mnt,
|
|
|
+ lower_flags))) {
|
|
|
ecryptfs_printk(KERN_ERR,
|
|
|
"Error opening dentry; rc = [%i]\n", rc);
|
|
|
goto out;
|
|
|
}
|
|
|
- /* fput(lower_file) should handle the puts if we do this */
|
|
|
- lower_file->f_dentry = tlower_dentry;
|
|
|
- lower_file->f_vfsmnt = lower_mnt;
|
|
|
- lower_inode = tlower_dentry->d_inode;
|
|
|
+ lower_inode = lower_dentry->d_inode;
|
|
|
if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) {
|
|
|
ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
|
|
|
ECRYPTFS_CLEAR_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED);
|
|
@@ -285,7 +273,8 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry)
|
|
|
}
|
|
|
rc = grow_file(ecryptfs_dentry, lower_file, inode, lower_inode);
|
|
|
out_fput:
|
|
|
- fput(lower_file);
|
|
|
+ if ((rc = ecryptfs_close_lower_file(lower_file)))
|
|
|
+ printk(KERN_ERR "Error closing lower_file\n");
|
|
|
out:
|
|
|
return rc;
|
|
|
}
|
|
@@ -832,12 +821,11 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)
|
|
|
}
|
|
|
lower_dentry = ecryptfs_dentry_to_lower(dentry);
|
|
|
/* This dget & mntget is released through fput at out_fput: */
|
|
|
- dget(lower_dentry);
|
|
|
lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
|
|
|
- mntget(lower_mnt);
|
|
|
- lower_file = dentry_open(lower_dentry, lower_mnt, O_RDWR);
|
|
|
- if (unlikely(IS_ERR(lower_file))) {
|
|
|
- rc = PTR_ERR(lower_file);
|
|
|
+ if ((rc = ecryptfs_open_lower_file(&lower_file, lower_dentry, lower_mnt,
|
|
|
+ O_RDWR))) {
|
|
|
+ ecryptfs_printk(KERN_ERR,
|
|
|
+ "Error opening dentry; rc = [%i]\n", rc);
|
|
|
goto out_free;
|
|
|
}
|
|
|
ecryptfs_set_file_lower(&fake_ecryptfs_file, lower_file);
|
|
@@ -879,7 +867,8 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)
|
|
|
= CURRENT_TIME;
|
|
|
mark_inode_dirty_sync(inode);
|
|
|
out_fput:
|
|
|
- fput(lower_file);
|
|
|
+ if ((rc = ecryptfs_close_lower_file(lower_file)))
|
|
|
+ printk(KERN_ERR "Error closing lower_file\n");
|
|
|
out_free:
|
|
|
if (ecryptfs_file_to_private(&fake_ecryptfs_file))
|
|
|
kmem_cache_free(ecryptfs_file_info_cache,
|