Messages in this thread Patch in this message | | | Date | Wed, 14 Sep 2011 10:32:47 -0400 | From | Konrad Rzeszutek Wilk <> | Subject | Re: Help with implementing some form of barriers in 3.0 kernels. |
| |
> > + if (drain) { > > + struct request_queue *q = bdev_get_queue(preq.bdev); > > + unsigned long flags; > > +
> > + /* Emulate the original behavior of write barriers */ > > + spin_lock_irqsave(q->queue_lock, flags); > > + elv_drain_elevator(q); > > + __blk_run_queue(q); > > + spin_unlock_irqrestore(q->queue_lock, flags); > > + } I also had to add:
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index eaf49d1..20fddbc 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -679,6 +679,10 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif, struct request_queue *q = bdev_get_queue(preq.bdev); unsigned long flags; + if (!q->elevator) { + __end_block_io_op(pending_req, -EOPNOTSUPP); + return -EOPNOTSUPP; + } /* Emulate the original behavior of write barriers */ spin_lock_irqsave(q->queue_lock, flags); elv_drain_elevator(q); diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h index 52d8893..722714a 100644 --- a/drivers/block/xen-blkback/common.h +++ b/drivers/block/xen-blkback/common.h @@ -157,6 +157,7 @@ struct xen_vbd { /* Cached size parameter. */ sector_t size; bool flush_support; + bool barrier_support; }; struct backend_info; diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index da1e27a..7189ecd 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -384,6 +384,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, if (q && q->flush_flags) vbd->flush_support = true; + if (q && q->elevator && q->elevator->ops) + vbd->barrier_support = true; + DPRINTK("Successful creation of handle=%04x (dom=%u)\n", handle, blkif->domid); return 0; @@ -728,7 +731,7 @@ again: if (err) goto abort; - err = xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support); + err = xen_blkbk_barrier(xbt, be, be->blkif->vbd.barrier_support); err = xen_blkbk_discard(xbt, be);
Otherwise it would crash.. Thought I am not sure why the elevator is not set (the guest is on a LVM LV).
| |