"frontend-id", "%li", &be->frontend_id,
"frontend", NULL, &frontend,
NULL);
- if (err == -ENOENT || err == -ERANGE ||
+ if (XENBUS_EXIST_ERR(err) ||
strlen(frontend) == 0 || !xenbus_exists(frontend, "")) {
- if (frontend)
- kfree(frontend);
/* If we can't get a frontend path and a frontend-id,
* then our bus-id is no longer valid and we need to
* destroy the backend device.
*/
goto device_fail;
}
+ if (err < 0) {
+ xenbus_dev_error(dev, err,
+ "reading %s/frontend or frontend-id",
+ dev->nodename);
+ goto device_fail;
+ }
if (!be->frontpath || strcmp(frontend, be->frontpath)) {
if (be->watch.node)
if (be->frontpath)
kfree(be->frontpath);
be->frontpath = frontend;
+ frontend = NULL;
be->watch.node = be->frontpath;
be->watch.callback = frontend_changed;
err = register_xenbus_watch(&be->watch);
be->watch.node = NULL;
goto device_fail;
}
- } else
- kfree(frontend);
+ }
err = xenbus_scanf(dev->nodename, "physical-device", "%li", &pdev);
- if (err == -ENOENT || err == -ERANGE)
+ if (XENBUS_EXIST_ERR(err))
goto out;
if (err < 0) {
- xenbus_dev_error(dev, err, "Reading physical-device");
+ xenbus_dev_error(dev, err, "reading physical-device");
goto device_fail;
}
if (be->pdev && be->pdev != pdev) {
frontend_changed(&be->watch, be->frontpath);
}
+ out:
+ if (frontend)
+ kfree(frontend);
return;
device_fail:
device_unregister(&be->dev->dev);
- out:
- return;
+ goto out;
}
static int blkback_probe(struct xenbus_device *dev,
"info", "%u", &binfo,
"sector-size", "%lu", §or_size,
NULL);
-
- if (err)
+ if (err) {
xenbus_dev_error(info->dev, err, "reading backend fields");
- else {
- xlvbd_add(sectors, info->vdevice, info->handle, binfo,
- sector_size);
- info->connected = 1;
+ return;
+ }
- /* First to connect? blkif is now connected. */
- if (blkif_vbds_connected++ == 0)
- blkif_state = BLKIF_STATE_CONNECTED;
+ xlvbd_add(sectors, info->vdevice, info->handle, binfo, sector_size);
+ info->connected = 1;
- xenbus_dev_ok(info->dev);
+ /* First to connect? blkif is now connected. */
+ if (blkif_vbds_connected++ == 0)
+ blkif_state = BLKIF_STATE_CONNECTED;
- /* Kick pending requests. */
- spin_lock_irq(&blkif_io_lock);
- kick_pending_request_queues();
- spin_unlock_irq(&blkif_io_lock);
- }
+ xenbus_dev_ok(info->dev);
+
+ /* Kick pending requests. */
+ spin_lock_irq(&blkif_io_lock);
+ kick_pending_request_queues();
+ spin_unlock_irq(&blkif_io_lock);
}
static int setup_blkring(struct xenbus_device *dev, unsigned int backend_id)
const char *message;
int err, backend_id;
- backend = xenbus_read(dev->nodename, "backend", NULL);
- if (IS_ERR(backend)) {
- err = PTR_ERR(backend);
- if (err == -ENOENT)
- goto out;
- xenbus_dev_error(dev, err, "reading %s/backend",
- dev->nodename);
+ backend = NULL;
+ err = xenbus_gather(dev->nodename,
+ "backend-id", "%i", &backend_id,
+ "backend", NULL, &backend,
+ NULL);
+ if (XENBUS_EXIST_ERR(err))
goto out;
- }
- if (strlen(backend) == 0) {
+ if (backend && strlen(backend) == 0) {
err = -ENOENT;
- goto free_backend;
+ goto out;
}
-
- /* FIXME: This driver can't handle backends on different
- * domains. Check and fail gracefully. */
- err = xenbus_scanf(dev->nodename, "backend-id", "%i", &backend_id);
- if (err == -ENOENT)
- goto free_backend;
- if (err < 0) {
- xenbus_dev_error(dev, err, "reading %s/backend-id",
+ if (err < 0) {
+ xenbus_dev_error(dev, err, "reading %s/backend or backend-id",
dev->nodename);
- goto free_backend;
- }
+ goto out;
+ }
/* First device? We create shared ring, alloc event channel. */
if (blkif_vbds == 0) {
err = setup_blkring(dev, backend_id);
if (err)
- goto free_backend;
+ goto out;
}
err = xenbus_transaction_start(dev->nodename);
goto abort_transaction;
}
- info->watch.node = info->backend = backend;
- info->watch.callback = watch_for_status;
+ info->backend = backend;
+ backend = NULL;
+ info->watch.node = info->backend;
+ info->watch.callback = watch_for_status;
err = register_xenbus_watch(&info->watch);
if (err) {
message = "registering watch on backend";
xenbus_dev_error(dev, err, "completing transaction");
goto destroy_blkring;
}
- return 0;
-abort_transaction:
+ out:
+ if (backend)
+ kfree(backend);
+ return err;
+
+ abort_transaction:
xenbus_transaction_end(1);
/* Have to do this *outside* transaction. */
xenbus_dev_error(dev, err, "%s", message);
-destroy_blkring:
+ destroy_blkring:
if (blkif_vbds == 0)
blkif_free();
-free_backend:
- kfree(backend);
-out:
- printk("%s:%u = %i\n", __FILE__, __LINE__, err);
- return err;
+ goto out;
}
/* Setup supplies the backend dir, virtual device.
/* FIXME: Use dynamic device id if this is not set. */
err = xenbus_scanf(dev->nodename, "virtual-device", "%i", &vdevice);
- if (err == -ENOENT)
+ if (XENBUS_EXIST_ERR(err))
return err;
if (err < 0) {
xenbus_dev_error(dev, err, "reading virtual-device");
info->dev = dev;
info->vdevice = vdevice;
info->connected = 0;
+
/* Front end dir is a number, which is used as the id. */
info->handle = simple_strtoul(strrchr(dev->nodename,'/')+1, NULL, 0);
dev->data = info;
#ifdef CONFIG_XEN_BLKDEV_GRANT
/* A grant for every ring slot, plus one for the ring itself. */
- if ( 0 > gnttab_alloc_grant_references(MAXIMUM_OUTSTANDING_BLOCK_REQS + 1,
- &gref_head, &gref_terminal) )
+ if (gnttab_alloc_grant_references(MAXIMUM_OUTSTANDING_BLOCK_REQS + 1,
+ &gref_head, &gref_terminal) < 0)
return 1;
printk(KERN_ALERT "Blkif frontend is using grant tables.\n");
#endif