aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext3/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext3/super.c')
-rw-r--r--fs/ext3/super.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
index 5dbf4dba03c4..3ef272488ac9 100644
--- a/fs/ext3/super.c
+++ b/fs/ext3/super.c
@@ -2361,6 +2361,21 @@ static int ext3_commit_super(struct super_block *sb,
2361 2361
2362 if (!sbh) 2362 if (!sbh)
2363 return error; 2363 return error;
2364
2365 if (buffer_write_io_error(sbh)) {
2366 /*
2367 * Oh, dear. A previous attempt to write the
2368 * superblock failed. This could happen because the
2369 * USB device was yanked out. Or it could happen to
2370 * be a transient write error and maybe the block will
2371 * be remapped. Nothing we can do but to retry the
2372 * write and hope for the best.
2373 */
2374 ext3_msg(sb, KERN_ERR, "previous I/O error to "
2375 "superblock detected");
2376 clear_buffer_write_io_error(sbh);
2377 set_buffer_uptodate(sbh);
2378 }
2364 /* 2379 /*
2365 * If the file system is mounted read-only, don't update the 2380 * If the file system is mounted read-only, don't update the
2366 * superblock write time. This avoids updating the superblock 2381 * superblock write time. This avoids updating the superblock
@@ -2377,8 +2392,15 @@ static int ext3_commit_super(struct super_block *sb,
2377 es->s_free_inodes_count = cpu_to_le32(ext3_count_free_inodes(sb)); 2392 es->s_free_inodes_count = cpu_to_le32(ext3_count_free_inodes(sb));
2378 BUFFER_TRACE(sbh, "marking dirty"); 2393 BUFFER_TRACE(sbh, "marking dirty");
2379 mark_buffer_dirty(sbh); 2394 mark_buffer_dirty(sbh);
2380 if (sync) 2395 if (sync) {
2381 error = sync_dirty_buffer(sbh); 2396 error = sync_dirty_buffer(sbh);
2397 if (buffer_write_io_error(sbh)) {
2398 ext3_msg(sb, KERN_ERR, "I/O error while writing "
2399 "superblock");
2400 clear_buffer_write_io_error(sbh);
2401 set_buffer_uptodate(sbh);
2402 }
2403 }
2382 return error; 2404 return error;
2383} 2405}
2384 2406