aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/blkfront.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-02-07 09:15:59 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-02-07 09:15:59 +0000
commit563f5ebfcc413f153e9cb99d997ce2dabd920eb5 (patch)
tree109e117f870f5bb92b5914d823d5be89d3cac77b /extras/mini-os/blkfront.c
parent399874b1dee8161a195e416f41301f103603ecbf (diff)
downloadxen-563f5ebfcc413f153e9cb99d997ce2dabd920eb5.tar.gz
xen-563f5ebfcc413f153e9cb99d997ce2dabd920eb5.tar.bz2
xen-563f5ebfcc413f153e9cb99d997ce2dabd920eb5.zip
minios: Support net/block backend in domU
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/blkfront.c')
-rw-r--r--extras/mini-os/blkfront.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c
index 0c77d6d1e4..f07900580b 100644
--- a/extras/mini-os/blkfront.c
+++ b/extras/mini-os/blkfront.c
@@ -35,6 +35,8 @@ struct blk_buffer {
};
struct blkfront_dev {
+ domid_t dom;
+
struct blkif_front_ring ring;
grant_ref_t ring_ref;
evtchn_port_t evtchn, local_port;
@@ -81,24 +83,24 @@ struct blkfront_dev *init_blkfront(char *nodename, uint64_t *sectors, unsigned *
dev = malloc(sizeof(*dev));
dev->nodename = strdup(nodename);
- s = (struct blkif_sring*) alloc_page();
- memset(s,0,PAGE_SIZE);
-
-
- SHARED_RING_INIT(s);
- FRONT_RING_INIT(&dev->ring, s, PAGE_SIZE);
-
- dev->ring_ref = gnttab_grant_access(0,virt_to_mfn(s),0);
-
evtchn_alloc_unbound_t op;
op.dom = DOMID_SELF;
snprintf(path, sizeof(path), "%s/backend-id", nodename);
- op.remote_dom = xenbus_read_integer(path);
+ dev->dom = op.remote_dom = xenbus_read_integer(path);
HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op);
clear_evtchn(op.port); /* Without, handler gets invoked now! */
dev->local_port = bind_evtchn(op.port, blkfront_handler, dev);
dev->evtchn=op.port;
+ s = (struct blkif_sring*) alloc_page();
+ memset(s,0,PAGE_SIZE);
+
+
+ SHARED_RING_INIT(s);
+ FRONT_RING_INIT(&dev->ring, s, PAGE_SIZE);
+
+ dev->ring_ref = gnttab_grant_access(dev->dom,virt_to_mfn(s),0);
+
// FIXME: proper frees on failures
again:
err = xenbus_transaction_start(&xbt);
@@ -280,7 +282,7 @@ void blkfront_aio(struct blkfront_aiocb *aiocbp, int write)
barrier();
}
aiocbp->gref[j] = req->seg[j].gref =
- gnttab_grant_access(0, virtual_to_mfn(data), write);
+ gnttab_grant_access(dev->dom, virtual_to_mfn(data), write);
req->seg[j].first_sect = 0;
req->seg[j].last_sect = PAGE_SIZE / dev->sector_size - 1;
}