xfs
[Top] [All Lists]

Re: [PATCH, RFC] - set b_error from bio error in xfs_buf_bio_end_io

To: Eric Sandeen <sandeen@xxxxxxxxxxx>
Subject: Re: [PATCH, RFC] - set b_error from bio error in xfs_buf_bio_end_io
From: Lachlan McIlroy <lachlan@xxxxxxx>
Date: Fri, 05 Dec 2008 15:06:25 +1100
Cc: xfs-oss <xfs@xxxxxxxxxxx>
In-reply-to: <4938A4C1.9010401@xxxxxxxxxxx>
References: <4938A4C1.9010401@xxxxxxxxxxx>
Reply-to: lachlan@xxxxxxx
User-agent: Thunderbird 2.0.0.18 (X11/20081105)
Eric Sandeen wrote:
Tim mentioned something about the code in xfs_buf_iodone_work()
which detects barrier failures post-mount, as added in commit
0bfefc46dc028df60120acdb92062169c9328769,
[XFS] Barriers need to be dynamically checked and switched off

        if ((bp->b_error == EOPNOTSUPP) &&
            (bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) 
{
                XB_TRACE(bp, "ordered_retry", bp->b_iodone);
                bp->b_flags &= ~XBF_ORDERED;
                bp->b_flags |= _XFS_BARRIER_FAILED;
...

but it seems that nothing ever sets EOPNOTSUPP on b_error, so
this path would never be hit.

I think that we need to do something like below, totally untested,
to ensure that bio errors get set on b_error, if we're looking
for them by name, no?

(I'm not sure if we still need the BIO_UPTODATE test, or if
we can just look at the error we're given and be done?)

Does this seem about right?

Thanks,
-Eric

Index: linux-2.6/fs/xfs/linux-2.6/xfs_buf.c
===================================================================
--- linux-2.6.orig/fs/xfs/linux-2.6/xfs_buf.c
+++ linux-2.6/fs/xfs/linux-2.6/xfs_buf.c
@@ -1114,8 +1114,10 @@ xfs_buf_bio_end_io(
        unsigned int            blocksize = bp->b_target->bt_bsize;
        struct bio_vec          *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
- if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
-               bp->b_error = EIO;
+       if (error)
+               bp->b_error = XFS_ERROR(-error);
+       else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
+               bp->b_error = XFS_ERROR(EIO);


I would suggest this:

@@ -1114,8 +1140,7 @@ xfs_buf_bio_end_io(
        unsigned int            blocksize = bp->b_target->bt_bsize;
        struct bio_vec          *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;

-       if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
-               bp->b_error = EIO;
+       xfs_buf_ioerror(bp, -error);

        do {
                struct page     *page = bvec->bv_page;

The BIO_UPTODATE checks have already been done before calling this function
and error has been set appropriately so we can just use it.

do {
                struct page     *page = bvec->bv_page;


_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs


<Prev in Thread] Current Thread [Next in Thread>