public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] FAT: optimize FSINFO writeback
@ 2009-06-30 20:02 steve
  2009-06-30 20:57 ` OGAWA Hirofumi
  0 siblings, 1 reply; 5+ messages in thread
From: steve @ 2009-06-30 20:02 UTC (permalink / raw)
  To: hirofumi, linux-kernel; +Cc: Steven J. Magnani

Only write the FSINFO block back to disk when its contents change.
This optimization can be important when the underlying physical media
can wear out, i.e. Flash.

Signed-off-by: Steven J. Magnani <steve@digidescorp.com>
---
diff -uprN a/fs/fat/misc.c b/fs/fat/misc.c
--- a/fs/fat/misc.c	2009-06-29 11:12:40.000000000 -0500
+++ b/fs/fat/misc.c	2009-06-29 11:46:45.000000000 -0500
@@ -61,11 +61,25 @@ void fat_clusters_flush(struct super_blo
 		       le32_to_cpu(fsinfo->signature2),
 		       sbi->fsinfo_sector);
 	} else {
-		if (sbi->free_clusters != -1)
-			fsinfo->free_clusters = cpu_to_le32(sbi->free_clusters);
-		if (sbi->prev_free != -1)
-			fsinfo->next_cluster = cpu_to_le32(sbi->prev_free);
-		mark_buffer_dirty(bh);
+		char write_needed = 0;
+		__le32 le_value;
+
+		if (sbi->free_clusters != -1) {
+			le_value = cpu_to_le32(sbi->free_clusters);
+			if (fsinfo->free_clusters != le_value) {
+				fsinfo->free_clusters = le_value;
+				write_needed = 1;
+			}
+		}
+		if (sbi->prev_free != -1) {
+			le_value = cpu_to_le32(sbi->prev_free);
+			if (fsinfo->next_cluster != le_value) {
+				fsinfo->next_cluster = le_value;
+				write_needed = 1;
+			}
+		}
+		if (write_needed)
+			mark_buffer_dirty(bh);
 	}
 	brelse(bh);
 }


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-07-01 13:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-30 20:02 [PATCH] FAT: optimize FSINFO writeback steve
2009-06-30 20:57 ` OGAWA Hirofumi
2009-06-30 22:19   ` Steven J. Magnani
2009-07-01  0:28     ` OGAWA Hirofumi
2009-07-01 13:07       ` Steven J. Magnani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox