diff options
author | Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | 2012-05-31 19:26:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-31 20:49:27 -0400 |
commit | 020ac5b6bef15785f9dde9de89d2734ff97da733 (patch) | |
tree | 18724448be398af715d45dea42966bf276d2febb /fs/fat/inode.c | |
parent | 7bc1bac77a69011550ce0613f4a23712a002d7ad (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.c | 12 |
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 | ||
1518 | out_fail: | 1528 | out_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); |