# 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
|