aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fat/inode.c
diff options
context:
space:
mode:
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2012-05-31 19:26:12 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-31 20:49:27 -0400
commit020ac5b6bef15785f9dde9de89d2734ff97da733 (patch)
tree18724448be398af715d45dea42966bf276d2febb /fs/fat/inode.c
parent7bc1bac77a69011550ce0613f4a23712a002d7ad (diff)
fat: introduce special inode for managing the FSINFO block
This is patchset makes fatfs stop using the VFS '->write_super()' method for writing out the FSINFO block. The final goal is to get rid of the 'sync_supers()' kernel thread. This kernel thread wakes up every 5 seconds (by default) and calls '->write_super()' for all mounted file-systems. And the bad thing is that this is done even if all the superblocks are clean. Moreover, some file-systems do not even need this end they do not register the '->write_super()' method at all (e.g., btrfs). So 'sync_supers()' most often just generates useless wake-ups and wastes power. I am trying to make all file-systems independent of '->write_super()' and plan to remove 'sync_supers()' and '->write_super' completely once there are no more users. The '->write_supers()' method is mostly used by baroque file-systems like hfs, udf, etc. Modern file-systems like btrfs and xfs do not use it. This justifies removing this stuff from VFS completely and make every FS self-manage own superblock. Tested with xfstests. This patch: Preparation for further changes. It introduces a special inode ('fsinfo_inode') in FAT file-system which we'll later use for managing the FSINFO block. Note, this there is already one special inode ('fat_inode') which is used for managing the FAT tables. Introduce new 'MSDOS_FSINFO_INO' constant for this special inode. It is safe to do because FAT file-system does not store inode numbers on the media but generates them run-time. I've also cleaned up the comment to existing 'MSDOS_ROOT_INO' constant, while on it. Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Cc: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/fat/inode.c')
-rw-r--r--fs/fat/inode.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index b3d290c1b513..84c602b4bb25 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -490,6 +490,7 @@ static void fat_put_super(struct super_block *sb)
490 if (sb->s_dirt) 490 if (sb->s_dirt)
491 fat_write_super(sb); 491 fat_write_super(sb);
492 492
493 iput(sbi->fsinfo_inode);
493 iput(sbi->fat_inode); 494 iput(sbi->fat_inode);
494 495
495 unload_nls(sbi->nls_disk); 496 unload_nls(sbi->nls_disk);
@@ -1244,6 +1245,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
1244 void (*setup)(struct super_block *)) 1245 void (*setup)(struct super_block *))
1245{ 1246{
1246 struct inode *root_inode = NULL, *fat_inode = NULL; 1247 struct inode *root_inode = NULL, *fat_inode = NULL;
1248 struct inode *fsinfo_inode = NULL;
1247 struct buffer_head *bh; 1249 struct buffer_head *bh;
1248 struct fat_boot_sector *b; 1250 struct fat_boot_sector *b;
1249 struct msdos_sb_info *sbi; 1251 struct msdos_sb_info *sbi;
@@ -1490,6 +1492,14 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
1490 goto out_fail; 1492 goto out_fail;
1491 MSDOS_I(fat_inode)->i_pos = 0; 1493 MSDOS_I(fat_inode)->i_pos = 0;
1492 sbi->fat_inode = fat_inode; 1494 sbi->fat_inode = fat_inode;
1495
1496 fsinfo_inode = new_inode(sb);
1497 if (!fsinfo_inode)
1498 goto out_fail;
1499 fsinfo_inode->i_ino = MSDOS_FSINFO_INO;
1500 sbi->fsinfo_inode = fsinfo_inode;
1501 insert_inode_hash(fsinfo_inode);
1502
1493 root_inode = new_inode(sb); 1503 root_inode = new_inode(sb);
1494 if (!root_inode) 1504 if (!root_inode)
1495 goto out_fail; 1505 goto out_fail;
@@ -1516,6 +1526,8 @@ out_invalid:
1516 fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem"); 1526 fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem");
1517 1527
1518out_fail: 1528out_fail:
1529 if (fsinfo_inode)
1530 iput(fsinfo_inode);
1519 if (fat_inode) 1531 if (fat_inode)
1520 iput(fat_inode); 1532 iput(fat_inode);
1521 unload_nls(sbi->nls_io); 1533 unload_nls(sbi->nls_io);