--- linux/drivers/ide/raid/ataraid.c.orig 2004-07-13 23:45:21.000000000 -0400 +++ linux/drivers/ide/raid/ataraid.c 2004-07-26 18:52:21.000000000 -0400 @@ -34,7 +34,8 @@ #include "ataraid.h" - +#define BH_IOFailure (BH_PrivateStart + 5) /* jbd.h uses +0 to +4 */ + static int ataraid_hardsect_size[256]; static int ataraid_blksize_size[256]; @@ -153,7 +154,17 @@ void ataraid_end_request(struct buffer_h if (private==NULL) BUG(); + if (!uptodate) { + set_bit(BH_IOFailure, &private->parent->b_state); + printk(KERN_ERR "ataraid: IO error on major %d minor %d\n", + MAJOR(bh->b_rdev), MINOR(bh->b_rdev)); + } + if (atomic_dec_and_test(&private->count)) { + if (test_bit(BH_IOFailure, &private->parent->b_state)) { + uptodate = 0; /* fail the completed original I/O */ + clear_bit(BH_IOFailure, &private->parent->b_state); + } private->parent->b_end_io(private->parent,uptodate); private->parent = NULL; kfree(private); @@ -194,6 +205,8 @@ static void ataraid_split_request(reques bh2->b_data += bh->b_size/2; + clear_bit(BH_IOFailure, &bh->b_state); /* this bit tracks success */ + generic_make_request(rw,bh1); generic_make_request(rw,bh2); }