jbd: test BH_Write_EIO to detect errors on metadata buffers
PATCH 1/1 jbd: test BH_Write_EIO to detect errors on metadata buffers
__try_to_free_cp_buf(), __process_buffer(), and __wait_cp_io() test BH_Uptodate flag to detect write I/O errors on metadata buffers. But by commit 95450f5a7e53d5752ce1a0d0b8282e10fe745ae0 "ext3: don't read inode block if the buffer has a write error"(*), BH_Uptodate flag can be set to inode buffers with BH_Write_EIO in order to avoid reading old inode data. So now, we have to test BH_Write_EIO flag of checkpointing inode buffers instead of BH_Uptodate. This patch does it.
(*) http://lkml.org/lkml/2008/6/23/126
This patch depends on the following patch set in -mm:
#1 jbd: abort when failed to log metadata buffers
http://lkml.org/lkml/2008/7/24/160
#2 jbd: fix error handling for checkpoint io
http://lkml.org/lkml/2008/7/24/163
#3 ext3: add checks for errors from jbd
http://lkml.org/lkml/2008/7/29/539
#4 jbd: don't dirty original metadata buffer on abort
http://lkml.org/lkml/2008/7/24/168
--- fs/jbd/checkpoint.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
fs/jbd/checkpoint.c +3 -3
@@ -94,7 +94,7 @@ static int __try_to_free_cp_buf(struct jstruct buffer_head *bh =jh2bh (jh);if (jh->b_jlist == BJ_None && !buffer_locked (bh) && - !buffer_dirty (bh) &&buffer_uptodate (bh)) { + !buffer_dirty (bh) && !buffer_write_io_error (bh)) {JBUFFER_TRACE (jh,"remove from checkpoint list" ); ret =__journal_remove_checkpoint (jh) +1 ;jbd_unlock_bh_state (bh);
@@ -214,7 +214,7 @@ restart:spin_lock (&journal->j_list_lock); goto restart; } -if (unlikely (!buffer_uptodate (bh))) +if (unlikely (buffer_write_io_error (bh))) ret = -EIO ;/*
@@ -283,7 +283,7 @@ static int __process_buffer(journal_t *j ret =1 ; }else if (!buffer_dirty (bh)) { ret =1 ; -if (unlikely (!buffer_uptodate (bh))) +if (unlikely (buffer_write_io_error (bh))) ret = -EIO ;J_ASSERT_JH (jh, !buffer_jbddirty (bh));BUFFER_TRACE (bh,"remove from checkpoint" );
Quoted 8 lines · Hidehiro Kawai
__try_to_free_cp_buf(),__process_buffer(), and__wait_cp_io()testBH_Uptodateflag to detect write I/O errors on metadata buffers. But by commit95450f5a7e53d5752ce1a0d0b8282e10fe745ae0"ext3: don't read inode block if the buffer has a write error"(*),BH_Uptodateflag can be set to inode buffers withBH_Write_EIOin order to avoid reading old inode data. So now, we have to testBH_Write_EIOflag of checkpointing inode buffers instead ofBH_Uptodate. This patch does it.
Your changes look sane. Thanks for fixing this.
You can add Acked-by: Jan Kara <[email protected]>
Honza
Quoted 52 lines
(*) http://lkml.org/lkml/2008/6/23/126
This patch depends on the following patch set in -mm:
#1 jbd: abort when failed to log metadata buffers
http://lkml.org/lkml/2008/7/24/160
#2 jbd: fix error handling for checkpoint io
http://lkml.org/lkml/2008/7/24/163
#3 ext3: add checks for errors from jbd
http://lkml.org/lkml/2008/7/29/539
#4 jbd: don't dirty original metadata buffer on abort
http://lkml.org/lkml/2008/7/24/168Signed-off-by Hidehiro Kawai <[email protected]>--- fs/jbd/checkpoint.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)Index:
linux-2.6.27-rc5-mm1/fs/jbd/checkpoint.c
===================================================================fs/jbd/checkpoint.c +3
-3@@ -94,7 +94,7 @@ static int __try_to_free_cp_buf(struct jstruct buffer_head *bh =jh2bh (jh);if (jh->b_jlist == BJ_None && !buffer_locked (bh) && - !buffer_dirty (bh) &&buffer_uptodate (bh)) { + !buffer_dirty (bh) && !buffer_write_io_error (bh)) {JBUFFER_TRACE (jh,"remove from checkpoint list" ); ret =__journal_remove_checkpoint (jh) +1 ;jbd_unlock_bh_state (bh);@@ -214,7 +214,7 @@ restart:spin_lock (&journal->j_list_lock); goto restart; } -if (unlikely (!buffer_uptodate (bh))) +if (unlikely (buffer_write_io_error (bh))) ret = -EIO ;/* @@ -283,7 +283,7 @@ static int __process_buffer(journal_t *j ret =1 ; }else if (!buffer_dirty (bh)) { ret =1 ; -if (unlikely (!buffer_uptodate (bh))) +if (unlikely (buffer_write_io_error (bh))) ret = -EIO ;J_ASSERT_JH (jh, !buffer_jbddirty (bh));BUFFER_TRACE (bh,"remove from checkpoint" );
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR
Quoted 22 lines · Hidehiro Kawai
__try_to_free_cp_buf(),__process_buffer(), and__wait_cp_io()testBH_Uptodateflag to detect write I/O errors on metadata buffers. But by commit95450f5a7e53d5752ce1a0d0b8282e10fe745ae0"ext3: don't read inode block if the buffer has a write error"(*),BH_Uptodateflag can be set to inode buffers withBH_Write_EIOin order to avoid reading old inode data. So now, we have to testBH_Write_EIOflag of checkpointing inode buffers instead ofBH_Uptodate. This patch does it.(*) http://lkml.org/lkml/2008/6/23/126
This patch depends on the following patch set in -mm:
#1 jbd: abort when failed to log metadata buffers
http://lkml.org/lkml/2008/7/24/160
#2 jbd: fix error handling for checkpoint io
http://lkml.org/lkml/2008/7/24/163
#3 ext3: add checks for errors from jbd
http://lkml.org/lkml/2008/7/29/539
#4 jbd: don't dirty original metadata buffer on abort
http://lkml.org/lkml/2008/7/24/168
Quoted 2 lines
Signed-off-by Hidehiro Kawai <[email protected]>---
Thanks, you can add
too.
Quoted 40 lines
fs/jbd/checkpoint.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)Index:
linux-2.6.27-rc5-mm1/fs/jbd/checkpoint.c
===================================================================fs/jbd/checkpoint.c +3
-4@@ -94,7 +94,7 @@ static int __try_to_free_cp_buf(struct jstruct buffer_head *bh =jh2bh (jh);if (jh->b_jlist == BJ_None && !buffer_locked (bh) && - !buffer_dirty (bh) &&buffer_uptodate (bh)) { + !buffer_dirty (bh) && !buffer_write_io_error (bh)) {JBUFFER_TRACE (jh,"remove from checkpoint list" ); ret =__journal_remove_checkpoint (jh) +1 ;jbd_unlock_bh_state (bh);@@ -214,7 +214,7 @@ restart:spin_lock (&journal->j_list_lock); goto restart; } -if (unlikely (!buffer_uptodate (bh))) +if (unlikely (buffer_write_io_error (bh))) ret = -EIO ;/* @@ -283,7 +283,7 @@ static int __process_buffer(journal_t *j ret =1 ; }else if (!buffer_dirty (bh)) { ret =1 ; -if (unlikely (!buffer_uptodate (bh))) +if (unlikely (buffer_write_io_error (bh))) ret = -EIO ;J_ASSERT_JH (jh, !buffer_jbddirty (bh));BUFFER_TRACE (bh,"remove from checkpoint" ); --To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html