[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Improve error paths and cleanup code.
# HG changeset patch # User cl349@xxxxxxxxxxxxxxxxxxxx # Node ID e8c2c3123ec640ef991a2a843fdad8b602d54a80 # Parent 1a0723cd37f1a7e2fb24021699d9df3625183dc0 Improve error paths and cleanup code. Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> diff -r 1a0723cd37f1 -r e8c2c3123ec6 linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Fri Aug 19 16:06:43 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Fri Aug 19 17:38:07 2005 @@ -182,14 +182,18 @@ "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; } @@ -199,6 +203,7 @@ 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); @@ -206,14 +211,13 @@ 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) { @@ -253,12 +257,14 @@ 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, diff -r 1a0723cd37f1 -r e8c2c3123ec6 linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Aug 19 16:06:43 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Aug 19 17:38:07 2005 @@ -1134,25 +1134,24 @@ "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; - - /* First to connect? blkif is now connected. */ - if (blkif_vbds_connected++ == 0) - blkif_state = BLKIF_STATE_CONNECTED; - - xenbus_dev_ok(info->dev); - - /* Kick pending requests. */ - spin_lock_irq(&blkif_io_lock); - kick_pending_request_queues(); - spin_unlock_irq(&blkif_io_lock); - } + return; + } + + xlvbd_add(sectors, info->vdevice, info->handle, binfo, sector_size); + info->connected = 1; + + /* First to connect? blkif is now connected. */ + if (blkif_vbds_connected++ == 0) + blkif_state = BLKIF_STATE_CONNECTED; + + 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) @@ -1199,36 +1198,28 @@ 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", + backend = NULL; + err = xenbus_gather(dev->nodename, + "backend-id", "%i", &backend_id, + "backend", NULL, &backend, + NULL); + if (XENBUS_EXIST_ERR(err)) + goto out; + if (backend && strlen(backend) == 0) { + err = -ENOENT; + goto out; + } + if (err < 0) { + xenbus_dev_error(dev, err, "reading %s/backend or backend-id", dev->nodename); goto out; } - if (strlen(backend) == 0) { - err = -ENOENT; - goto free_backend; - } - - /* 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", - dev->nodename); - goto free_backend; - } /* 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); @@ -1258,9 +1249,11 @@ goto abort_transaction; } - info->watch.node = info->backend = backend; + 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"; @@ -1272,20 +1265,20 @@ 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. @@ -1301,7 +1294,7 @@ /* 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"); @@ -1316,6 +1309,7 @@ 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; @@ -1427,8 +1421,8 @@ #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 diff -r 1a0723cd37f1 -r e8c2c3123ec6 linux-2.6-xen-sparse/include/asm-xen/xenbus.h --- a/linux-2.6-xen-sparse/include/asm-xen/xenbus.h Fri Aug 19 16:06:43 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/xenbus.h Fri Aug 19 17:38:07 2005 @@ -128,4 +128,14 @@ void xenbus_suspend(void); void xenbus_resume(void); +#define XENBUS_IS_ERR_READ(str) ({ \ + if (!IS_ERR(str) && strlen(str) == 0) { \ + kfree(str); \ + str = ERR_PTR(-ERANGE); \ + } \ + IS_ERR(str); \ +}) + +#define XENBUS_EXIST_ERR(err) ((err) == -ENOENT || (err) == -ERANGE) + #endif /* _ASM_XEN_XENBUS_H */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |