From 453c7b64421b0520de33fdc130863f60a0f1bf9c Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 6 Apr 2010 07:13:19 +0100 Subject: mini-os: Fix xenbus initialisation This fixes xenbus initialization of blkfront, netfront and pcifront by uniformizing with fbfront: after writing parameters, set state to initialised, then wait for backend to switch to connect state, and then only read its parameter and switch to the connect state. Signed-off-by: Samuel Thibault --- extras/mini-os/blkfront.c | 17 ++++++++++++++--- extras/mini-os/fbfront.c | 5 +++-- extras/mini-os/netfront.c | 16 ++++++++++++++-- extras/mini-os/pcifront.c | 11 ++++++----- 4 files changed, 37 insertions(+), 12 deletions(-) (limited to 'extras') diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c index e06cf9f94a..9862fb9acb 100644 --- a/extras/mini-os/blkfront.c +++ b/extras/mini-os/blkfront.c @@ -152,13 +152,12 @@ again: } snprintf(path, sizeof(path), "%s/state", nodename); - err = xenbus_switch_state(xbt, path, XenbusStateConnected); + err = xenbus_switch_state(xbt, path, XenbusStateInitialised); if (err) { - message = "switching state"; + printk("error writing blk initialized on %s: %s\n", path, err); goto abort_transaction; } - err = xenbus_transaction_end(xbt, 0, &retry); if (err) free(err); if (retry) { @@ -189,6 +188,7 @@ done: { XenbusState state; char path[strlen(dev->backend) + 1 + 19 + 1]; + char frontpath[strlen(nodename) + 1 + 6 + 1]; snprintf(path, sizeof(path), "%s/mode", dev->backend); msg = xenbus_read(XBT_NIL, path, &c); if (msg) { @@ -232,7 +232,18 @@ done: dev->info.flush = xenbus_read_integer(path); *info = dev->info; + + printk("%s connected\n", dev->backend); + + snprintf(frontpath, sizeof(frontpath), "%s/state", nodename); + if((err = xenbus_switch_state(XBT_NIL, frontpath, XenbusStateConnected)) + != NULL) { + printk("error switching state: %s\n", err); + xenbus_unwatch_path_token(XBT_NIL, path, path); + goto error; + } } + unmask_evtchn(dev->evtchn); printk("%u sectors of %u bytes\n", dev->info.sectors, dev->info.sector_size); diff --git a/extras/mini-os/fbfront.c b/extras/mini-os/fbfront.c index 7ab4778e67..fa4fc428cc 100644 --- a/extras/mini-os/fbfront.c +++ b/extras/mini-os/fbfront.c @@ -126,8 +126,8 @@ again: snprintf(path, sizeof(path), "%s/state", nodename); err = xenbus_switch_state(xbt, path, XenbusStateInitialised); if (err) { - printk("error writing initialized: %s\n", err); - free(err); + printk("error writing fb initialized: %s\n", err); + goto abort_transaction; } err = xenbus_transaction_end(xbt, 0, &retry); @@ -189,6 +189,7 @@ done: printk("************************** KBDFRONT\n"); return dev; + error: free(msg); free(err); diff --git a/extras/mini-os/netfront.c b/extras/mini-os/netfront.c index a64fec6c9c..47f87d1eef 100644 --- a/extras/mini-os/netfront.c +++ b/extras/mini-os/netfront.c @@ -407,9 +407,9 @@ again: } snprintf(path, sizeof(path), "%s/state", nodename); - err = xenbus_switch_state(xbt, path, XenbusStateConnected); + err = xenbus_switch_state(xbt, path, XenbusStateInitialised); if (err) { - message = "switching state"; + printk("error writing net initialized: %s\n", err); goto abort_transaction; } @@ -445,6 +445,7 @@ done: { XenbusState state; char path[strlen(dev->backend) + 1 + 5 + 1]; + char frontpath[strlen(nodename) + 1 + 6 + 1]; snprintf(path, sizeof(path), "%s/state", dev->backend); xenbus_watch_path_token(XBT_NIL, path, path, &dev->events); @@ -463,6 +464,16 @@ done: snprintf(path, sizeof(path), "%s/ip", dev->backend); xenbus_read(XBT_NIL, path, ip); } + + printk("%s connected\n", dev->backend); + + snprintf(frontpath, sizeof(frontpath), "%s/state", nodename); + if((err = xenbus_switch_state(XBT_NIL, frontpath, XenbusStateConnected)) + != NULL) { + printk("error switching state: %s\n", err); + xenbus_unwatch_path_token(XBT_NIL, path, path); + goto error; + } } printk("**************************\n"); @@ -481,6 +492,7 @@ done: &rawmac[5]); return dev; + error: free(msg); free(err); diff --git a/extras/mini-os/pcifront.c b/extras/mini-os/pcifront.c index c2fbe7d178..ccbef3f0e5 100644 --- a/extras/mini-os/pcifront.c +++ b/extras/mini-os/pcifront.c @@ -143,7 +143,7 @@ struct pcifront_dev *init_pcifront(char *_nodename) char* err; char* message=NULL; int retry=0; - char* msg; + char* msg = NULL; char* nodename = _nodename ? _nodename : "device/pci/0"; int dom; @@ -206,7 +206,7 @@ again: snprintf(path, sizeof(path), "%s/state", nodename); err = xenbus_switch_state(xbt, path, XenbusStateInitialised); if (err) { - message = "switching state"; + printk("error writing pci initialized: %s\n", err); goto abort_transaction; } @@ -237,7 +237,7 @@ done: { char path[strlen(dev->backend) + 1 + 5 + 1]; - char frontpath[strlen(nodename) + 1 + 5 + 1]; + char frontpath[strlen(nodename) + 1 + 6 + 1]; XenbusState state; snprintf(path, sizeof(path), "%s/state", dev->backend); @@ -254,9 +254,9 @@ done: } snprintf(frontpath, sizeof(frontpath), "%s/state", nodename); - if ((err = xenbus_switch_state(XBT_NIL, frontpath, XenbusStateConnected)) + if((err = xenbus_switch_state(XBT_NIL, frontpath, XenbusStateConnected)) != NULL) { - printk("error switching state %s\n", err); + printk("error switching state: %s\n", err); xenbus_unwatch_path_token(XBT_NIL, path, path); goto error; } @@ -271,6 +271,7 @@ done: return dev; error: + free(msg); free(err); free_pcifront(dev); return NULL; -- cgit v1.2.3