From: "Josef 'Jeff' Sipek" <jsipek@cs.sunysb.edu>
To: linux-kernel@vger.kernel.org
Cc: linux-fsdevel@vger.kernel.org, hch@infradead.org,
viro@ftp.linux.org.uk, torvalds@osdl.org, akpm@osdl.org,
mhalcrow@us.ibm.com, Josef "Jeff" Sipek <jsipek@cs.sunysb.edu>,
David Quigley <dquigley@fsl.cs.sunysb.edu>,
Erez Zadok <ezk@cs.sunysb.edu>
Subject: [PATCH 07/24] Unionfs: File operations
Date: Sun, 7 Jan 2007 23:12:59 -0500 [thread overview]
Message-ID: <116822959778-git-send-email-jsipek@cs.sunysb.edu> (raw)
In-Reply-To: <1168229596580-git-send-email-jsipek@cs.sunysb.edu>
From: Josef "Jeff" Sipek <jsipek@cs.sunysb.edu>
This patch provides the file operations for Unionfs.
Signed-off-by: Josef "Jeff" Sipek <jsipek@cs.sunysb.edu>
Signed-off-by: David Quigley <dquigley@fsl.cs.sunysb.edu>
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
---
fs/unionfs/file.c | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 257 insertions(+), 0 deletions(-)
diff --git a/fs/unionfs/file.c b/fs/unionfs/file.c
new file mode 100644
index 0000000..9d05806
--- /dev/null
+++ b/fs/unionfs/file.c
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 2003-2006 Erez Zadok
+ * Copyright (c) 2003-2006 Charles P. Wright
+ * Copyright (c) 2005-2006 Josef 'Jeff' Sipek
+ * Copyright (c) 2005-2006 Junjiro Okajima
+ * Copyright (c) 2005 Arun M. Krishnakumar
+ * Copyright (c) 2004-2006 David P. Quigley
+ * Copyright (c) 2003-2004 Mohammad Nayyer Zubair
+ * Copyright (c) 2003 Puja Gupta
+ * Copyright (c) 2003 Harikesavan Krishnan
+ * Copyright (c) 2003-2006 Stony Brook University
+ * Copyright (c) 2003-2006 The Research Foundation of State University of New York
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "union.h"
+
+/* declarations for sparse */
+extern ssize_t unionfs_read(struct file *, char __user *, size_t, loff_t *);
+extern ssize_t unionfs_write(struct file *, const char __user *, size_t,
+ loff_t *);
+
+/*******************
+ * File Operations *
+ *******************/
+
+static loff_t unionfs_llseek(struct file *file, loff_t offset, int origin)
+{
+ loff_t err;
+ struct file *hidden_file = NULL;
+
+ if ((err = unionfs_file_revalidate(file, 0)))
+ goto out;
+
+ hidden_file = unionfs_lower_file(file);
+ /* always set hidden position to this one */
+ hidden_file->f_pos = file->f_pos;
+
+ memcpy(&hidden_file->f_ra, &file->f_ra, sizeof(struct file_ra_state));
+
+ if (hidden_file->f_op && hidden_file->f_op->llseek)
+ err = hidden_file->f_op->llseek(hidden_file, offset, origin);
+ else
+ err = generic_file_llseek(hidden_file, offset, origin);
+
+ if (err < 0)
+ goto out;
+ if (err != file->f_pos) {
+ file->f_pos = err;
+ file->f_version++;
+ }
+out:
+ return err;
+}
+
+ssize_t unionfs_read(struct file * file, char __user * buf, size_t count,
+ loff_t * ppos)
+{
+ struct file *hidden_file;
+ loff_t pos = *ppos;
+ int err;
+
+ if ((err = unionfs_file_revalidate(file, 0)))
+ goto out;
+
+ err = -EINVAL;
+ hidden_file = unionfs_lower_file(file);
+ if (!hidden_file->f_op || !hidden_file->f_op->read)
+ goto out;
+
+ err = hidden_file->f_op->read(hidden_file, buf, count, &pos);
+ *ppos = pos;
+
+out:
+ return err;
+}
+
+ssize_t __unionfs_write(struct file * file, const char __user * buf,
+ size_t count, loff_t * ppos)
+{
+ int err = -EINVAL;
+ struct file *hidden_file = NULL;
+ struct inode *inode;
+ struct inode *hidden_inode;
+ loff_t pos = *ppos;
+ int bstart, bend;
+
+ inode = file->f_dentry->d_inode;
+
+ bstart = fbstart(file);
+ bend = fbend(file);
+
+ BUG_ON(bstart == -1);
+
+ hidden_file = unionfs_lower_file(file);
+ hidden_inode = hidden_file->f_dentry->d_inode;
+
+ if (!hidden_file->f_op || !hidden_file->f_op->write)
+ goto out;
+
+ /* adjust for append -- seek to the end of the file */
+ if (file->f_flags & O_APPEND)
+ pos = inode->i_size;
+
+ err = hidden_file->f_op->write(hidden_file, buf, count, &pos);
+
+ /*
+ * copy ctime and mtime from lower layer attributes
+ * atime is unchanged for both layers
+ */
+ if (err >= 0)
+ fsstack_copy_attr_times(inode, hidden_inode);
+
+ *ppos = pos;
+
+ /* update this inode's size */
+ if (pos > inode->i_size)
+ inode->i_size = pos;
+out:
+ return err;
+}
+
+ssize_t unionfs_write(struct file * file, const char __user * buf, size_t count,
+ loff_t * ppos)
+{
+ int err = 0;
+
+ if ((err = unionfs_file_revalidate(file, 1)))
+ goto out;
+
+ err = __unionfs_write(file, buf, count, ppos);
+
+out:
+ return err;
+}
+
+static int unionfs_file_readdir(struct file *file, void *dirent,
+ filldir_t filldir)
+{
+ return -ENOTDIR;
+}
+
+static unsigned int unionfs_poll(struct file *file, poll_table * wait)
+{
+ unsigned int mask = DEFAULT_POLLMASK;
+ struct file *hidden_file = NULL;
+
+ if (unionfs_file_revalidate(file, 0)) {
+ /* We should pretend an error happend. */
+ mask = POLLERR | POLLIN | POLLOUT;
+ goto out;
+ }
+
+ hidden_file = unionfs_lower_file(file);
+
+ if (!hidden_file->f_op || !hidden_file->f_op->poll)
+ goto out;
+
+ mask = hidden_file->f_op->poll(hidden_file, wait);
+
+out:
+ return mask;
+}
+
+static int __do_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ int err;
+ struct file *hidden_file;
+
+ hidden_file = unionfs_lower_file(file);
+
+ err = -ENODEV;
+ if (!hidden_file->f_op || !hidden_file->f_op->mmap)
+ goto out;
+
+ vma->vm_file = hidden_file;
+ err = hidden_file->f_op->mmap(hidden_file, vma);
+ get_file(hidden_file); /* make sure it doesn't get freed on us */
+ fput(file); /* no need to keep extra ref on ours */
+out:
+ return err;
+}
+
+static int unionfs_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ int err = 0;
+ int willwrite;
+
+ /* This might could be deferred to mmap's writepage. */
+ willwrite = ((vma->vm_flags | VM_SHARED | VM_WRITE) == vma->vm_flags);
+ if ((err = unionfs_file_revalidate(file, willwrite)))
+ goto out;
+
+ err = __do_mmap(file, vma);
+
+out:
+ return err;
+}
+
+static int unionfs_fsync(struct file *file, struct dentry *dentry, int datasync)
+{
+ int err;
+ struct file *hidden_file = NULL;
+
+ if ((err = unionfs_file_revalidate(file, 1)))
+ goto out;
+
+ hidden_file = unionfs_lower_file(file);
+
+ err = -EINVAL;
+ if (!hidden_file->f_op || !hidden_file->f_op->fsync)
+ goto out;
+
+ mutex_lock(&hidden_file->f_dentry->d_inode->i_mutex);
+ err = hidden_file->f_op->fsync(hidden_file, hidden_file->f_dentry,
+ datasync);
+ mutex_unlock(&hidden_file->f_dentry->d_inode->i_mutex);
+
+out:
+ return err;
+}
+
+static int unionfs_fasync(int fd, struct file *file, int flag)
+{
+ int err = 0;
+ struct file *hidden_file = NULL;
+
+ if ((err = unionfs_file_revalidate(file, 1)))
+ goto out;
+
+ hidden_file = unionfs_lower_file(file);
+
+ if (hidden_file->f_op && hidden_file->f_op->fasync)
+ err = hidden_file->f_op->fasync(fd, hidden_file, flag);
+
+out:
+ return err;
+}
+
+struct file_operations unionfs_main_fops = {
+ .llseek = unionfs_llseek,
+ .read = unionfs_read,
+ .write = unionfs_write,
+ .readdir = unionfs_file_readdir,
+ .poll = unionfs_poll,
+ .unlocked_ioctl = unionfs_ioctl,
+ .mmap = unionfs_mmap,
+ .open = unionfs_open,
+ .flush = unionfs_flush,
+ .release = unionfs_file_release,
+ .fsync = unionfs_fsync,
+ .fasync = unionfs_fasync,
+};
+
--
1.4.4.2
next prev parent reply other threads:[~2007-01-08 4:24 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-08 4:12 [PATCH 00/24] Unionfs, try #4 Josef 'Jeff' Sipek
2007-01-08 4:12 ` [PATCH 01/24] Unionfs: Documentation Josef 'Jeff' Sipek
2007-01-08 19:18 ` Andrew Morton
2007-01-08 19:43 ` Shaya Potter
2007-01-08 20:24 ` Jan Engelhardt
2007-01-08 21:32 ` Shaya Potter
2007-01-08 21:19 ` Andrew Morton
2007-01-08 21:30 ` Shaya Potter
2007-01-08 22:02 ` Andrew Morton
2007-01-08 22:21 ` Shaya Potter
2007-01-08 23:34 ` Jan Engelhardt
2007-01-08 23:37 ` Josef Sipek
2007-01-09 0:03 ` Erez Zadok
2007-01-09 9:53 ` Christoph Hellwig
2007-01-09 10:43 ` Josef Sipek
2007-01-09 10:47 ` Christoph Hellwig
2007-01-09 10:48 ` Christoph Hellwig
2007-01-09 17:28 ` Erez Zadok
2007-01-09 18:03 ` Raz Ben-Jehuda(caro)
2007-01-09 18:24 ` Erez Zadok
2007-01-08 23:25 ` Josef Sipek
2007-01-09 9:49 ` Christoph Hellwig
2007-01-09 10:36 ` Josef Sipek
2007-01-08 20:51 ` Erez Zadok
2007-01-08 21:53 ` Jan Engelhardt
2007-01-08 23:00 ` Michael Halcrow
2007-01-08 23:45 ` Josef Sipek
2007-01-09 0:19 ` Giuseppe Bilotta
2007-01-09 0:19 ` Giuseppe Bilotta
2007-01-09 0:33 ` Josef Sipek
2007-01-09 1:26 ` Jan Engelhardt
2007-01-09 1:50 ` Shaya Potter
2007-01-09 12:26 ` Jan Kara
2007-01-09 16:39 ` Trond Myklebust
2007-01-09 17:04 ` Jan Kara
2007-01-09 17:07 ` Trond Myklebust
2007-01-09 17:34 ` Erez Zadok
2007-01-10 16:12 ` Jan Kara
2007-01-10 20:15 ` Erez Zadok
2007-01-10 20:24 ` Shaya Potter
2007-01-10 21:27 ` Jan Kara
2007-01-10 23:20 ` Josef Sipek
2007-01-10 23:29 ` Shaya Potter
2007-01-11 8:54 ` Jan Kara
2007-01-08 23:15 ` Josef Sipek
2007-01-09 12:15 ` Jan Kara
2007-01-09 16:30 ` Trond Myklebust
2007-01-09 16:41 ` Shaya Potter
2007-01-09 17:03 ` Trond Myklebust
2007-01-09 17:11 ` Shaya Potter
2007-01-09 17:16 ` Erez Zadok
2007-01-09 17:16 ` Jan Kara
2007-01-09 22:02 ` Jan Engelhardt
2007-01-11 14:29 ` unionfs unusable on multiuser systems (was Re: [PATCH 01/24] Unionfs: Documentation) Pavel Machek
2007-01-12 14:17 ` Shaya Potter
2007-01-08 4:12 ` [PATCH 02/24] lookup_one_len_nd - lookup_one_len with nameidata argument Josef 'Jeff' Sipek
2007-01-08 4:12 ` [PATCH 03/24] Unionfs: Branch management functionality Josef 'Jeff' Sipek
2007-01-08 4:12 ` [PATCH 04/24] Unionfs: Common file operations Josef 'Jeff' Sipek
2007-01-08 21:28 ` Andrew Morton
2007-01-08 4:12 ` [PATCH 05/24] Unionfs: Copyup Functionality Josef 'Jeff' Sipek
2007-01-08 21:29 ` Andrew Morton
2007-01-08 22:00 ` Shaya Potter
2007-01-08 4:12 ` [PATCH 06/24] Unionfs: Dentry operations Josef 'Jeff' Sipek
2007-01-08 21:29 ` Andrew Morton
2007-01-08 4:12 ` Josef 'Jeff' Sipek [this message]
2007-01-08 4:13 ` [PATCH 08/24] Unionfs: Directory file operations Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 09/24] Unionfs: Directory manipulation helper functions Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 10/24] Unionfs: Inode operations Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 11/24] Unionfs: Lookup helper functions Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 12/24] Unionfs: Main module functions Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 13/24] Unionfs: Readdir state Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 14/24] Unionfs: Rename Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 15/24] Unionfs: Privileged operations workqueue Josef 'Jeff' Sipek
2007-01-08 21:27 ` Andrew Morton
2007-01-08 4:13 ` [PATCH 16/24] Unionfs: Handling of stale inodes Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 17/24] Unionfs: Miscellaneous helper functions Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 18/24] Unionfs: Superblock operations Josef 'Jeff' Sipek
2007-01-08 21:29 ` Andrew Morton
2007-01-08 4:13 ` [PATCH 19/24] Unionfs: Helper macros/inlines Josef 'Jeff' Sipek
2007-01-08 21:28 ` Andrew Morton
2007-01-09 9:02 ` mutex ownership (was: Re: [PATCH 19/24] Unionfs: Helper macros/inlines) Peter Zijlstra
2007-01-09 9:09 ` Oliver Neukum
2007-01-26 16:10 ` Steven Rostedt
2007-01-08 4:13 ` [PATCH 20/24] Unionfs: Internal include file Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 21/24] Unionfs: Include file Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 22/24] Unionfs: Unlink Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 23/24] Unionfs: Kconfig and Makefile Josef 'Jeff' Sipek
2007-01-08 4:13 ` [PATCH 24/24] Unionfs: Extended Attributes support Josef 'Jeff' Sipek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=116822959778-git-send-email-jsipek@cs.sunysb.edu \
--to=jsipek@cs.sunysb.edu \
--cc=akpm@osdl.org \
--cc=dquigley@fsl.cs.sunysb.edu \
--cc=ezk@cs.sunysb.edu \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mhalcrow@us.ibm.com \
--cc=torvalds@osdl.org \
--cc=viro@ftp.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.