From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Morton Subject: Re: [PATCH] 2.5.x write_super is not for syncing Date: Mon, 02 Dec 2002 19:09:52 -0800 Sender: linux-fsdevel-owner@vger.kernel.org Message-ID: <3DEC2080.D801BA13@digeo.com> References: <3DEBF4C8.A68F4F8B@digeo.com> <1038877824.3040.133.camel@tiny> <3DEC0BA4.70E2E344@digeo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Return-path: Received: from digeo-nav01.digeo.com (digeo-nav01.digeo.com [192.168.1.233]) by packet.digeo.com (8.9.3+Sun/8.9.3) with SMTP id TAA21274 for ; Mon, 2 Dec 2002 19:09:53 -0800 (PST) To: Chris Mason , "linux-fsdevel@vger.kernel.org" , "Stephen C. Tweedie" List-Id: linux-fsdevel.vger.kernel.org Andrew Morton wrote: > > These two patches are what I'll be testing tonight for 2.5. > I don't feel inclined to take on the whole sync thing at present. So a minimal fix for this problem is as follows. Against 2.4.20: fs/buffer.c | 2 ++ fs/super.c | 4 ++++ include/linux/fs.h | 1 + 3 files changed, 7 insertions(+) --- linux-akpm/fs/buffer.c~commit-fs Mon Dec 2 18:40:03 2002 +++ linux-akpm-akpm/fs/buffer.c Mon Dec 2 18:41:34 2002 @@ -327,6 +327,8 @@ int fsync_super(struct super_block *sb) lock_super(sb); if (sb->s_dirt && sb->s_op && sb->s_op->write_super) sb->s_op->write_super(sb); + if (sb->s_op && sb->s_op->sync_fs) + sb->s_op->sync_fs(sb); unlock_super(sb); unlock_kernel(); --- linux-akpm/include/linux/fs.h~commit-fs Mon Dec 2 18:40:23 2002 +++ linux-akpm-akpm/include/linux/fs.h Mon Dec 2 18:40:56 2002 @@ -894,6 +894,7 @@ struct super_operations { void (*delete_inode) (struct inode *); void (*put_super) (struct super_block *); void (*write_super) (struct super_block *); + int (*sync_fs) (struct super_block *); void (*write_super_lockfs) (struct super_block *); void (*unlockfs) (struct super_block *); int (*statfs) (struct super_block *, struct statfs *); --- linux-akpm/fs/super.c~commit-fs Mon Dec 2 18:44:01 2002 +++ linux-akpm-akpm/fs/super.c Mon Dec 2 18:44:07 2002 @@ -454,6 +454,8 @@ void sync_supers(kdev_t dev) if (sb) { if (sb->s_dirt) write_super(sb); + if (sb->s_op && sb->s_op->sync_fs) + sb->s_op->sync_fs(sb); drop_super(sb); } return; @@ -467,6 +469,8 @@ restart: spin_unlock(&sb_lock); down_read(&sb->s_umount); write_super(sb); + if (sb->s_op && sb->s_op->sync_fs) + sb->s_op->sync_fs(sb); drop_super(sb); goto restart; } else _ and fs/ext3/super.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-) --- linux-akpm/fs/ext3/super.c~ext3_sync_fs Mon Dec 2 18:45:10 2002 +++ linux-akpm-akpm/fs/ext3/super.c Mon Dec 2 18:46:59 2002 @@ -47,6 +47,8 @@ static void ext3_mark_recovery_complete( static void ext3_clear_journal_err(struct super_block * sb, struct ext3_super_block * es); +static int ext3_sync_fs(struct super_block * sb); + #ifdef CONFIG_JBD_DEBUG int journal_no_write[2]; @@ -454,6 +456,7 @@ static struct super_operations ext3_sops delete_inode: ext3_delete_inode, /* BKL not held. We take it */ put_super: ext3_put_super, /* BKL held */ write_super: ext3_write_super, /* BKL held */ + sync_fs: ext3_sync_fs, write_super_lockfs: ext3_write_super_lockfs, /* BKL not held. Take it */ unlockfs: ext3_unlockfs, /* BKL not held. We take it */ statfs: ext3_statfs, /* BKL held */ @@ -1577,24 +1580,22 @@ int ext3_force_commit(struct super_block * This implicitly triggers the writebehind on sync(). */ -static int do_sync_supers = 0; -MODULE_PARM(do_sync_supers, "i"); -MODULE_PARM_DESC(do_sync_supers, "Write superblocks synchronously"); - void ext3_write_super (struct super_block * sb) { + if (down_trylock(&sb->s_lock) == 0) + BUG(); + sb->s_dirt = 0; + log_start_commit(EXT3_SB(sb)->s_journal, NULL); +} + +static int ext3_sync_fs(struct super_block *sb) +{ tid_t target; - if (down_trylock(&sb->s_lock) == 0) - BUG(); /* aviro detector */ sb->s_dirt = 0; target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); - - if (do_sync_supers) { - unlock_super(sb); - log_wait_commit(EXT3_SB(sb)->s_journal, target); - lock_super(sb); - } + log_wait_commit(EXT3_SB(sb)->s_journal, target); + return 0; } /* _