aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fat/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fat/inode.c')
-rw-r--r--fs/fat/inode.c54
1 files changed, 24 insertions, 30 deletions
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index b3d290c1b513..c2973ea5df9a 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -459,37 +459,11 @@ static void fat_evict_inode(struct inode *inode)
459 fat_detach(inode); 459 fat_detach(inode);
460} 460}
461 461
462static void fat_write_super(struct super_block *sb)
463{
464 lock_super(sb);
465 sb->s_dirt = 0;
466
467 if (!(sb->s_flags & MS_RDONLY))
468 fat_clusters_flush(sb);
469 unlock_super(sb);
470}
471
472static int fat_sync_fs(struct super_block *sb, int wait)
473{
474 int err = 0;
475
476 if (sb->s_dirt) {
477 lock_super(sb);
478 sb->s_dirt = 0;
479 err = fat_clusters_flush(sb);
480 unlock_super(sb);
481 }
482
483 return err;
484}
485
486static void fat_put_super(struct super_block *sb) 462static void fat_put_super(struct super_block *sb)
487{ 463{
488 struct msdos_sb_info *sbi = MSDOS_SB(sb); 464 struct msdos_sb_info *sbi = MSDOS_SB(sb);
489 465
490 if (sb->s_dirt) 466 iput(sbi->fsinfo_inode);
491 fat_write_super(sb);
492
493 iput(sbi->fat_inode); 467 iput(sbi->fat_inode);
494 468
495 unload_nls(sbi->nls_disk); 469 unload_nls(sbi->nls_disk);
@@ -661,7 +635,18 @@ retry:
661 635
662static int fat_write_inode(struct inode *inode, struct writeback_control *wbc) 636static int fat_write_inode(struct inode *inode, struct writeback_control *wbc)
663{ 637{
664 return __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 638 int err;
639
640 if (inode->i_ino == MSDOS_FSINFO_INO) {
641 struct super_block *sb = inode->i_sb;
642
643 lock_super(sb);
644 err = fat_clusters_flush(sb);
645 unlock_super(sb);
646 } else
647 err = __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
648
649 return err;
665} 650}
666 651
667int fat_sync_inode(struct inode *inode) 652int fat_sync_inode(struct inode *inode)
@@ -678,8 +663,6 @@ static const struct super_operations fat_sops = {
678 .write_inode = fat_write_inode, 663 .write_inode = fat_write_inode,
679 .evict_inode = fat_evict_inode, 664 .evict_inode = fat_evict_inode,
680 .put_super = fat_put_super, 665 .put_super = fat_put_super,
681 .write_super = fat_write_super,
682 .sync_fs = fat_sync_fs,
683 .statfs = fat_statfs, 666 .statfs = fat_statfs,
684 .remount_fs = fat_remount, 667 .remount_fs = fat_remount,
685 668
@@ -1244,6 +1227,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
1244 void (*setup)(struct super_block *)) 1227 void (*setup)(struct super_block *))
1245{ 1228{
1246 struct inode *root_inode = NULL, *fat_inode = NULL; 1229 struct inode *root_inode = NULL, *fat_inode = NULL;
1230 struct inode *fsinfo_inode = NULL;
1247 struct buffer_head *bh; 1231 struct buffer_head *bh;
1248 struct fat_boot_sector *b; 1232 struct fat_boot_sector *b;
1249 struct msdos_sb_info *sbi; 1233 struct msdos_sb_info *sbi;
@@ -1490,6 +1474,14 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
1490 goto out_fail; 1474 goto out_fail;
1491 MSDOS_I(fat_inode)->i_pos = 0; 1475 MSDOS_I(fat_inode)->i_pos = 0;
1492 sbi->fat_inode = fat_inode; 1476 sbi->fat_inode = fat_inode;
1477
1478 fsinfo_inode = new_inode(sb);
1479 if (!fsinfo_inode)
1480 goto out_fail;
1481 fsinfo_inode->i_ino = MSDOS_FSINFO_INO;
1482 sbi->fsinfo_inode = fsinfo_inode;
1483 insert_inode_hash(fsinfo_inode);
1484
1493 root_inode = new_inode(sb); 1485 root_inode = new_inode(sb);
1494 if (!root_inode) 1486 if (!root_inode)
1495 goto out_fail; 1487 goto out_fail;
@@ -1516,6 +1508,8 @@ out_invalid:
1516 fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem"); 1508 fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem");
1517 1509
1518out_fail: 1510out_fail:
1511 if (fsinfo_inode)
1512 iput(fsinfo_inode);
1519 if (fat_inode) 1513 if (fat_inode)
1520 iput(fat_inode); 1514 iput(fat_inode);
1521 unload_nls(sbi->nls_io); 1515 unload_nls(sbi->nls_io);