[PATCH] FUSE: direct I/O cleanup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Eric W. Biederman suggested using a separate set of file operations
for direct I/O.  This patch implements this cleanup.

Signed-off-by: Miklos Szeredi <[email protected]>

diff -rup linux-2.6.13-rc1-mm1/fs/fuse/file.c linux-fuse/fs/fuse/file.c
--- linux-2.6.13-rc1-mm1/fs/fuse/file.c	2005-07-03 17:51:56.000000000 +0200
+++ linux-fuse/fs/fuse/file.c	2005-07-03 17:57:41.000000000 +0200
@@ -475,44 +475,26 @@ static ssize_t fuse_direct_io(struct fil
 	return res;
 }
 
-static ssize_t fuse_file_read(struct file *file, char __user *buf,
-			      size_t count, loff_t *ppos)
+static ssize_t fuse_direct_read(struct file *file, char __user *buf,
+				     size_t count, loff_t *ppos)
 {
-	struct inode *inode = file->f_dentry->d_inode;
-	struct fuse_conn *fc = get_fuse_conn(inode);
-
-	if (fc->flags & FUSE_DIRECT_IO)
-		return fuse_direct_io(file, buf, count, ppos, 0);
-	else
-		return generic_file_read(file, buf, count, ppos);
+	return fuse_direct_io(file, buf, count, ppos, 0);
 }
 
-static ssize_t fuse_file_write(struct file *file, const char __user *buf,
-			       size_t count, loff_t *ppos)
+static ssize_t fuse_direct_write(struct file *file, const char __user *buf,
+				 size_t count, loff_t *ppos)
 {
 	struct inode *inode = file->f_dentry->d_inode;
-	struct fuse_conn *fc = get_fuse_conn(inode);
-
-	if (fc->flags & FUSE_DIRECT_IO) {
-		ssize_t res;
-		/* Don't allow parallel writes to the same file */
-		down(&inode->i_sem);
-		res = fuse_direct_io(file, buf, count, ppos, 1);
-		up(&inode->i_sem);
-		return res;
-	}
-	else
-		return generic_file_write(file, buf, count, ppos);
+	ssize_t res;
+	/* Don't allow parallel writes to the same file */
+	down(&inode->i_sem);
+	res = fuse_direct_io(file, buf, count, ppos, 1);
+	up(&inode->i_sem);
+	return res;
 }
 
 static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma)
 {
-	struct inode *inode = file->f_dentry->d_inode;
-	struct fuse_conn *fc = get_fuse_conn(inode);
-
-	if (fc->flags & FUSE_DIRECT_IO)
-		return -ENODEV;
-
 	if ((vma->vm_flags & VM_SHARED)) {
 		if ((vma->vm_flags & VM_WRITE))
 			return -ENODEV;
@@ -522,17 +504,6 @@ static int fuse_file_mmap(struct file *f
 	return generic_file_mmap(file, vma);
 }
 
-static ssize_t fuse_file_sendfile(struct file *file, loff_t *ppos,
-				  size_t count, read_actor_t actor,
-				  void *target)
-{
-	struct fuse_conn *fc = get_fuse_conn(file->f_dentry->d_inode);
-	if (fc->flags & FUSE_DIRECT_IO)
-		return -EINVAL;
-	else
-		return generic_file_sendfile(file, ppos, count, actor, target);
-}
-
 static int fuse_set_page_dirty(struct page *page)
 {
 	printk("fuse_set_page_dirty: should not happen\n");
@@ -542,14 +513,25 @@ static int fuse_set_page_dirty(struct pa
 
 static struct file_operations fuse_file_operations = {
 	.llseek		= generic_file_llseek,
-	.read		= fuse_file_read,
-	.write		= fuse_file_write,
+	.read		= generic_file_read,	
+	.write		= generic_file_write,
 	.mmap		= fuse_file_mmap,
 	.open		= fuse_open,
 	.flush		= fuse_flush,
 	.release	= fuse_release,
 	.fsync		= fuse_fsync,
-	.sendfile	= fuse_file_sendfile,
+	.sendfile	= generic_file_sendfile,
+};
+
+static struct file_operations fuse_direct_io_file_operations = {
+	.llseek		= generic_file_llseek,
+	.read		= fuse_direct_read,
+	.write		= fuse_direct_write,
+	.open		= fuse_open,
+	.flush		= fuse_flush,
+	.release	= fuse_release,
+	.fsync		= fuse_fsync,
+	/* no mmap and sendfile */
 };
 
 static struct address_space_operations fuse_file_aops  = {
@@ -562,6 +544,12 @@ static struct address_space_operations f
 
 void fuse_init_file_inode(struct inode *inode)
 {
-	inode->i_fop = &fuse_file_operations;
-	inode->i_data.a_ops = &fuse_file_aops;
+	struct fuse_conn *fc = get_fuse_conn(inode);
+
+	if (fc->flags & FUSE_DIRECT_IO)
+		inode->i_fop = &fuse_direct_io_file_operations;
+	else {
+		inode->i_fop = &fuse_file_operations;
+		inode->i_data.a_ops = &fuse_file_aops;
+	}
 }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux