diff options
Diffstat (limited to 'fs/9p/mux.c')
| -rw-r--r-- | fs/9p/mux.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/9p/mux.c b/fs/9p/mux.c index 945cb368d451..ea1134eb47c8 100644 --- a/fs/9p/mux.c +++ b/fs/9p/mux.c | |||
| @@ -471,10 +471,13 @@ static void v9fs_write_work(void *a) | |||
| 471 | } | 471 | } |
| 472 | 472 | ||
| 473 | spin_lock(&m->lock); | 473 | spin_lock(&m->lock); |
| 474 | req = | 474 | again: |
| 475 | list_entry(m->unsent_req_list.next, struct v9fs_req, | 475 | req = list_entry(m->unsent_req_list.next, struct v9fs_req, |
| 476 | req_list); | 476 | req_list); |
| 477 | list_move_tail(&req->req_list, &m->req_list); | 477 | list_move_tail(&req->req_list, &m->req_list); |
| 478 | if (req->err == ERREQFLUSH) | ||
| 479 | goto again; | ||
| 480 | |||
| 478 | m->wbuf = req->tcall->sdata; | 481 | m->wbuf = req->tcall->sdata; |
| 479 | m->wsize = req->tcall->size; | 482 | m->wsize = req->tcall->size; |
| 480 | m->wpos = 0; | 483 | m->wpos = 0; |
| @@ -525,7 +528,7 @@ static void process_request(struct v9fs_mux_data *m, struct v9fs_req *req) | |||
| 525 | struct v9fs_str *ename; | 528 | struct v9fs_str *ename; |
| 526 | 529 | ||
| 527 | tag = req->tag; | 530 | tag = req->tag; |
| 528 | if (req->rcall->id == RERROR && !req->err) { | 531 | if (!req->err && req->rcall->id == RERROR) { |
| 529 | ecode = req->rcall->params.rerror.errno; | 532 | ecode = req->rcall->params.rerror.errno; |
| 530 | ename = &req->rcall->params.rerror.error; | 533 | ename = &req->rcall->params.rerror.error; |
| 531 | 534 | ||
| @@ -551,7 +554,10 @@ static void process_request(struct v9fs_mux_data *m, struct v9fs_req *req) | |||
| 551 | req->err = -EIO; | 554 | req->err = -EIO; |
| 552 | } | 555 | } |
| 553 | 556 | ||
| 554 | if (req->cb && req->err != ERREQFLUSH) { | 557 | if (req->err == ERREQFLUSH) |
| 558 | return; | ||
| 559 | |||
| 560 | if (req->cb) { | ||
| 555 | dprintk(DEBUG_MUX, "calling callback tcall %p rcall %p\n", | 561 | dprintk(DEBUG_MUX, "calling callback tcall %p rcall %p\n", |
| 556 | req->tcall, req->rcall); | 562 | req->tcall, req->rcall); |
| 557 | 563 | ||
| @@ -812,6 +818,7 @@ v9fs_mux_rpc_cb(void *a, struct v9fs_fcall *tc, struct v9fs_fcall *rc, int err) | |||
| 812 | struct v9fs_mux_rpc *r; | 818 | struct v9fs_mux_rpc *r; |
| 813 | 819 | ||
| 814 | if (err == ERREQFLUSH) { | 820 | if (err == ERREQFLUSH) { |
| 821 | kfree(rc); | ||
| 815 | dprintk(DEBUG_MUX, "err req flush\n"); | 822 | dprintk(DEBUG_MUX, "err req flush\n"); |
| 816 | return; | 823 | return; |
| 817 | } | 824 | } |
