From: Christoph Hellwig <hch@lst.de>
To: viro@zeniv.linux.org.uk
Cc: linux-fsdevel@vger.kernel.org
Subject: [PATCH 2/2] ->write_super lock_super pushdown
Date: Mon, 11 May 2009 23:35:03 +0200 [thread overview]
Message-ID: <20090511213503.GB19326@lst.de> (raw)
Push down lock_super into ->write_super instances and remove it from the
caller.
Following filesystem don't need ->s_lock in ->write_super and are skipped:
* bfs, nilfs2 - no other uses of s_lock and have internal locks in
->write_super
* ext2 - uses BKL in ext2_write_super and has internal calls without s_lock
* reiserfs - no other uses of s_lock as has reiserfs_write_lock (BKL) in
->write_super
* xfs - no other uses of s_lock and uses internal lock (buffer lock on
superblock buffer) to serialize ->write_super. Also xfs_fs_write_super
is superflous and will go away in the next merge window
Signed-off-by: Christoph Hellwig <hch@lst.de>
Index: vfs-2.6/fs/ext4/super.c
===================================================================
--- vfs-2.6.orig/fs/ext4/super.c 2009-05-11 23:26:24.844787452 +0200
+++ vfs-2.6/fs/ext4/super.c 2009-05-11 23:28:12.925808532 +0200
@@ -66,6 +66,7 @@ static int ext4_remount(struct super_blo
static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf);
static int ext4_unfreeze(struct super_block *sb);
static void ext4_write_super(struct super_block *sb);
+static void ext4_write_super_locked(struct super_block *sb);
static int ext4_freeze(struct super_block *sb);
@@ -566,7 +567,7 @@ static void ext4_put_super(struct super_
lock_super(sb);
lock_kernel();
if (sb->s_dirt)
- ext4_write_super(sb);
+ ext4_write_super_locked(sb);
ext4_mb_release(sb);
ext4_ext_release(sb);
@@ -3273,7 +3274,7 @@ int ext4_force_commit(struct super_block
* point. (We can probably nuke this function altogether, and remove
* any mention to sb->s_dirt in all of fs/ext4; eventual cleanup...)
*/
-static void ext4_write_super(struct super_block *sb)
+static void ext4_write_super_locked(struct super_block *sb)
{
if (EXT4_SB(sb)->s_journal) {
if (mutex_trylock(&sb->s_lock) != 0)
@@ -3284,6 +3285,13 @@ static void ext4_write_super(struct supe
}
}
+static void ext4_write_super(struct super_block *sb)
+{
+ lock_super(sb);
+ ext4_write_super_locked(sb);
+ unlock_super(sb);
+}
+
static int ext4_sync_fs(struct super_block *sb, int wait)
{
int ret = 0;
Index: vfs-2.6/fs/fat/inode.c
===================================================================
--- vfs-2.6.orig/fs/fat/inode.c 2009-05-11 23:26:24.862786880 +0200
+++ vfs-2.6/fs/fat/inode.c 2009-05-11 23:28:12.925808532 +0200
@@ -441,10 +441,12 @@ static void fat_clear_inode(struct inode
static void fat_write_super(struct super_block *sb)
{
+ lock_super(sb);
sb->s_dirt = 0;
if (!(sb->s_flags & MS_RDONLY))
fat_clusters_flush(sb);
+ unlock_super(sb);
}
static void fat_put_super(struct super_block *sb)
Index: vfs-2.6/fs/super.c
===================================================================
--- vfs-2.6.orig/fs/super.c 2009-05-11 23:26:24.882820644 +0200
+++ vfs-2.6/fs/super.c 2009-05-11 23:28:12.926784214 +0200
@@ -420,10 +420,8 @@ restart:
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
- lock_super(sb);
if (sb->s_root && sb->s_dirt)
sb->s_op->write_super(sb);
- unlock_super(sb);
up_read(&sb->s_umount);
spin_lock(&sb_lock);
Index: vfs-2.6/fs/sysv/inode.c
===================================================================
--- vfs-2.6.orig/fs/sysv/inode.c 2009-05-11 23:26:24.907820404 +0200
+++ vfs-2.6/fs/sysv/inode.c 2009-05-11 23:28:12.926784214 +0200
@@ -37,6 +37,7 @@ static void sysv_write_super(struct supe
struct sysv_sb_info *sbi = SYSV_SB(sb);
unsigned long time = get_seconds(), old_time;
+ lock_super(sb);
lock_kernel();
if (sb->s_flags & MS_RDONLY)
goto clean;
@@ -56,6 +57,7 @@ static void sysv_write_super(struct supe
clean:
sb->s_dirt = 0;
unlock_kernel();
+ unlock_super(sb);
}
static int sysv_remount(struct super_block *sb, int *flags, char *data)
Index: vfs-2.6/fs/ufs/super.c
===================================================================
--- vfs-2.6.orig/fs/ufs/super.c 2009-05-11 23:26:24.931820805 +0200
+++ vfs-2.6/fs/ufs/super.c 2009-05-11 23:28:12.927812907 +0200
@@ -1131,6 +1131,7 @@ static void ufs_write_super(struct super
struct ufs_super_block_third * usb3;
unsigned flags;
+ lock_super(sb);
lock_kernel();
UFSD("ENTER\n");
flags = UFS_SB(sb)->s_flags;
@@ -1150,6 +1151,7 @@ static void ufs_write_super(struct super
sb->s_dirt = 0;
UFSD("EXIT\n");
unlock_kernel();
+ unlock_super(sb);
}
static void ufs_put_super(struct super_block *sb)
Index: vfs-2.6/fs/affs/super.c
===================================================================
--- vfs-2.6.orig/fs/affs/super.c 2009-05-11 23:26:24.949786640 +0200
+++ vfs-2.6/fs/affs/super.c 2009-05-11 23:28:12.928818062 +0200
@@ -54,6 +54,7 @@ affs_write_super(struct super_block *sb)
int clean = 2;
struct affs_sb_info *sbi = AFFS_SB(sb);
+ lock_super(sb);
if (!(sb->s_flags & MS_RDONLY)) {
// if (sbi->s_bitmap[i].bm_bh) {
// if (buffer_dirty(sbi->s_bitmap[i].bm_bh)) {
@@ -66,6 +67,7 @@ affs_write_super(struct super_block *sb)
sb->s_dirt = !clean; /* redo until bitmap synced */
} else
sb->s_dirt = 0;
+ unlock_super(sb);
pr_debug("AFFS: write_super() at %lu, clean=%d\n", get_seconds(), clean);
}
Index: vfs-2.6/fs/exofs/super.c
===================================================================
--- vfs-2.6.orig/fs/exofs/super.c 2009-05-11 23:26:24.971786995 +0200
+++ vfs-2.6/fs/exofs/super.c 2009-05-11 23:28:12.929808342 +0200
@@ -214,6 +214,7 @@ static void exofs_write_super(struct sup
return;
}
+ lock_super(sb);
lock_kernel();
sbi = sb->s_fs_info;
fscb->s_nextid = cpu_to_le64(sbi->s_nextid);
@@ -246,6 +247,7 @@ out:
if (or)
osd_end_request(or);
unlock_kernel();
+ unlock_super(sb);
kfree(fscb);
}
Index: vfs-2.6/fs/hfs/super.c
===================================================================
--- vfs-2.6.orig/fs/hfs/super.c 2009-05-11 23:26:24.990787179 +0200
+++ vfs-2.6/fs/hfs/super.c 2009-05-11 23:28:12.930808120 +0200
@@ -49,11 +49,13 @@ MODULE_LICENSE("GPL");
*/
static void hfs_write_super(struct super_block *sb)
{
+ lock_super(sb);
sb->s_dirt = 0;
- if (sb->s_flags & MS_RDONLY)
- return;
+
/* sync everything to the buffers */
- hfs_mdb_commit(sb);
+ if (!(sb->s_flags & MS_RDONLY))
+ hfs_mdb_commit(sb);
+ unlock_super(sb);
}
/*
Index: vfs-2.6/fs/hfsplus/super.c
===================================================================
--- vfs-2.6.orig/fs/hfsplus/super.c 2009-05-11 23:26:25.008788283 +0200
+++ vfs-2.6/fs/hfsplus/super.c 2009-05-11 23:28:12.930808120 +0200
@@ -157,10 +157,12 @@ static void hfsplus_write_super(struct s
struct hfsplus_vh *vhdr = HFSPLUS_SB(sb).s_vhdr;
dprint(DBG_SUPER, "hfsplus_write_super\n");
+
+ lock_super(sb);
sb->s_dirt = 0;
if (sb->s_flags & MS_RDONLY)
/* warn? */
- return;
+ goto out;
vhdr->free_blocks = cpu_to_be32(HFSPLUS_SB(sb).free_blocks);
vhdr->next_alloc = cpu_to_be32(HFSPLUS_SB(sb).next_alloc);
@@ -192,6 +194,8 @@ static void hfsplus_write_super(struct s
}
HFSPLUS_SB(sb).flags &= ~HFSPLUS_SB_WRITEBACKUP;
}
+ out:
+ unlock_super(sb);
}
static void hfsplus_put_super(struct super_block *sb)
Index: vfs-2.6/fs/jffs2/super.c
===================================================================
--- vfs-2.6.orig/fs/jffs2/super.c 2009-05-11 23:26:25.035786621 +0200
+++ vfs-2.6/fs/jffs2/super.c 2009-05-11 23:28:12.931808177 +0200
@@ -56,15 +56,18 @@ static void jffs2_i_init_once(void *foo)
static void jffs2_write_super(struct super_block *sb)
{
struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
+
+ lock_super(sb);
sb->s_dirt = 0;
- if (sb->s_flags & MS_RDONLY)
- return;
+ if (!(sb->s_flags & MS_RDONLY)) {
+ D1(printk(KERN_DEBUG "jffs2_write_super()\n"));
+ jffs2_garbage_collect_trigger(c);
+ jffs2_erase_pending_blocks(c, 0);
+ jffs2_flush_wbuf_gc(c, 0);
+ }
- D1(printk(KERN_DEBUG "jffs2_write_super()\n"));
- jffs2_garbage_collect_trigger(c);
- jffs2_erase_pending_blocks(c, 0);
- jffs2_flush_wbuf_gc(c, 0);
+ unlock_super(sb);
}
static int jffs2_sync_fs(struct super_block *sb, int wait)
Index: vfs-2.6/fs/sync.c
===================================================================
--- vfs-2.6.orig/fs/sync.c 2009-05-11 23:28:41.043659008 +0200
+++ vfs-2.6/fs/sync.c 2009-05-11 23:29:04.202661387 +0200
@@ -33,10 +33,8 @@ static int __sync_filesystem(struct supe
else
sync_quota_sb(sb, -1);
sync_inodes_sb(sb, wait);
- lock_super(sb);
if (sb->s_dirt && sb->s_op->write_super)
sb->s_op->write_super(sb);
- unlock_super(sb);
if (sb->s_op->sync_fs)
sb->s_op->sync_fs(sb, wait);
return __sync_blockdev(sb->s_bdev, wait);
@@ -164,10 +162,8 @@ int file_fsync(struct file *filp, struct
/* sync the superblock to buffers */
sb = inode->i_sb;
- lock_super(sb);
if (sb->s_dirt && sb->s_op->write_super)
sb->s_op->write_super(sb);
- unlock_super(sb);
/* .. finally sync the buffers to disk */
err = sync_blockdev(sb->s_bdev);
next reply other threads:[~2009-05-11 21:35 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-11 21:35 Christoph Hellwig [this message]
2009-05-12 4:12 ` [PATCH 2/2] ->write_super lock_super pushdown Al Viro
2009-05-12 10:10 ` Boaz Harrosh
2009-05-12 13:25 ` Christoph Hellwig
2009-05-12 13:40 ` Al Viro
-- strict thread matches above, loose matches on Subject: below --
2009-05-06 20:16 Christoph Hellwig
2009-05-06 20:36 ` Christoph Hellwig
2009-05-06 22:38 ` Al Viro
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=20090511213503.GB19326@lst.de \
--to=hch@lst.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=viro@zeniv.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.