summaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorAndy Grover <andy.grover@oracle.com>2010-02-19 18:04:58 -0800
committerAndy Grover <andy.grover@oracle.com>2010-09-08 18:12:04 -0700
commit940786eb0a0faf3f30898a1cc7c1540d54c1aff6 (patch)
treea8ca1a5df3154b57cc43380ff529898215c625a3 /net/rds
parentee4c7b47e46a9dea789aadb8279c8505f755b3ee (diff)
downloadlinux-940786eb0a0faf3f30898a1cc7c1540d54c1aff6.tar.bz2
RDS: queue failure notifications for dropped atomic ops
When dropping ops in the send queue, we notify the client of failed rdma ops they asked for notifications on, but not atomic ops. It should be for both. Signed-off-by: Andy Grover <andy.grover@oracle.com>
Diffstat (limited to 'net/rds')
-rw-r--r--net/rds/send.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/net/rds/send.c b/net/rds/send.c
index ad89a63c4304..cdca9747fcbc 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -512,9 +512,10 @@ EXPORT_SYMBOL_GPL(rds_atomic_send_complete);
* socket, socket lock) and can just move the notifier.
*/
static inline void
-__rds_rdma_send_complete(struct rds_sock *rs, struct rds_message *rm, int status)
+__rds_send_complete(struct rds_sock *rs, struct rds_message *rm, int status)
{
struct rm_rdma_op *ro;
+ struct rm_atomic_op *ao;
ro = &rm->rdma;
if (ro->op_active && ro->op_notify && ro->op_notifier) {
@@ -523,6 +524,13 @@ __rds_rdma_send_complete(struct rds_sock *rs, struct rds_message *rm, int status
ro->op_notifier = NULL;
}
+ ao = &rm->atomic;
+ if (ao->op_active && ao->op_notify && ao->op_notifier) {
+ ao->op_notifier->n_status = status;
+ list_add_tail(&ao->op_notifier->n_list, &rs->rs_notify_queue);
+ ao->op_notifier = NULL;
+ }
+
/* No need to wake the app - caller does this */
}
@@ -733,7 +741,7 @@ void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in *dest)
spin_lock_irqsave(&rm->m_rs_lock, flags);
spin_lock(&rs->rs_lock);
- __rds_rdma_send_complete(rs, rm, RDS_RDMA_CANCELED);
+ __rds_send_complete(rs, rm, RDS_RDMA_CANCELED);
spin_unlock(&rs->rs_lock);
rm->m_rs = NULL;