diff options
Diffstat (limited to 'fs/ecryptfs/file.c')
| -rw-r--r-- | fs/ecryptfs/file.c | 25 | 
1 files changed, 12 insertions, 13 deletions
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index cedc913d11b..566e5472f78 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -191,10 +191,10 @@ static int ecryptfs_open(struct inode *inode, struct file *file)  				      | ECRYPTFS_ENCRYPTED);  	}  	mutex_unlock(&crypt_stat->cs_mutex); -	rc = ecryptfs_init_persistent_file(ecryptfs_dentry); +	rc = ecryptfs_get_lower_file(ecryptfs_dentry);  	if (rc) {  		printk(KERN_ERR "%s: Error attempting to initialize " -			"the persistent file for the dentry with name " +			"the lower file for the dentry with name "  			"[%s]; rc = [%d]\n", __func__,  			ecryptfs_dentry->d_name.name, rc);  		goto out_free; @@ -202,9 +202,9 @@ static int ecryptfs_open(struct inode *inode, struct file *file)  	if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_ACCMODE)  	    == O_RDONLY && (file->f_flags & O_ACCMODE) != O_RDONLY) {  		rc = -EPERM; -		printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs " +		printk(KERN_WARNING "%s: Lower file is RO; eCryptfs "  		       "file must hence be opened RO\n", __func__); -		goto out_free; +		goto out_put;  	}  	ecryptfs_set_file_lower(  		file, ecryptfs_inode_to_private(inode)->lower_file); @@ -232,10 +232,11 @@ static int ecryptfs_open(struct inode *inode, struct file *file)  				       "Plaintext passthrough mode is not "  				       "enabled; returning -EIO\n");  				mutex_unlock(&crypt_stat->cs_mutex); -				goto out_free; +				goto out_put;  			}  			rc = 0; -			crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED); +			crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED +					       | ECRYPTFS_ENCRYPTED);  			mutex_unlock(&crypt_stat->cs_mutex);  			goto out;  		} @@ -245,6 +246,8 @@ static int ecryptfs_open(struct inode *inode, struct file *file)  			"[0x%.16lx] size: [0x%.16llx]\n", inode, inode->i_ino,  			(unsigned long long)i_size_read(inode));  	goto out; +out_put: +	ecryptfs_put_lower_file(inode);  out_free:  	kmem_cache_free(ecryptfs_file_info_cache,  			ecryptfs_file_to_private(file)); @@ -254,17 +257,13 @@ out:  static int ecryptfs_flush(struct file *file, fl_owner_t td)  { -	int rc = 0; -	struct file *lower_file = NULL; - -	lower_file = ecryptfs_file_to_lower(file); -	if (lower_file->f_op && lower_file->f_op->flush) -		rc = lower_file->f_op->flush(lower_file, td); -	return rc; +	return file->f_mode & FMODE_WRITE +	       ? filemap_write_and_wait(file->f_mapping) : 0;  }  static int ecryptfs_release(struct inode *inode, struct file *file)  { +	ecryptfs_put_lower_file(inode);  	kmem_cache_free(ecryptfs_file_info_cache,  			ecryptfs_file_to_private(file));  	return 0;  |