We just did a full fs writeout using sync_filesystem before, and if that's not enough for the filesystem it can perform it's own writeout in ->put_super, which many filesystems already do. Move a call to foofs_write_super into every foofs_put_super for now to guarantee identical behaviour until it's cleaned up by the individual filesystem maintainers. Exceptions: - affs already has identical copy & pasted code at the beginning of affs_put_super so no need to do it twice. - xfs does the right thing without it and I have changes pending for the xfs tree touching this are so I don't really need conflicts here.. Signed-off-by: Christoph Hellwig <hch@xxxxxx> Index: linux-2.6/fs/super.c =================================================================== --- linux-2.6.orig/fs/super.c 2009-04-28 17:36:57.097482477 +0200 +++ linux-2.6/fs/super.c 2009-04-28 17:45:43.542489705 +0200 @@ -283,8 +283,6 @@ void generic_shutdown_super(struct super invalidate_inodes(sb); lock_kernel(); - if (sop->write_super && sb->s_dirt) - sop->write_super(sb); if (sop->put_super) sop->put_super(sb); Index: linux-2.6/fs/jffs2/super.c =================================================================== --- linux-2.6.orig/fs/jffs2/super.c 2009-04-28 17:36:57.107482215 +0200 +++ linux-2.6/fs/jffs2/super.c 2009-04-28 17:45:43.542489705 +0200 @@ -174,6 +174,9 @@ static void jffs2_put_super (struct supe D2(printk(KERN_DEBUG "jffs2: jffs2_put_super()\n")); + if (sb->s_dirt) + jffs2_write_super(sb); + mutex_lock(&c->alloc_sem); jffs2_flush_wbuf_pad(c); mutex_unlock(&c->alloc_sem); Index: linux-2.6/fs/bfs/inode.c =================================================================== --- linux-2.6.orig/fs/bfs/inode.c 2009-04-28 17:45:49.156631693 +0200 +++ linux-2.6/fs/bfs/inode.c 2009-04-28 17:52:36.964608992 +0200 @@ -30,6 +30,7 @@ MODULE_LICENSE("GPL"); #define dprintf(x...) #endif +static void bfs_write_super(struct super_block *s); void dump_imap(const char *prefix, struct super_block *s); struct inode *bfs_iget(struct super_block *sb, unsigned long ino) @@ -216,6 +217,9 @@ static void bfs_put_super(struct super_b if (!info) return; + if (s->s_dirt) + bfs_write_super(s); + brelse(info->si_sbh); mutex_destroy(&info->bfs_lock); kfree(info->si_imap); Index: linux-2.6/fs/exofs/super.c =================================================================== --- linux-2.6.orig/fs/exofs/super.c 2009-04-28 17:45:49.232482198 +0200 +++ linux-2.6/fs/exofs/super.c 2009-04-28 17:47:50.303050752 +0200 @@ -258,6 +258,9 @@ static void exofs_put_super(struct super int num_pend; struct exofs_sb_info *sbi = sb->s_fs_info; + if (sb->s_dirt) + exofs_write_super(sb); + /* make sure there are no pending commands */ for (num_pend = atomic_read(&sbi->s_curr_pending); num_pend > 0; num_pend = atomic_read(&sbi->s_curr_pending)) { Index: linux-2.6/fs/ext2/super.c =================================================================== --- linux-2.6.orig/fs/ext2/super.c 2009-04-28 17:45:49.245482316 +0200 +++ linux-2.6/fs/ext2/super.c 2009-04-28 17:48:34.348609216 +0200 @@ -114,6 +114,9 @@ static void ext2_put_super (struct super int i; struct ext2_sb_info *sbi = EXT2_SB(sb); + if (sb->s_dirt) + ext2_write_super(sb); + ext2_xattr_put_super(sb); if (!(sb->s_flags & MS_RDONLY)) { struct ext2_super_block *es = sbi->s_es; Index: linux-2.6/fs/ext4/super.c =================================================================== --- linux-2.6.orig/fs/ext4/super.c 2009-04-28 17:45:49.307482385 +0200 +++ linux-2.6/fs/ext4/super.c 2009-04-28 17:48:45.574609042 +0200 @@ -563,6 +563,9 @@ static void ext4_put_super(struct super_ struct ext4_super_block *es = sbi->s_es; int i, err; + if (sb->s_dirt) + ext4_write_super(sb); + ext4_mb_release(sb); ext4_ext_release(sb); ext4_xattr_put_super(sb); Index: linux-2.6/fs/fat/inode.c =================================================================== --- linux-2.6.orig/fs/fat/inode.c 2009-04-28 17:45:49.321482142 +0200 +++ linux-2.6/fs/fat/inode.c 2009-04-28 17:49:17.807519261 +0200 @@ -451,6 +451,9 @@ static void fat_put_super(struct super_b { struct msdos_sb_info *sbi = MSDOS_SB(sb); + if (sb->s_dirt) + fat_write_super(sb); + if (sbi->nls_disk) { unload_nls(sbi->nls_disk); sbi->nls_disk = NULL; Index: linux-2.6/fs/hfs/super.c =================================================================== --- linux-2.6.orig/fs/hfs/super.c 2009-04-28 17:45:49.334482400 +0200 +++ linux-2.6/fs/hfs/super.c 2009-04-28 17:49:43.405483936 +0200 @@ -65,6 +65,8 @@ static void hfs_write_super(struct super */ static void hfs_put_super(struct super_block *sb) { + if (sb->s_dirt) + hfs_write_super(sb); hfs_mdb_close(sb); /* release the MDB's resources */ hfs_mdb_put(sb); Index: linux-2.6/fs/hfsplus/super.c =================================================================== --- linux-2.6.orig/fs/hfsplus/super.c 2009-04-28 17:45:49.394482285 +0200 +++ linux-2.6/fs/hfsplus/super.c 2009-04-28 17:50:12.485520947 +0200 @@ -199,6 +199,8 @@ static void hfsplus_put_super(struct sup dprint(DBG_SUPER, "hfsplus_put_super\n"); if (!sb->s_fs_info) return; + if (sb->s_dirt) + hfsplus_write_super(sb); if (!(sb->s_flags & MS_RDONLY) && HFSPLUS_SB(sb).s_vhdr) { struct hfsplus_vh *vhdr = HFSPLUS_SB(sb).s_vhdr; Index: linux-2.6/fs/nilfs2/super.c =================================================================== --- linux-2.6.orig/fs/nilfs2/super.c 2009-04-28 17:45:49.459482526 +0200 +++ linux-2.6/fs/nilfs2/super.c 2009-04-28 17:51:02.967608854 +0200 @@ -65,6 +65,7 @@ MODULE_DESCRIPTION("A New Implementation "(NILFS)"); MODULE_LICENSE("GPL"); +static void nilfs_write_super(struct super_block *sb); static int nilfs_remount(struct super_block *sb, int *flags, char *data); static int test_exclusive_mount(struct file_system_type *fs_type, struct block_device *bdev, int flags); @@ -315,6 +316,9 @@ static void nilfs_put_super(struct super struct nilfs_sb_info *sbi = NILFS_SB(sb); struct the_nilfs *nilfs = sbi->s_nilfs; + if (sb->s_dirt) + nilfs_write_super(sb); + nilfs_detach_segment_constructor(sbi); if (!(sb->s_flags & MS_RDONLY)) { Index: linux-2.6/fs/reiserfs/super.c =================================================================== --- linux-2.6.orig/fs/reiserfs/super.c 2009-04-28 17:45:49.535482282 +0200 +++ linux-2.6/fs/reiserfs/super.c 2009-04-28 17:53:09.151484040 +0200 @@ -470,6 +470,9 @@ static void reiserfs_put_super(struct su struct reiserfs_transaction_handle th; th.t_trans_id = 0; + if (s->s_dirt) + reiserfs_write_super(s); + /* change file system state to current state if it was mounted with read-write permissions */ if (!(s->s_flags & MS_RDONLY)) { if (!journal_begin(&th, s, 10)) { Index: linux-2.6/fs/sysv/inode.c =================================================================== --- linux-2.6.orig/fs/sysv/inode.c 2009-04-28 17:45:49.590482230 +0200 +++ linux-2.6/fs/sysv/inode.c 2009-04-28 17:51:54.482515784 +0200 @@ -72,6 +72,9 @@ static void sysv_put_super(struct super_ { struct sysv_sb_info *sbi = SYSV_SB(sb); + if (sb->s_dirt) + sysv_write_super(sb); + if (!(sb->s_flags & MS_RDONLY)) { /* XXX ext2 also updates the state here */ mark_buffer_dirty(sbi->s_bh1); Index: linux-2.6/fs/ufs/super.c =================================================================== --- linux-2.6.orig/fs/ufs/super.c 2009-04-28 17:45:49.635482649 +0200 +++ linux-2.6/fs/ufs/super.c 2009-04-28 17:52:13.106608942 +0200 @@ -1152,6 +1152,9 @@ static void ufs_put_super(struct super_b UFSD("ENTER\n"); + if (sb->s_dirt) + ufs_write_super(sb); + if (!(sb->s_flags & MS_RDONLY)) ufs_put_super_internal(sb); -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html