From: hooanon05@yahoo.co.jp
To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Junjiro Okajima <hooanon05@yahoo.co.jp>
Subject: [PATCH 37/67] aufs file operations
Date: Fri, 16 May 2008 23:32:51 +0900 [thread overview]
Message-ID: <12109484023036-git-send-email-hooanon05@yahoo.co.jp> (raw)
In-Reply-To: <12109484022659-git-send-email-hooanon05@yahoo.co.jp>
From: Junjiro Okajima <hooanon05@yahoo.co.jp>
initial commit
aufs file operations
Signed-off-by: Junjiro Okajima <hooanon05@yahoo.co.jp>
---
fs/aufs/file.h | 246 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 246 insertions(+), 0 deletions(-)
diff --git a/fs/aufs/file.h b/fs/aufs/file.h
new file mode 100644
index 0000000..33a1036
--- /dev/null
+++ b/fs/aufs/file.h
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2005-2008 Junjiro Okajima
+ *
+ * This program, aufs is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/*
+ * file operations
+ *
+ * $Id: file.h,v 1.2 2008/04/21 01:35:14 sfjro Exp $
+ */
+
+#ifndef __AUFS_FILE_H__
+#define __AUFS_FILE_H__
+
+#ifdef __KERNEL__
+
+#include <linux/file.h>
+#include <linux/fs.h>
+#include <linux/mm.h>
+#include <linux/aufs_type.h>
+#include "dentry.h"
+#include "misc.h"
+#include "super.h"
+
+/* ---------------------------------------------------------------------- */
+
+struct au_branch;
+struct au_hfile {
+ struct file *hf_file;
+ struct au_branch *hf_br;
+};
+
+struct au_vdir;
+struct au_finfo {
+ atomic_t fi_generation;
+
+ struct au_rwsem fi_rwsem;
+ struct au_hfile *fi_hfile;
+ aufs_bindex_t fi_bstart, fi_bend;
+
+ union {
+ struct vm_operations_struct *fi_h_vm_ops;
+ struct au_vdir *fi_vdir_cache;
+ };
+};
+
+/* ---------------------------------------------------------------------- */
+
+/* file.c */
+extern struct address_space_operations aufs_aop;
+unsigned int au_file_roflags(unsigned int flags);
+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags,
+ struct file *file);
+int au_do_open(struct inode *inode, struct file *file,
+ int (*open)(struct file *file, int flags));
+int au_reopen_nondir(struct file *file);
+int au_ready_to_write(struct file *file, loff_t len);
+int au_reval_and_lock_finfo(struct file *file, int (*reopen)(struct file *file),
+ int wlock, int locked);
+
+/* f_op.c */
+extern struct file_operations aufs_file_fop;
+int aufs_flush(struct file *file, fl_owner_t id);
+
+/* finfo.c */
+struct au_finfo *au_fi(struct file *file);
+struct au_branch *au_fbr(struct file *file, aufs_bindex_t bindex);
+struct file *au_h_fptr(struct file *file, aufs_bindex_t bindex);
+
+void au_hfput(struct au_hfile *hf);
+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex,
+ struct file *h_file);
+
+void au_finfo_fin(struct file *file);
+int au_finfo_init(struct file *file);
+
+#ifdef CONFIG_AUFS_ROBR
+/* robr.c */
+struct file *au_robr_safe_file(struct vm_area_struct *vma);
+void au_robr_reset_file(struct vm_area_struct *vma, struct file *file);
+#else
+static inline struct file *au_robr_safe_file(struct vm_area_struct *vma)
+{
+ struct file *file;
+
+ file = vma->vm_file;
+ if (file->private_data && au_test_aufs(file->f_dentry->d_sb))
+ return file;
+ return NULL;
+}
+
+static inline
+void au_robr_reset_file(struct vm_area_struct *vma, struct file *file)
+{
+ vma->vm_file = file;
+ //smp_mb(); /* flush vm_file */
+}
+#endif /* CONFIG_AUFS_ROBR */
+
+/* ---------------------------------------------------------------------- */
+
+//todo: memory barrier?
+static inline au_gen_t au_figen(struct file *f)
+{
+ return atomic_read(&au_fi(f)->fi_generation);
+}
+
+static inline int au_test_mmapped(struct file *f)
+{
+ return !!(au_fi(f)->fi_h_vm_ops);
+}
+
+static inline int au_test_aufs_file(struct file *f)
+{
+ return !(f->f_dentry->d_inode->i_mode
+ & (S_IFCHR | S_IFBLK | S_IFIFO | S_IFSOCK));
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if !defined(CONFIG_AUFS_MODULE) || defined(CONFIG_AUFS_DENY_WRITE_ACCESS_PATCH)
+int au_store_fmode_exec(struct nameidata *nd, struct inode *inode);
+
+static inline int au_deny_write_access(struct file *h_file)
+{
+ LKTRTrace("%.*s\n", AuDLNPair(h_file->f_dentry));
+ return deny_write_access(h_file);
+}
+
+static inline void au_allow_write_access(struct file *h_file)
+{
+ allow_write_access(h_file);
+}
+
+#else
+
+static inline int au_store_fmode_exec(struct nameidata *nd, struct inode *inode)
+{
+ /* nothing */
+ return 0;
+}
+
+static inline int au_deny_write_access(struct file *h_file)
+{
+ /* nothing */
+ return 0;
+}
+
+static inline void au_allow_write_access(struct file *h_file)
+{
+ /* nothing */
+}
+#endif /* CONFIG_AUFS_DENY_WRITE_ACCESS_PATCH */
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * fi_read_lock, fi_write_lock,
+ * fi_read_unlock, fi_write_unlock, fi_downgrade_lock
+ */
+AuSimpleRwsemFuncs(fi, struct file *f, au_fi(f)->fi_rwsem);
+
+/* to debug easier, do not make them inlined functions */
+#define FiMustReadLock(f) do { \
+ SiMustAnyLock((f)->f_dentry->d_sb); \
+ AuRwMustReadLock(&au_fi(f)->fi_rwsem); \
+} while (0)
+
+#define FiMustWriteLock(f) do { \
+ SiMustAnyLock((f)->f_dentry->d_sb); \
+ AuRwMustWriteLock(&au_fi(f)->fi_rwsem); \
+} while (0)
+
+#define FiMustAnyLock(f) do { \
+ SiMustAnyLock((f)->f_dentry->d_sb); \
+ AuRwMustAnyLock(&au_fi(f)->fi_rwsem); \
+} while (0)
+
+#define FiMustNoWaiters(f) AuRwMustNoWaiters(&au_fi(f)->fi_rwsem)
+
+/* ---------------------------------------------------------------------- */
+
+// hard/soft set
+static inline aufs_bindex_t au_fbstart(struct file *file)
+{
+ FiMustAnyLock(file);
+ return au_fi(file)->fi_bstart;
+}
+
+static inline aufs_bindex_t au_fbend(struct file *file)
+{
+ FiMustAnyLock(file);
+ return au_fi(file)->fi_bend;
+}
+
+static inline struct au_vdir *au_fvdir_cache(struct file *file)
+{
+ FiMustAnyLock(file);
+ return au_fi(file)->fi_vdir_cache;
+}
+
+static inline void au_set_fbstart(struct file *file, aufs_bindex_t bindex)
+{
+ FiMustWriteLock(file);
+ AuDebugOn(au_sbend(file->f_dentry->d_sb) < bindex);
+ au_fi(file)->fi_bstart = bindex;
+}
+
+static inline void au_set_fbend(struct file *file, aufs_bindex_t bindex)
+{
+ FiMustWriteLock(file);
+ AuDebugOn(au_sbend(file->f_dentry->d_sb) < bindex
+ || bindex < au_fbstart(file));
+ au_fi(file)->fi_bend = bindex;
+}
+
+static inline void au_set_fvdir_cache(struct file *file,
+ struct au_vdir *vdir_cache)
+{
+ FiMustWriteLock(file);
+ AuDebugOn(!S_ISDIR(file->f_dentry->d_inode->i_mode)
+ || (au_fi(file)->fi_vdir_cache && vdir_cache));
+ au_fi(file)->fi_vdir_cache = vdir_cache;
+}
+
+static inline void au_update_figen(struct file *file)
+{
+ atomic_set(&au_fi(file)->fi_generation, au_digen(file->f_dentry));
+ //smp_mb(); /* atomic_set */
+}
+
+#endif /* __KERNEL__ */
+#endif /* __AUFS_FILE_H__ */
--
1.4.4.4
next prev parent reply other threads:[~2008-05-16 14:47 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-16 14:32 [PATCH 1/67] aufs document hooanon05
2008-05-16 14:32 ` [PATCH 2/67] aufs manual hooanon05
2008-05-16 14:32 ` [PATCH 3/67] aufs global header file hooanon05
2008-05-16 14:32 ` [PATCH 4/67] aufs configuration hooanon05
2008-05-16 14:32 ` [PATCH 5/67] aufs Makefile hooanon05
2008-05-16 14:32 ` [PATCH 6/67] aufs main header file hooanon05
2008-05-16 14:32 ` [PATCH 7/67] aufs module initialization and module-global hooanon05
2008-05-16 14:32 ` [PATCH 8/67] aufs module global variables and operations hooanon05
2008-05-16 14:32 ` [PATCH 9/67] aufs super_block operations hooanon05
2008-05-16 14:32 ` [PATCH 10/67] aufs mount and " hooanon05
2008-05-16 14:32 ` [PATCH 11/67] aufs superblock private data hooanon05
2008-05-16 14:32 ` [PATCH 12/67] aufs branch filesystems and xino for them hooanon05
2008-05-16 14:32 ` [PATCH 13/67] aufs branch management hooanon05
2008-05-16 14:32 ` [PATCH 14/67] aufs external inode number translation table and bitmap hooanon05
2008-05-16 14:32 ` [PATCH 15/67] aufs special handling for inode attributes on FUSE branch hooanon05
2008-05-16 14:32 ` [PATCH 16/67] aufs lookup functions for NFS branch in linux-2.6.19 and later hooanon05
2008-05-16 14:32 ` [PATCH 17/67] aufs special handling inode attributes on XFS branch in linux-2.6.24 " hooanon05
2008-05-16 14:32 ` [PATCH 18/67] aufs sysfs interface and lifetime management, header hooanon05
2008-05-16 14:32 ` [PATCH 19/67] aufs sysfs interface and lifetime management, source hooanon05
2008-05-16 14:32 ` [PATCH 20/67] aufs mount options/flags, header hooanon05
2008-05-16 14:32 ` [PATCH 21/67] aufs mount options/flags, source hooanon05
2008-05-16 14:32 ` [PATCH 22/67] aufs workqueue for asynchronous/super-io/delegated operations, header hooanon05
2008-05-16 14:32 ` [PATCH 23/67] aufs workqueue for asynchronous/super-io/delegated operations, source hooanon05
2008-05-16 14:32 ` [PATCH 24/67] aufs sub-VFS, header hooanon05
2008-05-16 14:32 ` [PATCH 25/67] aufs sub-VFS, source hooanon05
2008-05-16 14:32 ` [PATCH 26/67] aufs sub-dcache, header hooanon05
2008-05-16 14:32 ` [PATCH 27/67] aufs sub-dcache, source hooanon05
2008-05-16 14:32 ` [PATCH 28/67] aufs copy-up/down functions hooanon05
2008-05-16 14:32 ` [PATCH 29/67] aufs copy-up functions, see wbr_policy.c for copy-down hooanon05
2008-05-16 14:32 ` [PATCH 30/67] aufs whiteout for logical deletion and opaque directory, header hooanon05
2008-05-16 14:32 ` [PATCH 31/67] aufs whiteout for logical deletion and opaque directory, source hooanon05
2008-05-16 14:32 ` [PATCH 32/67] aufs pseudo-link hooanon05
2008-05-16 14:32 ` [PATCH 33/67] aufs policies for selecting one among multiple writable branches hooanon05
2008-05-16 14:32 ` [PATCH 34/67] aufs lookup and dentry operations, header hooanon05
2008-05-16 14:32 ` [PATCH 35/67] aufs lookup and dentry operations, source hooanon05
2008-05-16 14:32 ` [PATCH 36/67] aufs dentry private data hooanon05
2008-05-16 14:32 ` hooanon05 [this message]
2008-05-16 14:32 ` [PATCH 38/67] aufs handling file/dir, and address_space operation hooanon05
2008-05-16 14:32 ` [PATCH 39/67] aufs file private data hooanon05
2008-05-16 14:32 ` [PATCH 40/67] aufs file and vm operations hooanon05
2008-05-16 14:32 ` [PATCH 41/67] aufs directory operations, header hooanon05
2008-05-16 14:32 ` [PATCH 42/67] aufs directory operations, source hooanon05
2008-05-16 14:32 ` [PATCH 43/67] aufs virtual or vertical directory hooanon05
2008-05-16 14:32 ` [PATCH 44/67] aufs inode operations hooanon05
2008-05-16 14:32 ` [PATCH 45/67] aufs inode functions hooanon05
2008-05-16 14:33 ` [PATCH 46/67] aufs inode private data hooanon05
2008-05-16 14:33 ` [PATCH 47/67] aufs inode operations (except add/del/rename) hooanon05
2008-05-16 14:33 ` [PATCH 48/67] aufs inode operations (add entry) hooanon05
2008-05-16 14:33 ` [PATCH 49/67] aufs inode operations (del entry) hooanon05
2008-05-16 14:33 ` [PATCH 50/67] aufs inode operation (rename entry) hooanon05
2008-05-16 14:33 ` [PATCH 51/67] aufs lower (branch filesystem) inode and setting inotify hooanon05
2008-05-16 14:33 ` [PATCH 52/67] aufs inotify handler hooanon05
2008-05-16 14:33 ` [PATCH 53/67] aufs sub-routines for vfs in hinotify or dlgt mode hooanon05
2008-05-16 14:33 ` [PATCH 54/67] aufs lookup functions in 'delegate' mode hooanon05
2008-05-16 14:33 ` [PATCH 55/67] aufs export via nfs hooanon05
2008-05-16 14:33 ` [PATCH 56/67] aufs 'robr', aufs as readonly branch of another aufs hooanon05
2008-05-16 14:33 ` [PATCH 57/67] aufs sysfs interface hooanon05
2008-05-16 14:33 ` [PATCH 58/67] aufs misc functions, header hooanon05
2008-05-16 14:33 ` [PATCH 59/67] aufs misc functions, source hooanon05
2008-05-16 14:33 ` [PATCH 60/67] aufs debug print functions, header hooanon05
2008-05-16 14:33 ` [PATCH 61/67] aufs debug print functions, source hooanon05
2008-05-16 14:33 ` [PATCH 62/67] aufs magic sysrq handler hooanon05
2008-05-16 14:33 ` [PATCH 63/67] aufs mount helper hooanon05
2008-05-16 14:33 ` [PATCH 64/67] aufs pseudo-link helper hooanon05
2008-05-16 14:33 ` [PATCH 65/67] aufs pseudo-link helper for symlink hooanon05
2008-05-16 14:33 ` [PATCH 66/67] aufs umount helper hooanon05
2008-05-16 14:33 ` [PATCH 67/67] merge aufs hooanon05
2008-05-16 15:36 ` [PATCH 8/67] aufs module global variables and operations Jan Engelhardt
2008-05-16 15:33 ` [PATCH 6/67] aufs main header file Jan Engelhardt
2008-05-16 17:25 ` [PATCH 5/67] aufs Makefile Sam Ravnborg
2008-05-19 2:27 ` hooanon05
2008-05-16 15:28 ` [PATCH 4/67] aufs configuration Jan Engelhardt
2008-05-19 2:23 ` hooanon05
2008-05-16 14:59 ` [PATCH 1/67] aufs document Dave Quigley
2008-05-16 15:32 ` Jan Engelhardt
2008-05-16 21:07 ` Josef 'Jeff' Sipek
2008-05-19 2:25 ` hooanon05
2008-05-16 15:45 ` hooanon05
2008-05-16 16:09 ` Dave Quigley
2008-05-17 2:06 ` hooanon05
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=12109484023036-git-send-email-hooanon05@yahoo.co.jp \
--to=hooanon05@yahoo.co.jp \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®