diff options
Diffstat (limited to 'fs/ext3/super.c')
-rw-r--r-- | fs/ext3/super.c | 24 |
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 | ||