1 /*
2 * File operations for Coda.
3 * Original version: (C) 1996 Peter Braam
4 * Rewritten for Linux 2.1: (C) 1997 Carnegie Mellon University
5 *
6 * Carnegie Mellon encourages users of this code to contribute improvements
7 * to the Coda project. Contact Peter Braam <coda@cs.cmu.edu>.
8 */
9
10 #include <linux/types.h>
11 #include <linux/kernel.h>
12 #include <linux/sched.h>
13 #include <linux/fs.h>
14 #include <linux/stat.h>
15 #include <linux/errno.h>
16 #include <linux/locks.h>
17 #include <linux/smp_lock.h>
18 #include <asm/segment.h>
19 #include <linux/string.h>
20 #include <asm/uaccess.h>
21
22 #include <linux/coda.h>
23 #include <linux/coda_linux.h>
24 #include <linux/coda_fs_i.h>
25 #include <linux/coda_psdev.h>
26 #include <linux/coda_proc.h>
27
28 static ssize_t
29 coda_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos)
30 {
31 struct inode *inode = file->f_dentry->d_inode;
32 struct inode *container = inode->i_mapping->host;
33 ssize_t n;
34
35 down(&container->i_sem);
36
37 n = generic_file_write(file, buf, count, ppos);
38 inode->i_size = container->i_size;
39
40 up(&container->i_sem);
41
42 return n;
43 }
44
45 /* exported from this file (used for dirs) */
46 int coda_fsync(struct file *coda_file, struct dentry *coda_dentry, int datasync)
47 {
48 struct inode *inode = coda_dentry->d_inode;
49 struct dentry cont_dentry;
50 int result = 0;
51 ENTRY;
52 coda_vfs_stat.fsync++;
53
54 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
55 S_ISLNK(inode->i_mode)))
56 return -EINVAL;
57
58 if ( inode->i_mapping == &inode->i_data ) {
59 printk("coda_fsync: no container inode!\n");
60 return -1;
61 }
62
63 cont_dentry.d_inode = inode->i_mapping->host;
64
65 down(&cont_dentry.d_inode->i_sem);
66 result = file_fsync(NULL, &cont_dentry, datasync);
67 up(&cont_dentry.d_inode->i_sem);
68
69 if ( result == 0 && datasync == 0 ) {
70 lock_kernel();
71 result = venus_fsync(inode->i_sb, coda_i2f(inode));
72 unlock_kernel();
73 }
74
75 return result;
76 }
77
78 struct file_operations coda_file_operations = {
79 read: generic_file_read,
80 write: coda_file_write,
81 mmap: generic_file_mmap,
82 open: coda_open,
83 release: coda_release,
84 fsync: coda_fsync,
85 };
86
87
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.