From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com ([209.132.183.28]:42313 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932342AbbICP2A (ORCPT ); Thu, 3 Sep 2015 11:28:00 -0400 Date: Thu, 3 Sep 2015 10:27:57 -0500 From: "Bill O'Donnell" To: David Jeffery , stable@vger.kernel.org, Dave Chinner Subject: Re: [PATCH 2/4] xfs: return errors from partial I/O failures to files Message-ID: <20150903152757.GA26655@redhat.com> References: <1441293986-26474-2-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1441293986-26474-2-git-send-email-billodo@redhat.com> Sender: stable-owner@vger.kernel.org List-ID: please disregard. Mistake with guilt. :( On Thu, Sep 03, 2015 at 10:26:24AM -0500, billodo wrote: > From: David Jeffery > > There is an issue with xfs's error reporting in some cases of I/O partially > failing and partially succeeding. Calls like fsync() can report success even > though not all I/O was successful in partial-failure cases such as one disk of > a RAID0 array being offline. > > The issue can occur when there are more than one bio per xfs_ioend struct. > Each call to xfs_end_bio() for a bio completing will write a value to > ioend->io_error. If a successful bio completes after any failed bio, no > error is reported do to it writing 0 over the error code set by any failed bio. > The I/O error information is now lost and when the ioend is completed > only success is reported back up the filesystem stack. > > xfs_end_bio() should only set ioend->io_error in the case of BIO_UPTODATE > being clear. ioend->io_error is initialized to 0 at allocation so only needs > to be updated by a failed bio. Also check that ioend->io_error is 0 so that > the first error reported will be the error code returned. > > Cc: stable@vger.kernel.org > Signed-off-by: David Jeffery > Reviewed-by: Dave Chinner > Signed-off-by: Dave Chinner > Signed-off-by: billodo > --- > fs/xfs/xfs_aops.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 3859f5e..458fced 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -356,7 +356,8 @@ xfs_end_bio( > { > xfs_ioend_t *ioend = bio->bi_private; > > - ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; > + if (!ioend->io_error && !test_bit(BIO_UPTODATE, &bio->bi_flags)) > + ioend->io_error = error; > > /* Toss bio and pass work off to an xfsdatad thread */ > bio->bi_private = NULL; > -- > 2.4.3 >