From 49ad61a78167b46709489f9561320b8a6713918c Mon Sep 17 00:00:00 2001 From: Artem Bityutskiy Date: Thu, 31 May 2012 16:26:13 -0700 Subject: [PATCH] --- yaml --- r: 309726 b: refs/heads/master c: 78491189ddb6d84d4a4abae992ed891a236d0263 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/fat/fatent.c | 7 ++++++- trunk/fs/fat/inode.c | 42 ++++++++++++------------------------------ 3 files changed, 19 insertions(+), 32 deletions(-) diff --git a/[refs] b/[refs] index 935c5f7d8a80..271b32d929b2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 330fe3c4c6509e0418c434b5bcf80e65cffab477 +refs/heads/master: 78491189ddb6d84d4a4abae992ed891a236d0263 diff --git a/trunk/fs/fat/fatent.c b/trunk/fs/fat/fatent.c index 81815487e04d..31f08ab62c56 100644 --- a/trunk/fs/fat/fatent.c +++ b/trunk/fs/fat/fatent.c @@ -310,7 +310,12 @@ void fat_ent_access_init(struct super_block *sb) static void mark_fsinfo_dirty(struct super_block *sb) { - sb->s_dirt = 1; + struct msdos_sb_info *sbi = MSDOS_SB(sb); + + if (sb->s_flags & MS_RDONLY || sbi->fat_bits != 32) + return; + + __mark_inode_dirty(sbi->fsinfo_inode, I_DIRTY_SYNC); } static inline int fat_ent_update_ptr(struct super_block *sb, diff --git a/trunk/fs/fat/inode.c b/trunk/fs/fat/inode.c index 84c602b4bb25..c2973ea5df9a 100644 --- a/trunk/fs/fat/inode.c +++ b/trunk/fs/fat/inode.c @@ -459,37 +459,10 @@ static void fat_evict_inode(struct inode *inode) fat_detach(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 int fat_sync_fs(struct super_block *sb, int wait) -{ - int err = 0; - - if (sb->s_dirt) { - lock_super(sb); - sb->s_dirt = 0; - err = fat_clusters_flush(sb); - unlock_super(sb); - } - - return err; -} - static void fat_put_super(struct super_block *sb) { struct msdos_sb_info *sbi = MSDOS_SB(sb); - if (sb->s_dirt) - fat_write_super(sb); - iput(sbi->fsinfo_inode); iput(sbi->fat_inode); @@ -662,7 +635,18 @@ static int __fat_write_inode(struct inode *inode, int wait) static int fat_write_inode(struct inode *inode, struct writeback_control *wbc) { - return __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); + int err; + + if (inode->i_ino == MSDOS_FSINFO_INO) { + struct super_block *sb = inode->i_sb; + + lock_super(sb); + err = fat_clusters_flush(sb); + unlock_super(sb); + } else + err = __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); + + return err; } int fat_sync_inode(struct inode *inode) @@ -679,8 +663,6 @@ static const struct super_operations fat_sops = { .write_inode = fat_write_inode, .evict_inode = fat_evict_inode, .put_super = fat_put_super, - .write_super = fat_write_super, - .sync_fs = fat_sync_fs, .statfs = fat_statfs, .remount_fs = fat_remount,