Messages in this thread Patch in this message | | | Date | Wed, 05 Nov 2008 18:06:56 -0600 | From | Tom Tucker <> | Subject | [PATCH] 9pnet: Use list_del_init when removing req_list elements |
| |
The p9_req_t structures are reused when tags are reused. For this reason, the req_list list heads need to be re-initialized when deleted or a subsequent list_add can corrupt the list and/or BUG_ON if list debug is enabled.
Signed-off-by: Tom Tucker <tom@opengridcomputing.com> --- net/9p/trans_fd.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 1df0356..fc78336 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c @@ -213,7 +213,7 @@ static void p9_conn_cancel(struct p9_conn *m, int err) spin_unlock_irqrestore(&m->client->lock, flags); list_for_each_entry_safe(req, rtmp, &cancel_list, req_list) { - list_del(&req->req_list); + list_del_init(&req->req_list); P9_DPRINTK(P9_DEBUG_ERROR, "call back req %p\n", req); p9_client_cb(m->client, req); } @@ -361,7 +361,7 @@ static void p9_read_work(struct work_struct *work) if ((m->req) && (m->rpos == m->rsize)) { /* packet is read in */ P9_DPRINTK(P9_DEBUG_TRANS, "got new packet\n"); spin_lock(&m->client->lock); - list_del(&m->req->req_list); + list_del_init(&m->req->req_list); spin_unlock(&m->client->lock); p9_client_cb(m->client, m->req); @@ -683,7 +683,7 @@ static int p9_fd_cancel(struct p9_client *client, struct p9_req_t *req) P9_DPRINTK(P9_DEBUG_TRANS, "client %p req %p\n", client, req); spin_lock(&client->lock); - list_del(&req->req_list); + list_del_init(&req->req_list); if (req->status == REQ_STATUS_UNSENT) { req->status = REQ_STATUS_FLSHD;
| |