lkml.org 
[lkml]   [2011]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: 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).


\
 
 \ /
  Last update: 2011-09-14 16:35    [W:0.773 / U:0.188 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site