diff options
| -rw-r--r-- | fs/ext2/super.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 1388802b7803..f9cb54a585ce 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
| @@ -1105,9 +1105,30 @@ failed_sbi: | |||
| 1105 | return ret; | 1105 | return ret; |
| 1106 | } | 1106 | } |
| 1107 | 1107 | ||
| 1108 | static void ext2_clear_super_error(struct super_block *sb) | ||
| 1109 | { | ||
| 1110 | struct buffer_head *sbh = EXT2_SB(sb)->s_sbh; | ||
| 1111 | |||
| 1112 | if (buffer_write_io_error(sbh)) { | ||
| 1113 | /* | ||
| 1114 | * Oh, dear. A previous attempt to write the | ||
| 1115 | * superblock failed. This could happen because the | ||
| 1116 | * USB device was yanked out. Or it could happen to | ||
| 1117 | * be a transient write error and maybe the block will | ||
| 1118 | * be remapped. Nothing we can do but to retry the | ||
| 1119 | * write and hope for the best. | ||
| 1120 | */ | ||
| 1121 | printk(KERN_ERR "EXT2-fs: %s previous I/O error to " | ||
| 1122 | "superblock detected", sb->s_id); | ||
| 1123 | clear_buffer_write_io_error(sbh); | ||
| 1124 | set_buffer_uptodate(sbh); | ||
| 1125 | } | ||
| 1126 | } | ||
| 1127 | |||
| 1108 | static void ext2_commit_super (struct super_block * sb, | 1128 | static void ext2_commit_super (struct super_block * sb, |
| 1109 | struct ext2_super_block * es) | 1129 | struct ext2_super_block * es) |
| 1110 | { | 1130 | { |
| 1131 | ext2_clear_super_error(sb); | ||
| 1111 | es->s_wtime = cpu_to_le32(get_seconds()); | 1132 | es->s_wtime = cpu_to_le32(get_seconds()); |
| 1112 | mark_buffer_dirty(EXT2_SB(sb)->s_sbh); | 1133 | mark_buffer_dirty(EXT2_SB(sb)->s_sbh); |
| 1113 | sb->s_dirt = 0; | 1134 | sb->s_dirt = 0; |
| @@ -1115,6 +1136,7 @@ static void ext2_commit_super (struct super_block * sb, | |||
| 1115 | 1136 | ||
| 1116 | static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es) | 1137 | static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es) |
| 1117 | { | 1138 | { |
| 1139 | ext2_clear_super_error(sb); | ||
| 1118 | es->s_free_blocks_count = cpu_to_le32(ext2_count_free_blocks(sb)); | 1140 | es->s_free_blocks_count = cpu_to_le32(ext2_count_free_blocks(sb)); |
| 1119 | es->s_free_inodes_count = cpu_to_le32(ext2_count_free_inodes(sb)); | 1141 | es->s_free_inodes_count = cpu_to_le32(ext2_count_free_inodes(sb)); |
| 1120 | es->s_wtime = cpu_to_le32(get_seconds()); | 1142 | es->s_wtime = cpu_to_le32(get_seconds()); |
