[PATCH] fat: move fat_clusters_flush() to write_super()
It is overkill to update the FS_INFO whenever modifying prev_free/free_clusters, because those are just a hint. So, this patch uses ->write_super() for updating FS_INFO instead. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
9ded96f24c
commit
a6bf6b211c
3 changed files with 14 additions and 6 deletions
|
@ -476,6 +476,7 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)
|
||||||
sbi->prev_free = entry;
|
sbi->prev_free = entry;
|
||||||
if (sbi->free_clusters != -1)
|
if (sbi->free_clusters != -1)
|
||||||
sbi->free_clusters--;
|
sbi->free_clusters--;
|
||||||
|
sb->s_dirt = 1;
|
||||||
|
|
||||||
cluster[idx_clus] = entry;
|
cluster[idx_clus] = entry;
|
||||||
idx_clus++;
|
idx_clus++;
|
||||||
|
@ -496,6 +497,7 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)
|
||||||
|
|
||||||
/* Couldn't allocate the free entries */
|
/* Couldn't allocate the free entries */
|
||||||
sbi->free_clusters = 0;
|
sbi->free_clusters = 0;
|
||||||
|
sb->s_dirt = 1;
|
||||||
err = -ENOSPC;
|
err = -ENOSPC;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -509,7 +511,6 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)
|
||||||
}
|
}
|
||||||
for (i = 0; i < nr_bhs; i++)
|
for (i = 0; i < nr_bhs; i++)
|
||||||
brelse(bhs[i]);
|
brelse(bhs[i]);
|
||||||
fat_clusters_flush(sb);
|
|
||||||
|
|
||||||
if (err && idx_clus)
|
if (err && idx_clus)
|
||||||
fat_free_clusters(inode, cluster[0]);
|
fat_free_clusters(inode, cluster[0]);
|
||||||
|
@ -542,8 +543,10 @@ int fat_free_clusters(struct inode *inode, int cluster)
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->ent_put(&fatent, FAT_ENT_FREE);
|
ops->ent_put(&fatent, FAT_ENT_FREE);
|
||||||
if (sbi->free_clusters != -1)
|
if (sbi->free_clusters != -1) {
|
||||||
sbi->free_clusters++;
|
sbi->free_clusters++;
|
||||||
|
sb->s_dirt = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) {
|
if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) {
|
||||||
if (sb->s_flags & MS_SYNCHRONOUS) {
|
if (sb->s_flags & MS_SYNCHRONOUS) {
|
||||||
|
@ -605,6 +608,7 @@ int fat_count_free_clusters(struct super_block *sb)
|
||||||
} while (fat_ent_next(sbi, &fatent));
|
} while (fat_ent_next(sbi, &fatent));
|
||||||
}
|
}
|
||||||
sbi->free_clusters = free;
|
sbi->free_clusters = free;
|
||||||
|
sb->s_dirt = 1;
|
||||||
fatent_brelse(&fatent);
|
fatent_brelse(&fatent);
|
||||||
out:
|
out:
|
||||||
unlock_fat(sbi);
|
unlock_fat(sbi);
|
||||||
|
|
|
@ -374,12 +374,17 @@ static void fat_clear_inode(struct inode *inode)
|
||||||
unlock_kernel();
|
unlock_kernel();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fat_put_super(struct super_block *sb)
|
static void fat_write_super(struct super_block *sb)
|
||||||
{
|
{
|
||||||
struct msdos_sb_info *sbi = MSDOS_SB(sb);
|
sb->s_dirt = 0;
|
||||||
|
|
||||||
if (!(sb->s_flags & MS_RDONLY))
|
if (!(sb->s_flags & MS_RDONLY))
|
||||||
fat_clusters_flush(sb);
|
fat_clusters_flush(sb);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fat_put_super(struct super_block *sb)
|
||||||
|
{
|
||||||
|
struct msdos_sb_info *sbi = MSDOS_SB(sb);
|
||||||
|
|
||||||
if (sbi->nls_disk) {
|
if (sbi->nls_disk) {
|
||||||
unload_nls(sbi->nls_disk);
|
unload_nls(sbi->nls_disk);
|
||||||
|
@ -546,6 +551,7 @@ static struct super_operations fat_sops = {
|
||||||
.write_inode = fat_write_inode,
|
.write_inode = fat_write_inode,
|
||||||
.delete_inode = fat_delete_inode,
|
.delete_inode = fat_delete_inode,
|
||||||
.put_super = fat_put_super,
|
.put_super = fat_put_super,
|
||||||
|
.write_super = fat_write_super,
|
||||||
.statfs = fat_statfs,
|
.statfs = fat_statfs,
|
||||||
.clear_inode = fat_clear_inode,
|
.clear_inode = fat_clear_inode,
|
||||||
.remount_fs = fat_remount,
|
.remount_fs = fat_remount,
|
||||||
|
|
|
@ -67,8 +67,6 @@ void fat_clusters_flush(struct super_block *sb)
|
||||||
if (sbi->prev_free != -1)
|
if (sbi->prev_free != -1)
|
||||||
fsinfo->next_cluster = cpu_to_le32(sbi->prev_free);
|
fsinfo->next_cluster = cpu_to_le32(sbi->prev_free);
|
||||||
mark_buffer_dirty(bh);
|
mark_buffer_dirty(bh);
|
||||||
if (sb->s_flags & MS_SYNCHRONOUS)
|
|
||||||
sync_dirty_buffer(bh);
|
|
||||||
}
|
}
|
||||||
brelse(bh);
|
brelse(bh);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue