From: Jan Kara Subject: Re: [PATCH 2/5] jbd: ordered data integrity fix Date: Mon, 2 Jun 2008 13:59:02 +0200 Message-ID: <20080602115902.GI30613@duck.suse.cz> References: <4843CE15.6080506@hitachi.com> <4843CF30.9050801@hitachi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: akpm@linux-foundation.org, sct@redhat.com, adilger@clusterfs.com, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, jack@suse.cz, jbacik@redhat.com, cmm@us.ibm.com, tytso@mit.edu, sugita , Satoshi OSHIMA To: Hidehiro Kawai Return-path: Received: from styx.suse.cz ([82.119.242.94]:39574 "EHLO mail.suse.cz" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753900AbYFBL7G (ORCPT ); Mon, 2 Jun 2008 07:59:06 -0400 Content-Disposition: inline In-Reply-To: <4843CF30.9050801@hitachi.com> Sender: linux-ext4-owner@vger.kernel.org List-ID: On Mon 02-06-08 19:45:04, Hidehiro Kawai wrote: > Subject: [PATCH 2/5] jbd: ordered data integrity fix > > In ordered mode, if a buffer being dirtied exists in the committing > transaction, we write the buffer to the disk, move it from the > committing transaction to the running transaction, then dirty it. > But we don't have to remove the buffer from the committing > transaction when the buffer couldn't be written out, otherwise it > would miss the error and the committing transaction would not abort. > > This patch adds an error check before removing the buffer from the > committing transaction. > > Signed-off-by: Hidehiro Kawai You can add Acked-by: Jan Kara Honza > --- > fs/jbd/transaction.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > Index: linux-2.6.26-rc4/fs/jbd/transaction.c > =================================================================== > --- linux-2.6.26-rc4.orig/fs/jbd/transaction.c > +++ linux-2.6.26-rc4/fs/jbd/transaction.c > @@ -954,9 +954,10 @@ int journal_dirty_data(handle_t *handle, > journal_t *journal = handle->h_transaction->t_journal; > int need_brelse = 0; > struct journal_head *jh; > + int ret = 0; > > if (is_handle_aborted(handle)) > - return 0; > + return ret; > > jh = journal_add_journal_head(bh); > JBUFFER_TRACE(jh, "entry"); > @@ -1067,7 +1068,16 @@ int journal_dirty_data(handle_t *handle, > time if it is redirtied */ > } > > - /* journal_clean_data_list() may have got there first */ > + /* > + * We cannot remove the buffer with io error from the > + * committing transaction, because otherwise it would > + * miss the error and the commit would not abort. > + */ > + if (unlikely(!buffer_uptodate(bh))) { > + ret = -EIO; > + goto no_journal; > + } > + > if (jh->b_transaction != NULL) { > JBUFFER_TRACE(jh, "unfile from commit"); > __journal_temp_unlink_buffer(jh); > @@ -1108,7 +1118,7 @@ no_journal: > } > JBUFFER_TRACE(jh, "exit"); > journal_put_journal_head(jh); > - return 0; > + return ret; > } > > /** > > -- Jan Kara SUSE Labs, CR