Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
file.c
Go to the documentation of this file.
1 
26 #include <linux/file.h>
27 #include <linux/poll.h>
28 #include <linux/slab.h>
29 #include <linux/mount.h>
30 #include <linux/pagemap.h>
31 #include <linux/security.h>
32 #include <linux/compat.h>
33 #include <linux/fs_stack.h>
34 #include "ecryptfs_kernel.h"
35 
46 static ssize_t ecryptfs_read_update_atime(struct kiocb *iocb,
47  const struct iovec *iov,
48  unsigned long nr_segs, loff_t pos)
49 {
50  ssize_t rc;
51  struct path lower;
52  struct file *file = iocb->ki_filp;
53 
54  rc = generic_file_aio_read(iocb, iov, nr_segs, pos);
55  /*
56  * Even though this is a async interface, we need to wait
57  * for IO to finish to update atime
58  */
59  if (-EIOCBQUEUED == rc)
60  rc = wait_on_sync_kiocb(iocb);
61  if (rc >= 0) {
62  lower.dentry = ecryptfs_dentry_to_lower(file->f_path.dentry);
63  lower.mnt = ecryptfs_dentry_to_lower_mnt(file->f_path.dentry);
64  touch_atime(&lower);
65  }
66  return rc;
67 }
68 
70  void *dirent;
71  struct dentry *dentry;
75 };
76 
77 /* Inspired by generic filldir in fs/readdir.c */
78 static int
79 ecryptfs_filldir(void *dirent, const char *lower_name, int lower_namelen,
80  loff_t offset, u64 ino, unsigned int d_type)
81 {
83  (struct ecryptfs_getdents_callback *)dirent;
84  size_t name_size;
85  char *name;
86  int rc;
87 
88  buf->filldir_called++;
89  rc = ecryptfs_decode_and_decrypt_filename(&name, &name_size,
90  buf->dentry, lower_name,
91  lower_namelen);
92  if (rc) {
93  printk(KERN_ERR "%s: Error attempting to decode and decrypt "
94  "filename [%s]; rc = [%d]\n", __func__, lower_name,
95  rc);
96  goto out;
97  }
98  rc = buf->filldir(buf->dirent, name, name_size, offset, ino, d_type);
99  kfree(name);
100  if (rc >= 0)
101  buf->entries_written++;
102 out:
103  return rc;
104 }
105 
112 static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir)
113 {
114  int rc;
115  struct file *lower_file;
116  struct inode *inode;
117  struct ecryptfs_getdents_callback buf;
118 
119  lower_file = ecryptfs_file_to_lower(file);
120  lower_file->f_pos = file->f_pos;
121  inode = file->f_path.dentry->d_inode;
122  memset(&buf, 0, sizeof(buf));
123  buf.dirent = dirent;
124  buf.dentry = file->f_path.dentry;
125  buf.filldir = filldir;
126  buf.filldir_called = 0;
127  buf.entries_written = 0;
128  rc = vfs_readdir(lower_file, ecryptfs_filldir, (void *)&buf);
129  file->f_pos = lower_file->f_pos;
130  if (rc < 0)
131  goto out;
132  if (buf.filldir_called && !buf.entries_written)
133  goto out;
134  if (rc >= 0)
135  fsstack_copy_attr_atime(inode,
136  lower_file->f_path.dentry->d_inode);
137 out:
138  return rc;
139 }
140 
142 
143 static int read_or_initialize_metadata(struct dentry *dentry)
144 {
145  struct inode *inode = dentry->d_inode;
146  struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
147  struct ecryptfs_crypt_stat *crypt_stat;
148  int rc;
149 
150  crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
151  mount_crypt_stat = &ecryptfs_superblock_to_private(
152  inode->i_sb)->mount_crypt_stat;
153  mutex_lock(&crypt_stat->cs_mutex);
154 
155  if (crypt_stat->flags & ECRYPTFS_POLICY_APPLIED &&
156  crypt_stat->flags & ECRYPTFS_KEY_VALID) {
157  rc = 0;
158  goto out;
159  }
160 
161  rc = ecryptfs_read_metadata(dentry);
162  if (!rc)
163  goto out;
164 
165  if (mount_crypt_stat->flags & ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED) {
166  crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
168  rc = 0;
169  goto out;
170  }
171 
172  if (!(mount_crypt_stat->flags & ECRYPTFS_XATTR_METADATA_ENABLED) &&
173  !i_size_read(ecryptfs_inode_to_lower(inode))) {
174  rc = ecryptfs_initialize_file(dentry, inode);
175  if (!rc)
176  goto out;
177  }
178 
179  rc = -EIO;
180 out:
181  mutex_unlock(&crypt_stat->cs_mutex);
182  return rc;
183 }
184 
194 static int ecryptfs_open(struct inode *inode, struct file *file)
195 {
196  int rc = 0;
197  struct ecryptfs_crypt_stat *crypt_stat = NULL;
198  struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
199  struct dentry *ecryptfs_dentry = file->f_path.dentry;
200  /* Private value of ecryptfs_dentry allocated in
201  * ecryptfs_lookup() */
202  struct dentry *lower_dentry;
203  struct ecryptfs_file_info *file_info;
204 
205  mount_crypt_stat = &ecryptfs_superblock_to_private(
206  ecryptfs_dentry->d_sb)->mount_crypt_stat;
207  if ((mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
208  && ((file->f_flags & O_WRONLY) || (file->f_flags & O_RDWR)
209  || (file->f_flags & O_CREAT) || (file->f_flags & O_TRUNC)
210  || (file->f_flags & O_APPEND))) {
211  printk(KERN_WARNING "Mount has encrypted view enabled; "
212  "files may only be read\n");
213  rc = -EPERM;
214  goto out;
215  }
216  /* Released in ecryptfs_release or end of function if failure */
217  file_info = kmem_cache_zalloc(ecryptfs_file_info_cache, GFP_KERNEL);
218  ecryptfs_set_file_private(file, file_info);
219  if (!file_info) {
221  "Error attempting to allocate memory\n");
222  rc = -ENOMEM;
223  goto out;
224  }
225  lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry);
226  crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
227  mutex_lock(&crypt_stat->cs_mutex);
228  if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)) {
229  ecryptfs_printk(KERN_DEBUG, "Setting flags for stat...\n");
230  /* Policy code enabled in future release */
231  crypt_stat->flags |= (ECRYPTFS_POLICY_APPLIED
233  }
234  mutex_unlock(&crypt_stat->cs_mutex);
235  rc = ecryptfs_get_lower_file(ecryptfs_dentry, inode);
236  if (rc) {
237  printk(KERN_ERR "%s: Error attempting to initialize "
238  "the lower file for the dentry with name "
239  "[%s]; rc = [%d]\n", __func__,
240  ecryptfs_dentry->d_name.name, rc);
241  goto out_free;
242  }
243  if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_ACCMODE)
244  == O_RDONLY && (file->f_flags & O_ACCMODE) != O_RDONLY) {
245  rc = -EPERM;
246  printk(KERN_WARNING "%s: Lower file is RO; eCryptfs "
247  "file must hence be opened RO\n", __func__);
248  goto out_put;
249  }
250  ecryptfs_set_file_lower(
251  file, ecryptfs_inode_to_private(inode)->lower_file);
252  if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) {
253  ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
254  mutex_lock(&crypt_stat->cs_mutex);
255  crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
256  mutex_unlock(&crypt_stat->cs_mutex);
257  rc = 0;
258  goto out;
259  }
260  rc = read_or_initialize_metadata(ecryptfs_dentry);
261  if (rc)
262  goto out_put;
263  ecryptfs_printk(KERN_DEBUG, "inode w/ addr = [0x%p], i_ino = "
264  "[0x%.16lx] size: [0x%.16llx]\n", inode, inode->i_ino,
265  (unsigned long long)i_size_read(inode));
266  goto out;
267 out_put:
269 out_free:
270  kmem_cache_free(ecryptfs_file_info_cache,
271  ecryptfs_file_to_private(file));
272 out:
273  return rc;
274 }
275 
276 static int ecryptfs_flush(struct file *file, fl_owner_t td)
277 {
278  struct file *lower_file = ecryptfs_file_to_lower(file);
279 
280  if (lower_file->f_op && lower_file->f_op->flush) {
282  return lower_file->f_op->flush(lower_file, td);
283  }
284 
285  return 0;
286 }
287 
288 static int ecryptfs_release(struct inode *inode, struct file *file)
289 {
291  kmem_cache_free(ecryptfs_file_info_cache,
292  ecryptfs_file_to_private(file));
293  return 0;
294 }
295 
296 static int
297 ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
298 {
299  return vfs_fsync(ecryptfs_file_to_lower(file), datasync);
300 }
301 
302 static int ecryptfs_fasync(int fd, struct file *file, int flag)
303 {
304  int rc = 0;
305  struct file *lower_file = NULL;
306 
307  lower_file = ecryptfs_file_to_lower(file);
308  if (lower_file->f_op && lower_file->f_op->fasync)
309  rc = lower_file->f_op->fasync(fd, lower_file, flag);
310  return rc;
311 }
312 
313 static long
314 ecryptfs_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
315 {
316  struct file *lower_file = NULL;
317  long rc = -ENOTTY;
318 
319  if (ecryptfs_file_to_private(file))
320  lower_file = ecryptfs_file_to_lower(file);
321  if (lower_file && lower_file->f_op && lower_file->f_op->unlocked_ioctl)
322  rc = lower_file->f_op->unlocked_ioctl(lower_file, cmd, arg);
323  return rc;
324 }
325 
326 #ifdef CONFIG_COMPAT
327 static long
328 ecryptfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
329 {
330  struct file *lower_file = NULL;
331  long rc = -ENOIOCTLCMD;
332 
333  if (ecryptfs_file_to_private(file))
334  lower_file = ecryptfs_file_to_lower(file);
335  if (lower_file && lower_file->f_op && lower_file->f_op->compat_ioctl)
336  rc = lower_file->f_op->compat_ioctl(lower_file, cmd, arg);
337  return rc;
338 }
339 #endif
340 
342  .readdir = ecryptfs_readdir,
343  .read = generic_read_dir,
344  .unlocked_ioctl = ecryptfs_unlocked_ioctl,
345 #ifdef CONFIG_COMPAT
346  .compat_ioctl = ecryptfs_compat_ioctl,
347 #endif
348  .open = ecryptfs_open,
349  .flush = ecryptfs_flush,
350  .release = ecryptfs_release,
351  .fsync = ecryptfs_fsync,
352  .fasync = ecryptfs_fasync,
353  .splice_read = generic_file_splice_read,
354  .llseek = default_llseek,
355 };
356 
358  .llseek = generic_file_llseek,
359  .read = do_sync_read,
360  .aio_read = ecryptfs_read_update_atime,
361  .write = do_sync_write,
362  .aio_write = generic_file_aio_write,
363  .readdir = ecryptfs_readdir,
364  .unlocked_ioctl = ecryptfs_unlocked_ioctl,
365 #ifdef CONFIG_COMPAT
366  .compat_ioctl = ecryptfs_compat_ioctl,
367 #endif
368  .mmap = generic_file_mmap,
369  .open = ecryptfs_open,
370  .flush = ecryptfs_flush,
371  .release = ecryptfs_release,
372  .fsync = ecryptfs_fsync,
373  .fasync = ecryptfs_fasync,
374  .splice_read = generic_file_splice_read,
375 };