Messages in this thread | | | Subject | Re: [PATCH 1/2] xen: xenbus_dev_frontend: Fix XS_TRANSACTION_END handling | From | Boris Ostrovsky <> | Date | Sat, 10 Feb 2018 11:53:58 -0500 |
| |
On 02/07/2018 05:22 PM, Simon Gaiser wrote: > Commit fd8aa9095a95 ("xen: optimize xenbus driver for multiple > concurrent xenstore accesses") made a subtle change to the semantic of > xenbus_dev_request_and_reply() and xenbus_transaction_end(). > > Before on an error response to XS_TRANSACTION_END > xenbus_dev_request_and_reply() would not decrement the active > transaction counter. But xenbus_transaction_end() has always counted the > transaction as finished regardless of the response. > > The new behavior is that xenbus_dev_request_and_reply() and > xenbus_transaction_end() will always count the transaction as finished > regardless the response code (handled in xs_request_exit()). > > But xenbus_dev_frontend tries to end a transaction on closing of the > device if the XS_TRANSACTION_END failed before. Trying to close the > transaction twice corrupts the reference count. So fix this by also > considering a transaction closed if we have sent XS_TRANSACTION_END once > regardless of the return code. > > Cc: <stable@vger.kernel.org> # 4.11 > Fixes: fd8aa9095a95 ("xen: optimize xenbus driver for multiple concurrent xenstore accesses") > Signed-off-by: Simon Gaiser <simon@invisiblethingslab.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
(although I'd prefer Juergen to also take a look at this)
> --- > drivers/xen/xenbus/xenbus_dev_frontend.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c > index f3b089b7c0b6..d2edbc79384a 100644 > --- a/drivers/xen/xenbus/xenbus_dev_frontend.c > +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c > @@ -365,7 +365,7 @@ void xenbus_dev_queue_reply(struct xb_req_data *req) > if (WARN_ON(rc)) > goto out; > } > - } else if (req->msg.type == XS_TRANSACTION_END) { > + } else if (req->type == XS_TRANSACTION_END) { > trans = xenbus_get_transaction(u, req->msg.tx_id); > if (WARN_ON(!trans)) > goto out; >
| |