--- 2.3.15-pre1-ramdisk/drivers/block/rd.c Fri Aug 20 20:58:03 1999 +++ 2.3.15-pre1-ramdisk-page-cache/drivers/block/rd.c Fri Aug 20 21:31:32 1999 @@ -217,9 +217,24 @@ * If we're writing, we protect the buffer. */ - if (CURRENT->cmd == READ) - memset(CURRENT->buffer, 0, len); - else + if (CURRENT->cmd == READ) + { + struct buffer_head * bh, * oldbh; + + bh = CURRENT->bh; /* can the req->bh be null? I think no... */ + oldbh = get_hash_table(bh->b_rdev, bh->b_blocknr, bh->b_size); + if (!oldbh) + memset(bh->b_data, 0, len); + else + { + memcpy(bh->b_data, oldbh->b_data, bh->b_size); + if (test_and_clear_bit(BH_Protected, &oldbh->b_state)) + set_bit(BH_Protected, &bh->b_state); + if (atomic_set_buffer_clean(oldbh)) + set_bit(BH_Protected, &bh->b_state); + atomic_dec(&oldbh->b_count); + } + } else set_bit(BH_Protected, &CURRENT->bh->b_state); end_request(1);