diff options
author | Mark Brown <broonie@kernel.org> | 2019-06-26 12:39:34 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2019-06-26 12:39:34 +0100 |
commit | 53c8b29abe42e5601cfa0ea5962532f0cfdec8a0 (patch) | |
tree | cad53f42ce7a03c39a984bcdbcc42cd47f1af6f9 /drivers/xen/xenbus/xenbus_dev_frontend.c | |
parent | e3303268f9cfa4eb7c2217df471417d4327109fd (diff) | |
parent | 4b972a01a7da614b4796475f933094751a295a2f (diff) | |
download | talos-op-linux-53c8b29abe42e5601cfa0ea5962532f0cfdec8a0.tar.gz talos-op-linux-53c8b29abe42e5601cfa0ea5962532f0cfdec8a0.zip |
Merge tag 'v5.2-rc6' into asoc-5.3
Linux 5.2-rc6
Diffstat (limited to 'drivers/xen/xenbus/xenbus_dev_frontend.c')
-rw-r--r-- | drivers/xen/xenbus/xenbus_dev_frontend.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c index faf452d0edf0..08adc590f631 100644 --- a/drivers/xen/xenbus/xenbus_dev_frontend.c +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c @@ -62,6 +62,8 @@ #include "xenbus.h" +unsigned int xb_dev_generation_id; + /* * An element of a list of outstanding transactions, for which we're * still waiting a reply. @@ -69,6 +71,7 @@ struct xenbus_transaction_holder { struct list_head list; struct xenbus_transaction handle; + unsigned int generation_id; }; /* @@ -441,6 +444,7 @@ static int xenbus_write_transaction(unsigned msg_type, rc = -ENOMEM; goto out; } + trans->generation_id = xb_dev_generation_id; list_add(&trans->list, &u->transactions); } else if (msg->hdr.tx_id != 0 && !xenbus_get_transaction(u, msg->hdr.tx_id)) @@ -449,6 +453,20 @@ static int xenbus_write_transaction(unsigned msg_type, !(msg->hdr.len == 2 && (!strcmp(msg->body, "T") || !strcmp(msg->body, "F")))) return xenbus_command_reply(u, XS_ERROR, "EINVAL"); + else if (msg_type == XS_TRANSACTION_END) { + trans = xenbus_get_transaction(u, msg->hdr.tx_id); + if (trans && trans->generation_id != xb_dev_generation_id) { + list_del(&trans->list); + kfree(trans); + if (!strcmp(msg->body, "T")) + return xenbus_command_reply(u, XS_ERROR, + "EAGAIN"); + else + return xenbus_command_reply(u, + XS_TRANSACTION_END, + "OK"); + } + } rc = xenbus_dev_request_and_reply(&msg->hdr, u); if (rc && trans) { |