diff -r 5ad2a1476b3c -r 1dfbe5675b7a drivers/xen/tpmback/xenbus.c --- a/drivers/xen/tpmback/xenbus.c Mon Jun 07 13:54:21 2010 -0400 +++ b/drivers/xen/tpmback/xenbus.c Wed Jul 07 13:38:42 2010 -0400 @@ -52,6 +52,18 @@ return res; } +static void tpmback_disconnect(struct xenbus_device *dev) { + struct backend_info *be = dev->dev.driver_data; + + if (be->tpmif) { + be->tpmif->bi = NULL; + vtpm_release_packets(be->tpmif, 0); + tpmif_put(be->tpmif); + be->tpmif = NULL; + } + return; +} + static int tpmback_remove(struct xenbus_device *dev) { struct backend_info *be = dev->dev.driver_data; @@ -63,12 +75,7 @@ kfree(be->backend_watch.node); be->backend_watch.node = NULL; } - if (be->tpmif) { - be->tpmif->bi = NULL; - vtpm_release_packets(be->tpmif, 0); - tpmif_put(be->tpmif); - be->tpmif = NULL; - } + tpmback_disconnect(dev); kfree(be); dev->dev.driver_data = NULL; return 0; @@ -162,6 +169,7 @@ case XenbusStateUnknown: /* keep it here */ case XenbusStateClosed: + tpmback_disconnect(dev); /*Unmap shared pages first */ xenbus_switch_state(dev, XenbusStateClosed); device_unregister(&be->dev->dev); tpmback_remove(dev); @@ -213,9 +221,10 @@ if (err) xenbus_dev_fatal(be->dev, err, "end of transaction"); + be->tpmif->status = CONNECTED; err = xenbus_switch_state(dev, XenbusStateConnected); - if (!err) - be->tpmif->status = CONNECTED; + if (err) + be->tpmif->status = DISCONNECTED; return; abort: xenbus_transaction_end(xbt, 1);