]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/coda/file.c
Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6
[linux-2.6-omap-h63xx.git] / fs / coda / file.c
index 5ef2b609ec7dd3164f3f70bfac44a281105f2691..29137ff3ca67c155ac2da3d9328258700369195e 100644 (file)
 #include <linux/coda_linux.h>
 #include <linux/coda_fs_i.h>
 #include <linux/coda_psdev.h>
-#include <linux/coda_proc.h>
 
 #include "coda_int.h"
 
-/* if CODA_STORE fails with EOPNOTSUPP, venus clearly doesn't support
- * CODA_STORE/CODA_RELEASE and we fall back on using the CODA_CLOSE upcall */
-static int use_coda_close;
-
 static ssize_t
 coda_file_read(struct file *coda_file, char __user *buf, size_t count, loff_t *ppos)
 {
@@ -47,8 +42,9 @@ coda_file_read(struct file *coda_file, char __user *buf, size_t count, loff_t *p
 }
 
 static ssize_t
-coda_file_sendfile(struct file *coda_file, loff_t *ppos, size_t count,
-                  read_actor_t actor, void *target)
+coda_file_splice_read(struct file *coda_file, loff_t *ppos,
+                     struct pipe_inode_info *pipe, size_t count,
+                     unsigned int flags)
 {
        struct coda_file_info *cfi;
        struct file *host_file;
@@ -57,10 +53,10 @@ coda_file_sendfile(struct file *coda_file, loff_t *ppos, size_t count,
        BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
        host_file = cfi->cfi_container;
 
-       if (!host_file->f_op || !host_file->f_op->sendfile)
+       if (!host_file->f_op || !host_file->f_op->splice_read)
                return -EINVAL;
 
-       return host_file->f_op->sendfile(host_file, ppos, count, actor, target);
+       return host_file->f_op->splice_read(host_file, ppos, pipe, count,flags);
 }
 
 static ssize_t
@@ -133,8 +129,6 @@ int coda_open(struct inode *coda_inode, struct file *coda_file)
        unsigned short coda_flags = coda_flags_to_cflags(flags);
        struct coda_file_info *cfi;
 
-       coda_vfs_stat.open++;
-
        cfi = kmalloc(sizeof(struct coda_file_info), GFP_KERNEL);
        if (!cfi)
                return -ENOMEM;
@@ -142,8 +136,11 @@ int coda_open(struct inode *coda_inode, struct file *coda_file)
        lock_kernel();
 
        error = venus_open(coda_inode->i_sb, coda_i2f(coda_inode), coda_flags,
-                          &host_file); 
-       if (error || !host_file) {
+                          &host_file);
+       if (!host_file)
+               error = -EIO;
+
+       if (error) {
                kfree(cfi);
                unlock_kernel();
                return error;
@@ -162,49 +159,6 @@ int coda_open(struct inode *coda_inode, struct file *coda_file)
        return 0;
 }
 
-int coda_flush(struct file *coda_file, fl_owner_t id)
-{
-       unsigned short flags = coda_file->f_flags & ~O_EXCL;
-       unsigned short coda_flags = coda_flags_to_cflags(flags);
-       struct coda_file_info *cfi;
-       struct inode *coda_inode;
-       int err = 0, fcnt;
-
-       lock_kernel();
-
-       coda_vfs_stat.flush++;
-
-       /* last close semantics */
-       fcnt = file_count(coda_file);
-       if (fcnt > 1)
-               goto out;
-
-       /* No need to make an upcall when we have not made any modifications
-        * to the file */
-       if ((coda_file->f_flags & O_ACCMODE) == O_RDONLY)
-               goto out;
-
-       if (use_coda_close)
-               goto out;
-
-       cfi = CODA_FTOC(coda_file);
-       BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
-
-       coda_inode = coda_file->f_path.dentry->d_inode;
-
-       err = venus_store(coda_inode->i_sb, coda_i2f(coda_inode), coda_flags,
-                         coda_file->f_uid);
-
-       if (err == -EOPNOTSUPP) {
-               use_coda_close = 1;
-               err = 0;
-       }
-
-out:
-       unlock_kernel();
-       return err;
-}
-
 int coda_release(struct inode *coda_inode, struct file *coda_file)
 {
        unsigned short flags = (coda_file->f_flags) & (~O_EXCL);
@@ -215,23 +169,12 @@ int coda_release(struct inode *coda_inode, struct file *coda_file)
        int err = 0;
 
        lock_kernel();
-       coda_vfs_stat.release++;
-       if (!use_coda_close) {
-               err = venus_release(coda_inode->i_sb, coda_i2f(coda_inode),
-                                   coda_flags);
-               if (err == -EOPNOTSUPP) {
-                       use_coda_close = 1;
-                       err = 0;
-               }
-       }
 
        cfi = CODA_FTOC(coda_file);
        BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
 
-       if (use_coda_close)
-               err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode),
-                                 coda_flags, coda_file->f_uid);
+       err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode),
+                         coda_flags, coda_file->f_uid);
 
        host_inode = cfi->cfi_container->f_path.dentry->d_inode;
        cii = ITOC(coda_inode);
@@ -248,7 +191,10 @@ int coda_release(struct inode *coda_inode, struct file *coda_file)
        coda_file->private_data = NULL;
 
        unlock_kernel();
-       return err;
+
+       /* VFS fput ignores the return value from file_operations->release, so
+        * there is no use returning an error here */
+       return 0;
 }
 
 int coda_fsync(struct file *coda_file, struct dentry *coda_dentry, int datasync)
@@ -267,8 +213,6 @@ int coda_fsync(struct file *coda_file, struct dentry *coda_dentry, int datasync)
        BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
        host_file = cfi->cfi_container;
 
-       coda_vfs_stat.fsync++;
-
        if (host_file->f_op && host_file->f_op->fsync) {
                host_dentry = host_file->f_path.dentry;
                host_inode = host_dentry->d_inode;
@@ -292,9 +236,8 @@ const struct file_operations coda_file_operations = {
        .write          = coda_file_write,
        .mmap           = coda_file_mmap,
        .open           = coda_open,
-       .flush          = coda_flush,
        .release        = coda_release,
        .fsync          = coda_fsync,
-       .sendfile       = coda_file_sendfile,
+       .splice_read    = coda_file_splice_read,
 };