From: kaf24@firebug.cl.cam.ac.uk Date: Sat, 15 Apr 2006 21:48:08 +0000 (+0100) Subject: Read the message type out of the message before sending it to xenstored, and X-Git-Tag: RELEASE-3.0.2-3~63 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=59996283d87162e45b63b75bbf485ca5ca87ec1b;p=people%2Fvhanquez%2Fxen.git Read the message type out of the message before sending it to xenstored, and use that saved value when handling the reply. Xenstored will leave the message type intact, _except_ when returning an error, in which case it will change the type to XS_ERROR. This meant that we failed to remove a transaction from our internal list if xenstored returned EAGAIN, as we did not realise that the message was XS_TRANSACTION_END. This manifested itself as the intended behaviour until the connection was closed, at which point all of those failed transactions would erroneously be aborted. Signed-off-by: Ewan Mellor --- diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c index 282cdafb9..cb00af2da 100644 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c @@ -114,6 +114,7 @@ static ssize_t xenbus_dev_write(struct file *filp, { struct xenbus_dev_data *u = filp->private_data; struct xenbus_dev_transaction *trans = NULL; + uint32_t msg_type; void *reply; if ((len + u->len) > sizeof(u->u.buffer)) @@ -126,7 +127,9 @@ static ssize_t xenbus_dev_write(struct file *filp, if (u->len < (sizeof(u->u.msg) + u->u.msg.len)) return len; - switch (u->u.msg.type) { + msg_type = u->u.msg.type; + + switch (msg_type) { case XS_TRANSACTION_START: case XS_TRANSACTION_END: case XS_DIRECTORY: @@ -138,7 +141,7 @@ static ssize_t xenbus_dev_write(struct file *filp, case XS_MKDIR: case XS_RM: case XS_SET_PERMS: - if (u->u.msg.type == XS_TRANSACTION_START) { + if (msg_type == XS_TRANSACTION_START) { trans = kmalloc(sizeof(*trans), GFP_KERNEL); if (!trans) return -ENOMEM; @@ -150,10 +153,10 @@ static ssize_t xenbus_dev_write(struct file *filp, return PTR_ERR(reply); } - if (u->u.msg.type == XS_TRANSACTION_START) { + if (msg_type == XS_TRANSACTION_START) { trans->handle = simple_strtoul(reply, NULL, 0); list_add(&trans->list, &u->transactions); - } else if (u->u.msg.type == XS_TRANSACTION_END) { + } else if (msg_type == XS_TRANSACTION_END) { list_for_each_entry(trans, &u->transactions, list) if (trans->handle == u->u.msg.tx_id) break;