~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/fs/coda/file.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.