Change md->barrier_error so that it can accumulate more errors (the first one is reported). With the following patches, more errors could happen. Return the first error to the caller. Signed-off-by: Mikulas Patocka <mpatocka@xxxxxxxxxx> --- drivers/md/dm.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) Index: linux-2.6.30-rc1-devel/drivers/md/dm.c =================================================================== --- linux-2.6.30-rc1-devel.orig/drivers/md/dm.c 2009-04-10 06:33:20.000000000 +0200 +++ linux-2.6.30-rc1-devel/drivers/md/dm.c 2009-04-10 06:33:23.000000000 +0200 @@ -565,7 +565,8 @@ static void dec_pending(struct dm_io *io * per-device variable for error reporting is OK. * Note that you can't touch the bio after end_io_acct */ - md->barrier_error = io_error; + if (!md->barrier_error) + md->barrier_error = io_error; end_io_acct(io); } else { end_io_acct(io); @@ -864,7 +865,8 @@ static void __split_and_process_bio(stru if (!bio_barrier(bio)) bio_io_error(bio); else - md->barrier_error = -EIO; + if (!md->barrier_error) + md->barrier_error = -EIO; return; } @@ -1459,16 +1461,15 @@ static void dm_wq_work(struct work_struc if (!bio_barrier(c)) __split_and_process_bio(md, c); else { + md->barrier_error = 0; + dm_flush(md); - if (bio_empty_barrier(c)) { - bio_endio(c, 0); - goto next_bio; + if (!bio_empty_barrier(c)) { + __split_and_process_bio(md, c); + dm_flush(md); } - __split_and_process_bio(md, c); - dm_flush(md); - if (md->barrier_error != DM_ENDIO_REQUEUE) bio_endio(c, md->barrier_error); else { @@ -1478,7 +1479,6 @@ static void dm_wq_work(struct work_struc } } -next_bio: down_write(&md->io_lock); } -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel