--- linux/drivers/ide/raid/ataraid.c.orig 2004-07-13 23:45:21.000000000 -0400 +++ linux/drivers/ide/raid/ataraid.c 2004-07-13 23:45:32.000000000 -0400 @@ -153,7 +153,14 @@ void ataraid_end_request(struct buffer_h if (private==NULL) BUG(); + if (!uptodate) /* record failures of components of the original I/O */ + set_bit(BH_PrivateStart, &private->parent->b_state); + if (atomic_dec_and_test(&private->count)) { + if (test_bit(BH_PrivateStart, &private->parent->b_state)) { + uptodate = 0; /* fail the completed original I/O */ + clear_bit(BH_PrivateStart, &private->parent->b_state); + } private->parent->b_end_io(private->parent,uptodate); private->parent = NULL; kfree(private); @@ -194,6 +201,8 @@ static void ataraid_split_request(reques bh2->b_data += bh->b_size/2; + clear_bit(BH_PrivateStart, &bh->b_state); /* this bit tracks success */ + generic_make_request(rw,bh1); generic_make_request(rw,bh2); }