Do not increment bio_data in case of BIO_DELETE.

This fixes KASSERT() panic in g_io_request().
This commit is contained in:
Alexander Motin 2014-04-10 10:12:56 +00:00
parent 43d0f063c2
commit 66b92c07fe
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=264313

View file

@ -472,9 +472,10 @@ g_stripe_start_economic(struct bio *bp, u_int no, off_t offset, off_t length)
/* offset -= offset % stripesize; */
offset -= offset & (stripesize - 1);
addr += length;
if (bp->bio_cmd != BIO_DELETE)
addr += length;
length = bp->bio_length - length;
for (no++; length > 0; no++, length -= stripesize, addr += stripesize) {
for (no++; length > 0; no++, length -= stripesize) {
if (no > sc->sc_ndisks - 1) {
no = 0;
offset += stripesize;
@ -506,6 +507,9 @@ g_stripe_start_economic(struct bio *bp, u_int no, off_t offset, off_t length)
cbp->bio_data = addr;
cbp->bio_caller2 = sc->sc_disks[no];
if (bp->bio_cmd != BIO_DELETE)
addr += stripesize;
}
/*
* Fire off all allocated requests!
@ -632,10 +636,13 @@ g_stripe_start(struct bio *bp)
* a provider, so there is nothing to optmize.
* and
* 4. Request is not unmapped.
* and
* 5. It is not a BIO_DELETE.
*/
if (g_stripe_fast && bp->bio_length <= MAXPHYS &&
bp->bio_length >= stripesize * sc->sc_ndisks &&
(bp->bio_flags & BIO_UNMAPPED) == 0) {
(bp->bio_flags & BIO_UNMAPPED) == 0 &&
bp->bio_cmd != BIO_DELETE) {
fast = 1;
}
error = 0;