RDS: queue failure notifications for dropped atomic ops
authorAndy Grover <andy.grover@oracle.com>
Sat, 20 Feb 2010 02:04:58 +0000 (18:04 -0800)
committerAndy Grover <andy.grover@oracle.com>
Thu, 9 Sep 2010 01:12:04 +0000 (18:12 -0700)
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>
net/rds/send.c

index ad89a63c430480277359acaef2c7d7b2fb6cf68d..cdca9747fcbcf2bfc9f7a2df6f4b69cad4bd1a11 100644 (file)
@@ -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;