[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Avoid calling device_unregister from device_register callback.
# HG changeset patch # User cl349@xxxxxxxxxxxxxxxxxxxx # Node ID 6b94eaa59279b2a3a5917779f42b58abcd3478c3 # Parent 237dc67887cc6716359545a46edbbe1c17353722 Avoid calling device_unregister from device_register callback. Also simplify code. Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> diff -r 237dc67887cc -r 6b94eaa59279 linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Aug 24 20:10:12 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Aug 24 20:11:07 2005 @@ -64,7 +64,7 @@ = container_of(watch, struct backend_info, watch); /* If other end is gone, delete ourself. */ - if (!xenbus_exists(be->frontpath, "")) { + if (node && !xenbus_exists(be->frontpath, "")) { xenbus_rm(be->dev->nodename, ""); device_unregister(&be->dev->dev); return; @@ -139,133 +139,123 @@ { int err; char *p; - char *frontend; long int handle, pdev; struct backend_info *be = container_of(watch, struct backend_info, backend_watch); struct xenbus_device *dev = be->dev; + + err = xenbus_scanf(dev->nodename, "physical-device", "%li", &pdev); + if (XENBUS_EXIST_ERR(err)) + return; + if (err < 0) { + xenbus_dev_error(dev, err, "reading physical-device"); + return; + } + if (be->pdev && be->pdev != pdev) { + printk(KERN_WARNING + "changing physical-device not supported\n"); + return; + } + be->pdev = pdev; + + /* If there's a read-only node, we're read only. */ + p = xenbus_read(dev->nodename, "read-only", NULL); + if (!IS_ERR(p)) { + be->readonly = 1; + kfree(p); + } + + if (be->blkif == NULL) { + /* Front end dir is a number, which is used as the handle. */ + p = strrchr(be->frontpath, '/') + 1; + handle = simple_strtoul(p, NULL, 0); + + be->blkif = alloc_blkif(be->frontend_id); + if (IS_ERR(be->blkif)) { + err = PTR_ERR(be->blkif); + be->blkif = NULL; + xenbus_dev_error(dev, err, "creating block interface"); + return; + } + + err = vbd_create(be->blkif, handle, be->pdev, be->readonly); + if (err) { + xenbus_dev_error(dev, err, "creating vbd structure"); + return; + } + + /* Pass in NULL node to skip exist test. */ + frontend_changed(&be->watch, NULL); + } +} + +static int blkback_probe(struct xenbus_device *dev, + const struct xenbus_device_id *id) +{ + struct backend_info *be; + char *frontend; + int err; + + be = kmalloc(sizeof(*be), GFP_KERNEL); + if (!be) { + xenbus_dev_error(dev, -ENOMEM, "allocating backend structure"); + return -ENOMEM; + } + + memset(be, 0, sizeof(*be)); + + be->dev = dev; + be->backend_watch.node = dev->nodename; + be->backend_watch.callback = backend_changed; + err = register_xenbus_watch(&be->backend_watch); + if (err) { + xenbus_dev_error(dev, err, "adding backend watch on %s", + dev->nodename); + goto free_be; + } + + dev->data = be; frontend = NULL; err = xenbus_gather(dev->nodename, "frontend-id", "%li", &be->frontend_id, "frontend", NULL, &frontend, NULL); - if (XENBUS_EXIST_ERR(err) || - strlen(frontend) == 0 || !xenbus_exists(frontend, "")) { + if (XENBUS_EXIST_ERR(err)) + goto free_be; + if (frontend && + (strlen(frontend) == 0 || !xenbus_exists(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; + goto free_be; } 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) - unregister_xenbus_watch(&be->watch); - 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); - if (err) { - be->watch.node = NULL; - xenbus_dev_error(dev, err, - "adding frontend watch on %s", - be->frontpath); - goto device_fail; - } - } - - err = xenbus_scanf(dev->nodename, "physical-device", "%li", &pdev); - if (XENBUS_EXIST_ERR(err)) - goto out; - if (err < 0) { - xenbus_dev_error(dev, err, "reading physical-device"); - goto device_fail; - } - if (be->pdev && be->pdev != pdev) { - printk(KERN_WARNING - "changing physical-device not supported\n"); - goto device_fail; - } - be->pdev = pdev; - - /* If there's a read-only node, we're read only. */ - p = xenbus_read(dev->nodename, "read-only", NULL); - if (!IS_ERR(p)) { - be->readonly = 1; - kfree(p); - } - - if (be->blkif == NULL) { - /* Front end dir is a number, which is used as the handle. */ - p = strrchr(be->frontpath, '/') + 1; - handle = simple_strtoul(p, NULL, 0); - - be->blkif = alloc_blkif(be->frontend_id); - if (IS_ERR(be->blkif)) { - err = PTR_ERR(be->blkif); - be->blkif = NULL; - xenbus_dev_error(dev, err, "creating block interface"); - goto device_fail; - } - - err = vbd_create(be->blkif, handle, be->pdev, be->readonly); - if (err) { - xenbus_dev_error(dev, err, "creating vbd structure"); - goto device_fail; - } - - frontend_changed(&be->watch, be->frontpath); - } - - out: + goto free_be; + } + + be->frontpath = frontend; + be->watch.node = be->frontpath; + be->watch.callback = frontend_changed; + err = register_xenbus_watch(&be->watch); + if (err) { + be->watch.node = NULL; + xenbus_dev_error(dev, err, + "adding frontend watch on %s", + be->frontpath); + goto free_be; + } + + backend_changed(&be->backend_watch, dev->nodename); + return err; + + free_be: if (frontend) kfree(frontend); - return; - - device_fail: - device_unregister(&be->dev->dev); - goto out; -} - -static int blkback_probe(struct xenbus_device *dev, - const struct xenbus_device_id *id) -{ - struct backend_info *be; - int err; - - be = kmalloc(sizeof(*be), GFP_KERNEL); - if (!be) { - xenbus_dev_error(dev, -ENOMEM, "allocating backend structure"); - return -ENOMEM; - } - - memset(be, 0, sizeof(*be)); - - be->dev = dev; - be->backend_watch.node = dev->nodename; - be->backend_watch.callback = backend_changed; - err = register_xenbus_watch(&be->backend_watch); - if (err) { - xenbus_dev_error(dev, err, "adding backend watch on %s", - dev->nodename); - goto free_be; - } - - dev->data = be; - - backend_changed(&be->backend_watch, dev->nodename); - return err; - free_be: kfree(be); return err; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |