diff --git a/fs/minix/inode.c b/fs/minix/inode.c index da8bdd1712a7..02b9cbdd3bf7 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -42,17 +42,25 @@ static void minix_put_super(struct super_block *sb) { int i; struct minix_sb_info *sbi = minix_sb(sb); + struct buffer_head *sbh = sbi->s_sbh; if (!sb_rdonly(sb)) { if (sbi->s_version != MINIX_V3) /* s_state is now out from V3 sb */ sbi->s_ms->s_state = sbi->s_mount_state; - mark_buffer_dirty(sbi->s_sbh); + + if (buffer_write_io_error(sbh) || !buffer_uptodate(sbh)) { + clear_buffer_write_io_error(sbh); + set_buffer_uptodate(sbh); + printk("MINIX-fs warning: superblock detected " + "previous I/O error\n"); + } + mark_buffer_dirty(sbh); } for (i = 0; i < sbi->s_imap_blocks; i++) brelse(sbi->s_imap[i]); for (i = 0; i < sbi->s_zmap_blocks; i++) brelse(sbi->s_zmap[i]); - brelse (sbi->s_sbh); + brelse (sbh); kfree(sbi->s_imap); sb->s_fs_info = NULL; kfree(sbi);