From bd16b19bb06077a8eddde82fd147a5a2829848b7 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Wed, 24 Aug 2005 20:29:42 +0000 Subject: [PATCH] Unregister watch in error path. Signed-off-by: Christian Limpach --- .../drivers/xen/blkback/xenbus.c | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c index 2a445a3983..9d255aefd8 100644 --- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c @@ -201,21 +201,8 @@ static int blkback_probe(struct xenbus_device *dev, 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, @@ -223,17 +210,28 @@ static int blkback_probe(struct xenbus_device *dev, NULL); if (XENBUS_EXIST_ERR(err)) goto free_be; - if (frontend && - (strlen(frontend) == 0 || !xenbus_exists(frontend, ""))) { + if (err < 0) { + xenbus_dev_error(dev, err, + "reading %s/frontend or frontend-id", + dev->nodename); + goto free_be; + } + if (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. */ + err = -ENOENT; goto free_be; } - if (err < 0) { - xenbus_dev_error(dev, err, - "reading %s/frontend or frontend-id", + + be->dev = dev; + be->backend_watch.node = dev->nodename; + be->backend_watch.callback = backend_changed; + err = register_xenbus_watch(&be->backend_watch); + if (err) { + be->backend_watch.node = NULL; + xenbus_dev_error(dev, err, "adding backend watch on %s", dev->nodename); goto free_be; } @@ -250,10 +248,14 @@ static int blkback_probe(struct xenbus_device *dev, goto free_be; } + dev->data = be; + backend_changed(&be->backend_watch, dev->nodename); - return err; + return 0; free_be: + if (be->backend_watch.node) + unregister_xenbus_watch(&be->backend_watch); if (frontend) kfree(frontend); kfree(be); -- 2.30.2