|
@@ -121,9 +121,6 @@ struct XenBlkDev {
|
|
|
unsigned int persistent_gnt_count;
|
|
|
unsigned int max_grants;
|
|
|
|
|
|
- /* Grant copy */
|
|
|
- gboolean feature_grant_copy;
|
|
|
-
|
|
|
/* qemu block driver */
|
|
|
DriveInfo *dinfo;
|
|
|
BlockBackend *blk;
|
|
@@ -616,7 +613,7 @@ static void qemu_aio_complete(void *opaque, int ret)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (ioreq->blkdev->feature_grant_copy) {
|
|
|
+ if (xen_feature_grant_copy) {
|
|
|
switch (ioreq->req.operation) {
|
|
|
case BLKIF_OP_READ:
|
|
|
/* in case of failure ioreq->aio_errors is increased */
|
|
@@ -638,7 +635,7 @@ static void qemu_aio_complete(void *opaque, int ret)
|
|
|
}
|
|
|
|
|
|
ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY;
|
|
|
- if (!ioreq->blkdev->feature_grant_copy) {
|
|
|
+ if (!xen_feature_grant_copy) {
|
|
|
ioreq_unmap(ioreq);
|
|
|
}
|
|
|
ioreq_finish(ioreq);
|
|
@@ -698,7 +695,7 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
|
|
|
{
|
|
|
struct XenBlkDev *blkdev = ioreq->blkdev;
|
|
|
|
|
|
- if (ioreq->blkdev->feature_grant_copy) {
|
|
|
+ if (xen_feature_grant_copy) {
|
|
|
ioreq_init_copy_buffers(ioreq);
|
|
|
if (ioreq->req.nr_segments && (ioreq->req.operation == BLKIF_OP_WRITE ||
|
|
|
ioreq->req.operation == BLKIF_OP_FLUSH_DISKCACHE) &&
|
|
@@ -750,7 +747,7 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
|
|
|
}
|
|
|
default:
|
|
|
/* unknown operation (shouldn't happen -- parse catches this) */
|
|
|
- if (!ioreq->blkdev->feature_grant_copy) {
|
|
|
+ if (!xen_feature_grant_copy) {
|
|
|
ioreq_unmap(ioreq);
|
|
|
}
|
|
|
goto err;
|
|
@@ -1010,18 +1007,15 @@ static int blk_init(struct XenDevice *xendev)
|
|
|
|
|
|
blkdev->file_blk = BLOCK_SIZE;
|
|
|
|
|
|
- blkdev->feature_grant_copy =
|
|
|
- (xengnttab_grant_copy(blkdev->xendev.gnttabdev, 0, NULL) == 0);
|
|
|
-
|
|
|
xen_pv_printf(&blkdev->xendev, 3, "grant copy operation %s\n",
|
|
|
- blkdev->feature_grant_copy ? "enabled" : "disabled");
|
|
|
+ xen_feature_grant_copy ? "enabled" : "disabled");
|
|
|
|
|
|
/* fill info
|
|
|
* blk_connect supplies sector-size and sectors
|
|
|
*/
|
|
|
xenstore_write_be_int(&blkdev->xendev, "feature-flush-cache", 1);
|
|
|
xenstore_write_be_int(&blkdev->xendev, "feature-persistent",
|
|
|
- !blkdev->feature_grant_copy);
|
|
|
+ !xen_feature_grant_copy);
|
|
|
xenstore_write_be_int(&blkdev->xendev, "info", info);
|
|
|
|
|
|
xenstore_write_be_int(&blkdev->xendev, "max-ring-page-order",
|
|
@@ -1226,6 +1220,12 @@ static int blk_connect(struct XenDevice *xendev)
|
|
|
/* Add on the number needed for the ring pages */
|
|
|
max_grants += blkdev->nr_ring_ref;
|
|
|
|
|
|
+ blkdev->xendev.gnttabdev = xengnttab_open(NULL, 0);
|
|
|
+ if (blkdev->xendev.gnttabdev == NULL) {
|
|
|
+ xen_pv_printf(xendev, 0, "xengnttab_open failed: %s\n",
|
|
|
+ strerror(errno));
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
if (xengnttab_set_max_grants(blkdev->xendev.gnttabdev, max_grants)) {
|
|
|
xen_pv_printf(xendev, 0, "xengnttab_set_max_grants failed: %s\n",
|
|
|
strerror(errno));
|
|
@@ -1333,6 +1333,11 @@ static void blk_disconnect(struct XenDevice *xendev)
|
|
|
}
|
|
|
blkdev->feature_persistent = false;
|
|
|
}
|
|
|
+
|
|
|
+ if (blkdev->xendev.gnttabdev) {
|
|
|
+ xengnttab_close(blkdev->xendev.gnttabdev);
|
|
|
+ blkdev->xendev.gnttabdev = NULL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int blk_free(struct XenDevice *xendev)
|
|
@@ -1340,9 +1345,7 @@ static int blk_free(struct XenDevice *xendev)
|
|
|
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
|
|
struct ioreq *ioreq;
|
|
|
|
|
|
- if (blkdev->blk || blkdev->sring) {
|
|
|
- blk_disconnect(xendev);
|
|
|
- }
|
|
|
+ blk_disconnect(xendev);
|
|
|
|
|
|
while (!QLIST_EMPTY(&blkdev->freelist)) {
|
|
|
ioreq = QLIST_FIRST(&blkdev->freelist);
|
|
@@ -1369,7 +1372,6 @@ static void blk_event(struct XenDevice *xendev)
|
|
|
|
|
|
struct XenDevOps xen_blkdev_ops = {
|
|
|
.size = sizeof(struct XenBlkDev),
|
|
|
- .flags = DEVOPS_FLAG_NEED_GNTDEV,
|
|
|
.alloc = blk_alloc,
|
|
|
.init = blk_init,
|
|
|
.initialise = blk_connect,
|