OSDN Git Service

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[uclinux-h8/linux.git] / fs / fat / inode.c
index 7edfaad..a3d81eb 100644 (file)
@@ -459,37 +459,11 @@ 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);
 
        unload_nls(sbi->nls_disk);
@@ -661,7 +635,18 @@ retry:
 
 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)
@@ -678,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,
 
@@ -1243,6 +1226,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
                   void (*setup)(struct super_block *))
 {
        struct inode *root_inode = NULL, *fat_inode = NULL;
+       struct inode *fsinfo_inode = NULL;
        struct buffer_head *bh;
        struct fat_boot_sector *b;
        struct msdos_sb_info *sbi;
@@ -1489,6 +1473,14 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
                goto out_fail;
        MSDOS_I(fat_inode)->i_pos = 0;
        sbi->fat_inode = fat_inode;
+
+       fsinfo_inode = new_inode(sb);
+       if (!fsinfo_inode)
+               goto out_fail;
+       fsinfo_inode->i_ino = MSDOS_FSINFO_INO;
+       sbi->fsinfo_inode = fsinfo_inode;
+       insert_inode_hash(fsinfo_inode);
+
        root_inode = new_inode(sb);
        if (!root_inode)
                goto out_fail;
@@ -1515,6 +1507,8 @@ out_invalid:
                fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem");
 
 out_fail:
+       if (fsinfo_inode)
+               iput(fsinfo_inode);
        if (fat_inode)
                iput(fat_inode);
        unload_nls(sbi->nls_io);