diff -ur --exclude-from /home/axboe/exclude /opt/kernel/linux-2.4.5-pre1/drivers/block/rd.c linux/drivers/block/rd.c --- /opt/kernel/linux-2.4.5-pre1/drivers/block/rd.c Fri Feb 9 20:30:22 2001 +++ linux/drivers/block/rd.c Tue May 8 15:14:52 2001 @@ -201,13 +201,11 @@ struct buffer_head *rbh; char *bdata; - minor = MINOR(sbh->b_rdev); if (minor >= NUM_RAMDISKS) goto fail; - offset = sbh->b_rsector << 9; len = sbh->b_size; @@ -225,21 +223,24 @@ /* I think that it is safe to assume that rbh is not in HighMem, though * sbh might be - NeilBrown */ - bdata = bh_kmap(sbh); - if (rw == READ) { - if (sbh != rbh) + if (sbh != rbh) { + bdata = bh_kmap(sbh); + + if (rw == READ) memcpy(bdata, rbh->b_data, rbh->b_size); - } else - if (sbh != rbh) + else memcpy(rbh->b_data, bdata, rbh->b_size); - bh_kunmap(sbh); + + bh_kunmap(sbh); + } + mark_buffer_protected(rbh); brelse(rbh); sbh->b_end_io(sbh,1); return 0; fail: - sbh->b_end_io(sbh,0); + buffer_IO_error(sbh); return 0; }