summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrishna Kumar <krkumar2@in.ibm.com>2006-11-24 13:32:34 +0300
committerRoland Dreier <rolandd@cisco.com>2006-11-30 02:33:09 +0300
commitc78bb8442b14ee6704bdb323111ffa874d4bfdaa (patch)
tree356f77a9e174df5682fccb43c5f98cb4c9da6fe5
parentc9edea298e52faeb0d4ae875cb712a5d69ba1966 (diff)
downloadlinux-c78bb8442b14ee6704bdb323111ffa874d4bfdaa.tar.xz
RDMA/addr: Fix some cancellation problems in process_req()
Fix following problems in process_req() relating to cancellation: - Function is wrongly doing another addr_remote() when cancelled, which is not required. - Make failure reporting immediate by using time_after_eq(). - On cancellation, -ETIMEDOUT was returned to the callback routine instead of the more appropriate -ECANCELLED (users getting notified may want to print/return this status, eg ucma_event_handler). Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--drivers/infiniband/core/addr.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index a68d7c7df4ca..15ba51806ffd 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -225,17 +225,16 @@ static void process_req(void *data)
mutex_lock(&lock);
list_for_each_entry_safe(req, temp_req, &req_list, list) {
- if (req->status) {
+ if (req->status == -ENODATA) {
src_in = (struct sockaddr_in *) &req->src_addr;
dst_in = (struct sockaddr_in *) &req->dst_addr;
req->status = addr_resolve_remote(src_in, dst_in,
req->addr);
+ if (req->status && time_after_eq(jiffies, req->timeout))
+ req->status = -ETIMEDOUT;
+ else if (req->status == -ENODATA)
+ continue;
}
- if (req->status && time_after(jiffies, req->timeout))
- req->status = -ETIMEDOUT;
- else if (req->status == -ENODATA)
- continue;
-
list_del(&req->list);
list_add_tail(&req->list, &done_list);
}