From: Dave Hansen <haveblue@us.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: linux-fsdevel@vger.kernel.org, herbert@13thfloor.at,
viro@ftp.linux.org.uk, Dave Hansen <haveblue@us.ibm.com>
Subject: [RFC][PATCH 03/20] Add vfsmount writer count
Date: Fri, 16 Jun 2006 16:12:15 -0700 [thread overview]
Message-ID: <20060616231215.09D54036@localhost.localdomain> (raw)
In-Reply-To: <20060616231213.D4C5D6AF@localhost.localdomain>
This allows a vfsmount to keep track of how many instances
of files open for write there are at a given time.
A mount can refuse to allow writers. This can be because
it is a read-only bind mount, or for other functionality
in the future. A mount can also now refuse to make a
transition from r/w to r/o whenever it has currently active
writers.
Note that this version of the patch does not use an explicit
mount flag. It is redundant along with the information in
the reference count.
The WARN_ON()s can go away before this is merged into mainline
provided it has had some time in -mm or equivalent.
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---
lxc-dave/fs/namespace.c | 1
lxc-dave/include/linux/mount.h | 49 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 50 insertions(+)
diff -puN fs/namespace.c~C-add-vfsmount-writer_count fs/namespace.c
--- lxc/fs/namespace.c~C-add-vfsmount-writer_count 2006-06-16 15:58:01.000000000 -0700
+++ lxc-dave/fs/namespace.c 2006-06-16 15:58:01.000000000 -0700
@@ -66,6 +66,7 @@ struct vfsmount *alloc_vfsmnt(const char
if (mnt) {
memset(mnt, 0, sizeof(struct vfsmount));
atomic_set(&mnt->mnt_count, 1);
+ atomic_set(&mnt->mnt_writers, 1);
INIT_LIST_HEAD(&mnt->mnt_hash);
INIT_LIST_HEAD(&mnt->mnt_child);
INIT_LIST_HEAD(&mnt->mnt_mounts);
diff -puN include/linux/mount.h~C-add-vfsmount-writer_count include/linux/mount.h
--- lxc/include/linux/mount.h~C-add-vfsmount-writer_count 2006-06-16 15:58:01.000000000 -0700
+++ lxc-dave/include/linux/mount.h 2006-06-16 15:58:01.000000000 -0700
@@ -12,6 +12,8 @@
#define _LINUX_MOUNT_H
#ifdef __KERNEL__
+#include <linux/err.h>
+#include <linux/fs.h>
#include <linux/types.h>
#include <linux/list.h>
#include <linux/spinlock.h>
@@ -38,6 +40,10 @@ struct vfsmount {
struct list_head mnt_mounts; /* list of children, anchored here */
struct list_head mnt_child; /* and going through their mnt_child */
atomic_t mnt_count;
+ atomic_t mnt_writers; /* 0 - mount is r/o
+ * >0 - mount is r/w, there are
+ * mnt_writers-1 writers
+ */
int mnt_flags;
int mnt_expiry_mark; /* true if marked for expiry */
char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */
@@ -58,6 +64,49 @@ static inline struct vfsmount *mntget(st
return mnt;
}
+/*
+ * Must be called under write lock on mnt->mnt_sb->s_umount,
+ * this prevents concurrent decrements which could make the
+ * value -1, and test in mnt_want_write() wrongly succeed
+ */
+static inline int mnt_make_readonly(struct vfsmount *mnt)
+{
+ if (!atomic_dec_and_test(&mnt->mnt_writers)) {
+ atomic_inc(&mnt->mnt_writers);
+ return -EBUSY;
+ }
+ return 0;
+}
+
+/*
+ * This can race with itself, so it must be serialized.
+ * It must also be called with mnt->mnt_writers == 0
+ */
+static inline void __mnt_make_writable(struct vfsmount *mnt)
+{
+ WARN_ON(atomic_read(&mnt->mnt_writers));
+ atomic_inc(&mnt->mnt_writers);
+}
+
+static inline int __mnt_is_readonly(struct vfsmount *mnt)
+{
+ return (atomic_read(&mnt->mnt_writers) == 0);
+}
+
+static inline int mnt_want_write(struct vfsmount *mnt)
+{
+ int ret = 0;
+ if (!atomic_add_unless(&mnt->mnt_writers, 1, 0))
+ ret = -EROFS;
+ return ret;
+}
+
+static inline void mnt_drop_write(struct vfsmount *mnt)
+{
+ atomic_dec(&mnt->mnt_writers);
+ WARN_ON(atomic_read(&mnt->mnt_writers) < 1);
+}
+
extern void mntput_no_expire(struct vfsmount *mnt);
extern void mnt_pin(struct vfsmount *mnt);
extern void mnt_unpin(struct vfsmount *mnt);
_
next prev parent reply other threads:[~2006-06-16 23:12 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-16 23:12 [RFC][PATCH 00/20] Mount writer count and read-only bind mounts (v2) Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 01/20] prepare for write access checks: collapse if() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 02/20] r/o bind mount prepwork: move open_namei()'s vfs_create() Dave Hansen
2006-06-16 23:12 ` Dave Hansen [this message]
2006-06-18 18:33 ` [RFC][PATCH 03/20] Add vfsmount writer count Al Viro
2006-06-19 17:02 ` Dave Hansen
2006-06-20 21:20 ` Al Viro
2006-06-22 17:01 ` Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 04/20] elevate mnt writers for callers of vfs_mkdir() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 05/20] elevate write count during entire ncp_ioctl() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 06/20] sys_symlinkat() elevate write count around vfs_symlink() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 07/20] elevate mount count for extended attributes Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 08/20] sys_linkat(): elevate write count around vfs_link() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 09/20] mount_is_safe(): add comment Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 11/20] elevate write count over calls to vfs_rename() Dave Hansen
2006-06-18 18:23 ` Al Viro
2006-06-19 17:18 ` Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 10/20] unix_find_other() elevate write count for touch_atime() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 12/20] tricky: elevate write count files are open()ed Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 13/20] elevate writer count for do_sys_truncate() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 15/20] elevate write count for do_sys_utime() and touch_atime() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 14/20] elevate write count for do_utimes() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 16/20] sys_mknodat(): elevate write count for vfs_mknod/create() Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 17/20] elevate mnt writers for vfs_unlink() callers Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 18/20] do_rmdir(): elevate write count Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 19/20] elevate writer count for custom 'struct file' Dave Hansen
2006-06-16 23:12 ` [RFC][PATCH 20/20] honor r/w changes at do_remount() time Dave Hansen
2006-06-18 18:36 ` Al Viro
2006-06-19 16:45 ` Dave Hansen
2006-06-16 23:29 ` [RFC][PATCH 00/20] Mount writer count and read-only bind mounts (v2) Grzegorz Kulewski
2006-06-16 23:41 ` Dave Hansen
2006-06-17 0:10 ` Grzegorz Kulewski
2006-06-17 3:35 ` Herbert Poetzl
2006-06-17 9:36 ` Jan Engelhardt
2006-06-17 13:29 ` Herbert Poetzl
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=20060616231215.09D54036@localhost.localdomain \
--to=haveblue@us.ibm.com \
--cc=herbert@13thfloor.at \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).