From: Dave Hansen <haveblue@us.ibm.com>
To: viro@ftp.linux.org.uk
Cc: serue@us.ibm.com, linux-kernel@vger.kernel.org,
Dave Hansen <haveblue@us.ibm.com>
Subject: [RFC][PATCH 06/27] record when sb_writer_count elevated for inode
Date: Wed, 12 Jul 2006 11:17:14 -0700 [thread overview]
Message-ID: <20060712181714.6C3216FF@localhost.localdomain> (raw)
In-Reply-To: <20060712181709.5C1A4353@localhost.localdomain>
There are a number of filesystems that do iput()s without first
having messed with i_nlink. In order to keep from accidentally
decrementing the superblock writer count for these, we record
when the count is bumped up, so that we can properly balance
it.
I know the flag name sucks. Anybody have better ideas?
I first tried to do this by catching all of the users an intentions
whenever i_nlink is modified, but all of the filesystems do enough
creative things with it that even if it was all properly fixed now,
new issues with vfsmnt writer count imaglance will probably pop
up in the future. This patch trades that possibility for the chance
that we will miss a i_nlink--, and not bump the sb writer count.
I like the idea screwing up writing out a single inode better than
screwing up a global superblock count imbalance that will affect
all inodes.
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---
lxc-dave/fs/inode.c | 7 ++++++-
lxc-dave/fs/libfs.c | 4 ++++
lxc-dave/include/linux/fs.h | 1 +
3 files changed, 11 insertions(+), 1 deletion(-)
diff -puN fs/inode.c~C-record-when-sb_writer_count-elevated-for-inode-in-inode fs/inode.c
--- lxc/fs/inode.c~C-record-when-sb_writer_count-elevated-for-inode-in-inode 2006-07-12 11:09:16.000000000 -0700
+++ lxc-dave/fs/inode.c 2006-07-12 11:09:23.000000000 -0700
@@ -1114,12 +1114,17 @@ EXPORT_SYMBOL_GPL(generic_drop_inode);
*/
static inline void iput_final(struct inode *inode)
{
- struct super_operations *op = inode->i_sb->s_op;
+ struct super_block *sb = inode->i_sb;
+ struct super_operations *op = sb->s_op;
void (*drop)(struct inode *) = generic_drop_inode;
+ int must_drop_sb_write = (inode->i_state & I_WRITING_ON_SB);
+ inode->i_state &= ~I_WRITING_ON_SB;
if (op && op->drop_inode)
drop = op->drop_inode;
drop(inode);
+ if (must_drop_sb_write)
+ atomic_dec(&sb->s_mnt_writers);
}
/**
diff -puN fs/libfs.c~C-record-when-sb_writer_count-elevated-for-inode-in-inode fs/libfs.c
--- lxc/fs/libfs.c~C-record-when-sb_writer_count-elevated-for-inode-in-inode 2006-07-12 11:09:19.000000000 -0700
+++ lxc-dave/fs/libfs.c 2006-07-12 11:09:23.000000000 -0700
@@ -273,6 +273,9 @@ out:
void inode_drop_nlink(struct inode *inode)
{
inode->i_nlink--;
+ if (inode->i_nlink)
+ return;
+ inode->i_state |= I_WRITING_ON_SB;
}
int simple_unlink(struct inode *dir, struct dentry *dentry)
@@ -386,6 +389,7 @@ int simple_fill_super(struct super_block
inode = new_inode(s);
if (!inode)
return -ENOMEM;
+ inode->i_state |= I_WRITING_ON_SB;
inode->i_mode = S_IFDIR | 0755;
inode->i_uid = inode->i_gid = 0;
inode->i_blocks = 0;
diff -puN include/linux/fs.h~C-record-when-sb_writer_count-elevated-for-inode-in-inode include/linux/fs.h
--- lxc/include/linux/fs.h~C-record-when-sb_writer_count-elevated-for-inode-in-inode 2006-07-12 11:09:22.000000000 -0700
+++ lxc-dave/include/linux/fs.h 2006-07-12 11:09:23.000000000 -0700
@@ -1237,6 +1237,7 @@ struct super_operations {
#define I_CLEAR 32
#define I_NEW 64
#define I_WILL_FREE 128
+#define I_WRITING_ON_SB 256
#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)
_
next prev parent reply other threads:[~2006-07-12 18:24 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-12 18:17 [RFC][PATCH 00/27] Mount writer count and read-only bind mounts (v4) Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 01/27] prepare for write access checks: collapse if() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 02/27] r/o bind mount prepwork: move open_namei()'s vfs_create() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 03/27] unlink: monitor i_nlink Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 04/27] reintroduce list of vfsmounts over superblock Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 05/27] Add vfsmount writer count Dave Hansen
2006-07-12 18:17 ` Dave Hansen [this message]
2006-07-12 18:17 ` [RFC][PATCH 08/27] increment sb writer count when nlink hits zero Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 07/27] kill open files traverse on remount ro Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 09/27] elevate writer count for chown and friends Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 11/27] elevate write count during entire ncp_ioctl() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 10/27] elevate mnt writers for callers of vfs_mkdir() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 12/27] sys_symlinkat() elevate write count around vfs_symlink() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 13/27] elevate mount count for extended attributes Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 14/27] sys_linkat(): elevate write count around vfs_link() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 15/27] mount_is_safe(): add comment Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 16/27] unix_find_other() elevate write count for touch_atime() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 18/27] tricky: elevate write count files are open()ed Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 17/27] elevate write count over calls to vfs_rename() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 19/27] elevate writer count for do_sys_truncate() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 20/27] elevate write count for do_utimes() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 21/27] elevate write count for do_sys_utime() and touch_atime() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 22/27] sys_mknodat(): elevate write count for vfs_mknod/create() Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 23/27] elevate mnt writers for vfs_unlink() callers Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 25/27] elevate writer count for custom 'struct file' Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 24/27] do_rmdir(): elevate write count Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 26/27] Originally from: Herbert Poetzl <herbert@13thfloor.at> Dave Hansen
2006-07-12 18:17 ` [RFC][PATCH 27/27] honor r/w changes at do_remount() time Dave Hansen
2006-07-13 7:04 ` [RFC][PATCH 00/27] Mount writer count and read-only bind mounts (v4) Ram Pai
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=20060712181714.6C3216FF@localhost.localdomain \
--to=haveblue@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=serue@us.ibm.com \
--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