[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Move non-transactional and non-idempotent code out of
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 70b6e60df7502463a240689ed0f6b4975b9a9a62 # Parent 8c2aa08789277490d6ff5ee3523a080d514c5570 Move non-transactional and non-idempotent code out of xenstore transaction retry loops in our device drivers. Otherwise things get very smelly if a transaction fails and is retried. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r 8c2aa0878927 -r 70b6e60df750 linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Mon Sep 26 17:49:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Mon Sep 26 18:13:57 2005 @@ -80,6 +80,15 @@ return; } + /* Map the shared frame, irq etc. */ + err = blkif_map(be->blkif, ring_ref, evtchn); + if (err) { + xenbus_dev_error(be->dev, err, "mapping ring-ref %lu port %u", + ring_ref, evtchn); + return; + } + /* XXX From here on should 'blkif_unmap' on error. */ + again: /* Supply the information about the device the frontend needs */ err = xenbus_transaction_start(); @@ -109,14 +118,6 @@ if (err) { xenbus_dev_error(be->dev, err, "writing %s/sector-size", be->dev->nodename); - goto abort; - } - - /* Map the shared frame, irq etc. */ - err = blkif_map(be->blkif, ring_ref, evtchn); - if (err) { - xenbus_dev_error(be->dev, err, "mapping ring-ref %lu port %u", - ring_ref, evtchn); goto abort; } diff -r 8c2aa0878927 -r 70b6e60df750 linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Mon Sep 26 17:49:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Mon Sep 26 18:13:57 2005 @@ -591,17 +591,6 @@ goto abort_transaction; } - 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"; - goto abort_transaction; - } - err = xenbus_transaction_end(0); if (err) { if (err == -EAGAIN) @@ -610,10 +599,17 @@ goto destroy_blkring; } - out: - if (backend) - kfree(backend); - return err; + info->watch.node = backend; + info->watch.callback = watch_for_status; + err = register_xenbus_watch(&info->watch); + if (err) { + message = "registering watch on backend"; + goto destroy_blkring; + } + + info->backend = backend; + + return 0; abort_transaction: xenbus_transaction_end(1); @@ -621,7 +617,10 @@ xenbus_dev_error(dev, err, "%s", message); destroy_blkring: blkif_free(info); - goto out; + out: + if (backend) + kfree(backend); + return err; } /* Setup supplies the backend dir, virtual device. diff -r 8c2aa0878927 -r 70b6e60df750 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Sep 26 17:49:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Sep 26 18:13:57 2005 @@ -1148,17 +1148,6 @@ goto abort_transaction; } - 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"; - goto abort_transaction; - } - err = xenbus_transaction_end(0); if (err) { if (err == -EAGAIN) @@ -1167,12 +1156,19 @@ goto destroy_ring; } + info->watch.node = backend; + info->watch.callback = watch_for_status; + err = register_xenbus_watch(&info->watch); + if (err) { + message = "registering watch on backend"; + goto destroy_ring; + } + + info->backend = backend; + netif_state = NETIF_STATE_CONNECTED; - out: - if (backend) - kfree(backend); - return err; + return 0; abort_transaction: xenbus_transaction_end(1); @@ -1180,7 +1176,10 @@ xenbus_dev_error(dev, err, "%s", message); destroy_ring: shutdown_device(info); - goto out; + out: + if (backend) + kfree(backend); + return err; } /* Setup supplies the backend dir, virtual device. diff -r 8c2aa0878927 -r 70b6e60df750 linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c Mon Sep 26 17:49:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c Mon Sep 26 18:13:57 2005 @@ -88,6 +88,26 @@ return; } + err = tpmif_map(be->tpmif, ringref, evtchn); + if (err) { + xenbus_dev_error(be->dev, err, + "mapping shared-frame %lu port %u", + ringref, evtchn); + return; + } + + err = tpmif_vtpm_open(be->tpmif, + be->frontend_id, + be->instance); + if (err) { + xenbus_dev_error(be->dev, err, + "queueing vtpm open packet"); + /* + * Should close down this device and notify FE + * about closure. + */ + return; + } /* * Tell the front-end that we are ready to go - @@ -104,27 +124,6 @@ "ready", "%lu", ready); if (err) { xenbus_dev_error(be->dev, err, "writing 'ready'"); - goto abort; - } - - err = tpmif_map(be->tpmif, ringref, evtchn); - if (err) { - xenbus_dev_error(be->dev, err, - "mapping shared-frame %lu port %u", - ringref, evtchn); - goto abort; - } - - err = tpmif_vtpm_open(be->tpmif, - be->frontend_id, - be->instance); - if (err) { - xenbus_dev_error(be->dev, err, - "queueing vtpm open packet"); - /* - * Should close down this device and notify FE - * about closure. - */ goto abort; } diff -r 8c2aa0878927 -r 70b6e60df750 linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Mon Sep 26 17:49:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Mon Sep 26 18:13:57 2005 @@ -352,17 +352,6 @@ goto abort_transaction; } - 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"; - goto abort_transaction; - } - err = xenbus_transaction_end(0); if (err == -EAGAIN) goto again; @@ -371,10 +360,17 @@ goto destroy_tpmring; } -out: - if (backend) - kfree(backend); - return err; + info->watch.node = backend; + info->watch.callback = watch_for_status; + err = register_xenbus_watch(&info->watch); + if (err) { + message = "registering watch on backend"; + goto destroy_tpmring; + } + + info->backend = backend; + + return 0; abort_transaction: xenbus_transaction_end(1); @@ -382,7 +378,10 @@ xenbus_dev_error(dev, err, "%s", message); destroy_tpmring: destroy_tpmring(info, &my_private); - goto out; +out: + if (backend) + kfree(backend); + return err; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |