diff options
author | Simon Derr <simon.derr@bull.net> | 2013-06-21 09:32:43 -0400 |
---|---|---|
committer | Eric Van Hensbergen <ericvh@gmail.com> | 2013-07-07 23:18:18 -0400 |
commit | 80b45261a0b263536b043c5ccfc4ba4fc27c2acc (patch) | |
tree | b4d06110f4f121b8e2c26e521c164f5c668e2cc0 /net/9p | |
parent | 1cff33069a4a1ac9ed080756113ecd17ad408282 (diff) |
9P: Add cancelled() to the transport functions.
RDMA needs to post a buffer for each incoming reply.
Hence it needs to keep count of these and needs to be
aware of whether a flushed request has received a reply
or not.
This patch adds the cancelled() callback to the transport modules.
It is called when RFLUSH has been received and that the corresponding
request will never receive a reply.
Signed-off-by: Simon Derr <simon.derr@bull.net>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'net/9p')
-rw-r--r-- | net/9p/client.c | 12 | ||||
-rw-r--r-- | net/9p/trans_rdma.c | 11 |
2 files changed, 20 insertions, 3 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index d18a0b22f62c..8b93cae2d11d 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -658,12 +658,18 @@ static int p9_client_flush(struct p9_client *c, struct p9_req_t *oldreq) | |||
658 | 658 | ||
659 | /* | 659 | /* |
660 | * if we haven't received a response for oldreq, | 660 | * if we haven't received a response for oldreq, |
661 | * remove it from the list. | 661 | * remove it from the list, and notify the transport |
662 | * layer that the reply will never arrive. | ||
662 | */ | 663 | */ |
663 | spin_lock(&c->lock); | 664 | spin_lock(&c->lock); |
664 | if (oldreq->status == REQ_STATUS_FLSH) | 665 | if (oldreq->status == REQ_STATUS_FLSH) { |
665 | list_del(&oldreq->req_list); | 666 | list_del(&oldreq->req_list); |
666 | spin_unlock(&c->lock); | 667 | spin_unlock(&c->lock); |
668 | if (c->trans_mod->cancelled) | ||
669 | c->trans_mod->cancelled(c, req); | ||
670 | } else { | ||
671 | spin_unlock(&c->lock); | ||
672 | } | ||
667 | 673 | ||
668 | p9_free_req(c, req); | 674 | p9_free_req(c, req); |
669 | return 0; | 675 | return 0; |
diff --git a/net/9p/trans_rdma.c b/net/9p/trans_rdma.c index 8f68df5d2973..928f2bb9bf8d 100644 --- a/net/9p/trans_rdma.c +++ b/net/9p/trans_rdma.c | |||
@@ -588,6 +588,17 @@ static int rdma_cancel(struct p9_client *client, struct p9_req_t *req) | |||
588 | return 1; | 588 | return 1; |
589 | } | 589 | } |
590 | 590 | ||
591 | /* A request has been fully flushed without a reply. | ||
592 | * That means we have posted one buffer in excess. | ||
593 | */ | ||
594 | static int rdma_cancelled(struct p9_client *client, struct p9_req_t *req) | ||
595 | { | ||
596 | struct p9_trans_rdma *rdma = client->trans; | ||
597 | |||
598 | atomic_inc(&rdma->excess_rc); | ||
599 | return 0; | ||
600 | } | ||
601 | |||
591 | /** | 602 | /** |
592 | * trans_create_rdma - Transport method for creating atransport instance | 603 | * trans_create_rdma - Transport method for creating atransport instance |
593 | * @client: client instance | 604 | * @client: client instance |