diff options
Diffstat (limited to 'fs/ecryptfs/file.c')
| -rw-r--r-- | fs/ecryptfs/file.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index eb3dc4c7ac06..9e944057001b 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
| @@ -77,27 +77,27 @@ struct ecryptfs_getdents_callback { | |||
| 77 | 77 | ||
| 78 | /* Inspired by generic filldir in fs/readdir.c */ | 78 | /* Inspired by generic filldir in fs/readdir.c */ |
| 79 | static int | 79 | static int |
| 80 | ecryptfs_filldir(void *dirent, const char *name, int namelen, loff_t offset, | 80 | ecryptfs_filldir(void *dirent, const char *lower_name, int lower_namelen, |
| 81 | u64 ino, unsigned int d_type) | 81 | loff_t offset, u64 ino, unsigned int d_type) |
| 82 | { | 82 | { |
| 83 | struct ecryptfs_crypt_stat *crypt_stat; | ||
| 84 | struct ecryptfs_getdents_callback *buf = | 83 | struct ecryptfs_getdents_callback *buf = |
| 85 | (struct ecryptfs_getdents_callback *)dirent; | 84 | (struct ecryptfs_getdents_callback *)dirent; |
| 85 | size_t name_size; | ||
| 86 | char *name; | ||
| 86 | int rc; | 87 | int rc; |
| 87 | int decoded_length; | ||
| 88 | char *decoded_name; | ||
| 89 | 88 | ||
| 90 | crypt_stat = ecryptfs_dentry_to_private(buf->dentry)->crypt_stat; | ||
| 91 | buf->filldir_called++; | 89 | buf->filldir_called++; |
| 92 | decoded_length = ecryptfs_decode_filename(crypt_stat, name, namelen, | 90 | rc = ecryptfs_decode_and_decrypt_filename(&name, &name_size, |
| 93 | &decoded_name); | 91 | buf->dentry, lower_name, |
| 94 | if (decoded_length < 0) { | 92 | lower_namelen); |
| 95 | rc = decoded_length; | 93 | if (rc) { |
| 94 | printk(KERN_ERR "%s: Error attempting to decode and decrypt " | ||
| 95 | "filename [%s]; rc = [%d]\n", __func__, lower_name, | ||
| 96 | rc); | ||
| 96 | goto out; | 97 | goto out; |
| 97 | } | 98 | } |
| 98 | rc = buf->filldir(buf->dirent, decoded_name, decoded_length, offset, | 99 | rc = buf->filldir(buf->dirent, name, name_size, offset, ino, d_type); |
| 99 | ino, d_type); | 100 | kfree(name); |
| 100 | kfree(decoded_name); | ||
| 101 | if (rc >= 0) | 101 | if (rc >= 0) |
| 102 | buf->entries_written++; | 102 | buf->entries_written++; |
| 103 | out: | 103 | out: |
| @@ -106,8 +106,8 @@ out: | |||
| 106 | 106 | ||
| 107 | /** | 107 | /** |
| 108 | * ecryptfs_readdir | 108 | * ecryptfs_readdir |
| 109 | * @file: The ecryptfs file struct | 109 | * @file: The eCryptfs directory file |
| 110 | * @dirent: Directory entry | 110 | * @dirent: Directory entry handle |
| 111 | * @filldir: The filldir callback function | 111 | * @filldir: The filldir callback function |
| 112 | */ | 112 | */ |
| 113 | static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir) | 113 | static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir) |
| @@ -275,18 +275,9 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | |||
| 275 | static int | 275 | static int |
| 276 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 276 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) |
| 277 | { | 277 | { |
| 278 | struct file *lower_file = ecryptfs_file_to_lower(file); | 278 | return vfs_fsync(ecryptfs_file_to_lower(file), |
| 279 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); | 279 | ecryptfs_dentry_to_lower(dentry), |
| 280 | struct inode *lower_inode = lower_dentry->d_inode; | 280 | datasync); |
| 281 | int rc = -EINVAL; | ||
| 282 | |||
| 283 | if (lower_inode->i_fop->fsync) { | ||
| 284 | mutex_lock(&lower_inode->i_mutex); | ||
| 285 | rc = lower_inode->i_fop->fsync(lower_file, lower_dentry, | ||
| 286 | datasync); | ||
| 287 | mutex_unlock(&lower_inode->i_mutex); | ||
| 288 | } | ||
| 289 | return rc; | ||
| 290 | } | 281 | } |
| 291 | 282 | ||
| 292 | static int ecryptfs_fasync(int fd, struct file *file, int flag) | 283 | static int ecryptfs_fasync(int fd, struct file *file, int flag) |
