| From 437916e753cf24d01f1ca785d6831bdafff4cbf6 Mon Sep 17 00:00:00 2001 |
| From: Alexander Usyskin <alexander.usyskin@intel.com> |
| Date: Wed, 14 Dec 2016 17:56:52 +0200 |
| Subject: [PATCH] mei: move write cb to completion on credentials failures |
| |
| commit e09ee853c92011860a4bd2fbdf6126f60fc16bd3 upstream. |
| |
| The credentials handling was pushed to the write handlers |
| but error handling wasn't done properly. |
| Move write callbacks to completion queue to destroy them |
| and to notify a blocked writer about the failure |
| |
| Fixes: 136698e535cd1 (mei: push credentials inside the irq write handler) |
| Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com> |
| Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| [PG: refresh for flow ---> tx_flow function rename.] |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c |
| index 75be3d5b2430..454ecfb167d0 100644 |
| --- a/drivers/misc/mei/client.c |
| +++ b/drivers/misc/mei/client.c |
| @@ -1559,7 +1559,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, |
| |
| rets = first_chunk ? mei_cl_flow_ctrl_creds(cl, cb->fp) : 1; |
| if (rets < 0) |
| - return rets; |
| + goto err; |
| |
| if (rets == 0) { |
| cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); |
| @@ -1593,11 +1593,8 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, |
| cb->buf.size, cb->buf_idx); |
| |
| rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx); |
| - if (rets) { |
| - cl->status = rets; |
| - list_move_tail(&cb->list, &cmpl_list->list); |
| - return rets; |
| - } |
| + if (rets) |
| + goto err; |
| |
| cl->status = 0; |
| cl->writing_state = MEI_WRITING; |
| @@ -1605,14 +1602,21 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, |
| cb->completed = mei_hdr.msg_complete == 1; |
| |
| if (first_chunk) { |
| - if (mei_cl_flow_ctrl_reduce(cl)) |
| - return -EIO; |
| + if (mei_cl_flow_ctrl_reduce(cl)) { |
| + rets = -EIO; |
| + goto err; |
| + } |
| } |
| |
| if (mei_hdr.msg_complete) |
| list_move_tail(&cb->list, &dev->write_waiting_list.list); |
| |
| return 0; |
| + |
| +err: |
| + cl->status = rets; |
| + list_move_tail(&cb->list, &cmpl_list->list); |
| + return rets; |
| } |
| |
| /** |
| -- |
| 2.10.1 |
| |