--- a/fs/fat/cache.c 2004-11-18 19:42:41.701778200 +0100 +++ b/fs/fat/cache.c 2004-11-18 18:40:25.000000000 +0100 @@ -271,6 +271,7 @@ mark_buffer_dirty(bh2); } mark_buffer_dirty(bh); + for (copy = 1; copy < sbi->fats; copy++) { b = sbi->fat_start + (first >> sb->s_blocksize_bits) + sbi->fat_length * copy; --- a/fs/fat/dir.c 2004-11-18 19:42:41.704777744 +0100 +++ b/fs/fat/dir.c 2004-11-18 14:36:44.000000000 +0100 @@ -736,6 +736,7 @@ { struct buffer_head *bh; struct msdos_dir_entry *de; + struct super_block *sb; __le16 date, time; bh = fat_extend_dir(dir); @@ -764,6 +765,11 @@ dir->i_atime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; mark_inode_dirty(dir); + sb = dir->i_sb; + + if (sb->s_flags & MS_SYNCHRONOUS) + sync_dirty_buffer(bh); + return 0; } --- a/fs/fat/file.c 2004-10-18 23:53:44.000000000 +0200 +++ b/fs/fat/file.c 2004-11-18 14:57:03.000000000 +0100 @@ -74,21 +74,34 @@ { struct inode *inode = filp->f_dentry->d_inode; int retval; + struct super_block *sb = inode->i_sb; + struct buffer_head *bh = NULL; retval = generic_file_write(filp, buf, count, ppos); if (retval > 0) { inode->i_mtime = inode->i_ctime = CURRENT_TIME; MSDOS_I(inode)->i_attrs |= ATTR_ARCH; mark_inode_dirty(inode); + if (sb->s_flags & MS_SYNCHRONOUS) { + bh = sb_bread(sb, MSDOS_SB(sb)->fsinfo_sector); + if (bh != NULL) { + sync_dirty_buffer(bh); + brelse(bh); + } else { + BUG_ON(1); + } + } } return retval; } void fat_truncate(struct inode *inode) { + struct super_block *sb = inode->i_sb; struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb); const unsigned int cluster_size = sbi->cluster_size; int nr_clusters; + struct buffer_head *bh = NULL; /* * This protects against truncating a file bigger than it was then @@ -105,4 +118,8 @@ unlock_kernel(); inode->i_ctime = inode->i_mtime = CURRENT_TIME; mark_inode_dirty(inode); + if (sb->s_flags & MS_SYNCHRONOUS) { + bh = sb_bread(sb, sbi->fsinfo_sector); + sync_dirty_buffer(bh); + } } --- a/fs/fat/inode.c 2004-11-18 19:42:41.710776832 +0100 +++ b/fs/fat/inode.c 2004-11-18 15:00:55.000000000 +0100 @@ -1273,8 +1273,12 @@ } spin_unlock(&sbi->inode_hash_lock); mark_buffer_dirty(bh); - brelse(bh); unlock_kernel(); + + if (sb->s_flags & MS_SYNCHRONOUS) + sync_dirty_buffer(bh); + brelse(bh); + return 0; }