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 cedc913d11ba..566e5472f78c 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) | |||
| 191 | | ECRYPTFS_ENCRYPTED); | 191 | | ECRYPTFS_ENCRYPTED); |
| 192 | } | 192 | } |
| 193 | mutex_unlock(&crypt_stat->cs_mutex); | 193 | mutex_unlock(&crypt_stat->cs_mutex); |
| 194 | rc = ecryptfs_init_persistent_file(ecryptfs_dentry); | 194 | rc = ecryptfs_get_lower_file(ecryptfs_dentry); |
| 195 | if (rc) { | 195 | if (rc) { |
| 196 | printk(KERN_ERR "%s: Error attempting to initialize " | 196 | printk(KERN_ERR "%s: Error attempting to initialize " |
| 197 | "the persistent file for the dentry with name " | 197 | "the lower file for the dentry with name " |
| 198 | "[%s]; rc = [%d]\n", __func__, | 198 | "[%s]; rc = [%d]\n", __func__, |
| 199 | ecryptfs_dentry->d_name.name, rc); | 199 | ecryptfs_dentry->d_name.name, rc); |
| 200 | goto out_free; | 200 | goto out_free; |
| @@ -202,9 +202,9 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | |||
| 202 | if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_ACCMODE) | 202 | if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_ACCMODE) |
| 203 | == O_RDONLY && (file->f_flags & O_ACCMODE) != O_RDONLY) { | 203 | == O_RDONLY && (file->f_flags & O_ACCMODE) != O_RDONLY) { |
| 204 | rc = -EPERM; | 204 | rc = -EPERM; |
| 205 | printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs " | 205 | printk(KERN_WARNING "%s: Lower file is RO; eCryptfs " |
| 206 | "file must hence be opened RO\n", __func__); | 206 | "file must hence be opened RO\n", __func__); |
| 207 | goto out_free; | 207 | goto out_put; |
| 208 | } | 208 | } |
| 209 | ecryptfs_set_file_lower( | 209 | ecryptfs_set_file_lower( |
| 210 | file, ecryptfs_inode_to_private(inode)->lower_file); | 210 | file, ecryptfs_inode_to_private(inode)->lower_file); |
| @@ -232,10 +232,11 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | |||
| 232 | "Plaintext passthrough mode is not " | 232 | "Plaintext passthrough mode is not " |
| 233 | "enabled; returning -EIO\n"); | 233 | "enabled; returning -EIO\n"); |
| 234 | mutex_unlock(&crypt_stat->cs_mutex); | 234 | mutex_unlock(&crypt_stat->cs_mutex); |
| 235 | goto out_free; | 235 | goto out_put; |
| 236 | } | 236 | } |
| 237 | rc = 0; | 237 | rc = 0; |
| 238 | crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED); | 238 | crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED |
| 239 | | ECRYPTFS_ENCRYPTED); | ||
| 239 | mutex_unlock(&crypt_stat->cs_mutex); | 240 | mutex_unlock(&crypt_stat->cs_mutex); |
| 240 | goto out; | 241 | goto out; |
| 241 | } | 242 | } |
| @@ -245,6 +246,8 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | |||
| 245 | "[0x%.16lx] size: [0x%.16llx]\n", inode, inode->i_ino, | 246 | "[0x%.16lx] size: [0x%.16llx]\n", inode, inode->i_ino, |
| 246 | (unsigned long long)i_size_read(inode)); | 247 | (unsigned long long)i_size_read(inode)); |
| 247 | goto out; | 248 | goto out; |
| 249 | out_put: | ||
| 250 | ecryptfs_put_lower_file(inode); | ||
| 248 | out_free: | 251 | out_free: |
| 249 | kmem_cache_free(ecryptfs_file_info_cache, | 252 | kmem_cache_free(ecryptfs_file_info_cache, |
| 250 | ecryptfs_file_to_private(file)); | 253 | ecryptfs_file_to_private(file)); |
| @@ -254,17 +257,13 @@ out: | |||
| 254 | 257 | ||
| 255 | static int ecryptfs_flush(struct file *file, fl_owner_t td) | 258 | static int ecryptfs_flush(struct file *file, fl_owner_t td) |
| 256 | { | 259 | { |
| 257 | int rc = 0; | 260 | return file->f_mode & FMODE_WRITE |
| 258 | struct file *lower_file = NULL; | 261 | ? filemap_write_and_wait(file->f_mapping) : 0; |
| 259 | |||
| 260 | lower_file = ecryptfs_file_to_lower(file); | ||
| 261 | if (lower_file->f_op && lower_file->f_op->flush) | ||
| 262 | rc = lower_file->f_op->flush(lower_file, td); | ||
| 263 | return rc; | ||
| 264 | } | 262 | } |
| 265 | 263 | ||
| 266 | static int ecryptfs_release(struct inode *inode, struct file *file) | 264 | static int ecryptfs_release(struct inode *inode, struct file *file) |
| 267 | { | 265 | { |
| 266 | ecryptfs_put_lower_file(inode); | ||
| 268 | kmem_cache_free(ecryptfs_file_info_cache, | 267 | kmem_cache_free(ecryptfs_file_info_cache, |
| 269 | ecryptfs_file_to_private(file)); | 268 | ecryptfs_file_to_private(file)); |
| 270 | return 0; | 269 | return 0; |
