Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6bf6b21 authored by OGAWA Hirofumi's avatar OGAWA Hirofumi Committed by Linus Torvalds
Browse files

[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: default avatarOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 9ded96f2
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -476,6 +476,7 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)
				sbi->prev_free = entry;
				if (sbi->free_clusters != -1)
					sbi->free_clusters--;
				sb->s_dirt = 1;

				cluster[idx_clus] = entry;
				idx_clus++;
@@ -496,6 +497,7 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)

	/* Couldn't allocate the free entries */
	sbi->free_clusters = 0;
	sb->s_dirt = 1;
	err = -ENOSPC;

out:
@@ -509,7 +511,6 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)
	}
	for (i = 0; i < nr_bhs; i++)
		brelse(bhs[i]);
	fat_clusters_flush(sb);

	if (err && idx_clus)
		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);
		if (sbi->free_clusters != -1)
		if (sbi->free_clusters != -1) {
			sbi->free_clusters++;
			sb->s_dirt = 1;
		}

		if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) {
			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));
	}
	sbi->free_clusters = free;
	sb->s_dirt = 1;
	fatent_brelse(&fatent);
out:
	unlock_fat(sbi);
+8 −2
Original line number Diff line number Diff line
@@ -374,12 +374,17 @@ static void fat_clear_inode(struct inode *inode)
	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))
		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) {
		unload_nls(sbi->nls_disk);
@@ -546,6 +551,7 @@ static struct super_operations fat_sops = {
	.write_inode	= fat_write_inode,
	.delete_inode	= fat_delete_inode,
	.put_super	= fat_put_super,
	.write_super	= fat_write_super,
	.statfs		= fat_statfs,
	.clear_inode	= fat_clear_inode,
	.remount_fs	= fat_remount,
+0 −2
Original line number Diff line number Diff line
@@ -67,8 +67,6 @@ void fat_clusters_flush(struct super_block *sb)
		if (sbi->prev_free != -1)
			fsinfo->next_cluster = cpu_to_le32(sbi->prev_free);
		mark_buffer_dirty(bh);
		if (sb->s_flags & MS_SYNCHRONOUS)
			sync_dirty_buffer(bh);
	}
	brelse(bh);
}