summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-05-08 12:04:40 +0000
committermav <mav@FreeBSD.org>2014-05-08 12:04:40 +0000
commit69f94d7a6b01beaadc4c8acbcabcada8e4c9291f (patch)
tree9aa71858f9bc3e53a3819b358913cb5f16dcb9d5 /sys/geom
parent710b5b651544ffe2d545acde443818de974aeea3 (diff)
downloadFreeBSD-src-69f94d7a6b01beaadc4c8acbcabcada8e4c9291f.zip
FreeBSD-src-69f94d7a6b01beaadc4c8acbcabcada8e4c9291f.tar.gz
MFC r264313:
Do not increment bio_data in case of BIO_DELETE. This fixes KASSERT() panic in g_io_request().
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/stripe/g_stripe.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/geom/stripe/g_stripe.c b/sys/geom/stripe/g_stripe.c
index b5d77c5..474d888 100644
--- a/sys/geom/stripe/g_stripe.c
+++ b/sys/geom/stripe/g_stripe.c
@@ -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;
OpenPOWER on IntegriCloud