bridge: update sysfs link names if port device names have changed
[safe/jmp/linux-2.6] / net / rxrpc / ar-recvmsg.c
index e947d5c..0c65013 100644 (file)
@@ -19,7 +19,7 @@
  * removal a call's user ID from the socket tree to make the user ID available
  * again and so that it won't be seen again in association with that call
  */
-static void rxrpc_remove_user_ID(struct rxrpc_sock *rx, struct rxrpc_call *call)
+void rxrpc_remove_user_ID(struct rxrpc_sock *rx, struct rxrpc_call *call)
 {
        _debug("RELEASE CALL %d", call->debug_id);
 
@@ -33,7 +33,7 @@ static void rxrpc_remove_user_ID(struct rxrpc_sock *rx, struct rxrpc_call *call)
        read_lock_bh(&call->state_lock);
        if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) &&
            !test_and_set_bit(RXRPC_CALL_RELEASE, &call->events))
-               schedule_work(&call->processor);
+               rxrpc_queue_call(call);
        read_unlock_bh(&call->state_lock);
 }
 
@@ -91,7 +91,7 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock,
 
                        /* wait for a message to turn up */
                        release_sock(&rx->sk);
-                       prepare_to_wait_exclusive(rx->sk.sk_sleep, &wait,
+                       prepare_to_wait_exclusive(sk_sleep(&rx->sk), &wait,
                                                  TASK_INTERRUPTIBLE);
                        ret = sock_error(&rx->sk);
                        if (ret)
@@ -102,7 +102,7 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock,
                                        goto wait_interrupted;
                                timeo = schedule_timeout(timeo);
                        }
-                       finish_wait(rx->sk.sk_sleep, &wait);
+                       finish_wait(sk_sleep(&rx->sk), &wait);
                        lock_sock(&rx->sk);
                        continue;
                }
@@ -143,9 +143,10 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock,
                /* copy the peer address and timestamp */
                if (!continue_call) {
                        if (msg->msg_name && msg->msg_namelen > 0)
-                               memcpy(&msg->msg_name, &call->conn->trans->peer->srx,
+                               memcpy(msg->msg_name,
+                                      &call->conn->trans->peer->srx,
                                       sizeof(call->conn->trans->peer->srx));
-                       sock_recv_timestamp(msg, &rx->sk, skb);
+                       sock_recv_ts_and_drops(msg, &rx->sk, skb);
                }
 
                /* receive the message */
@@ -355,7 +356,7 @@ csum_copy_error:
 wait_interrupted:
        ret = sock_intr_errno(timeo);
 wait_error:
-       finish_wait(rx->sk.sk_sleep, &wait);
+       finish_wait(sk_sleep(&rx->sk), &wait);
        if (continue_call)
                rxrpc_put_call(continue_call);
        if (copied)
@@ -364,3 +365,74 @@ wait_error:
        return copied;
 
 }
+
+/**
+ * rxrpc_kernel_data_delivered - Record delivery of data message
+ * @skb: Message holding data
+ *
+ * Record the delivery of a data message.  This permits RxRPC to keep its
+ * tracking correct.  The socket buffer will be deleted.
+ */
+void rxrpc_kernel_data_delivered(struct sk_buff *skb)
+{
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+       struct rxrpc_call *call = sp->call;
+
+       ASSERTCMP(ntohl(sp->hdr.seq), >=, call->rx_data_recv);
+       ASSERTCMP(ntohl(sp->hdr.seq), <=, call->rx_data_recv + 1);
+       call->rx_data_recv = ntohl(sp->hdr.seq);
+
+       ASSERTCMP(ntohl(sp->hdr.seq), >, call->rx_data_eaten);
+       rxrpc_free_skb(skb);
+}
+
+EXPORT_SYMBOL(rxrpc_kernel_data_delivered);
+
+/**
+ * rxrpc_kernel_is_data_last - Determine if data message is last one
+ * @skb: Message holding data
+ *
+ * Determine if data message is last one for the parent call.
+ */
+bool rxrpc_kernel_is_data_last(struct sk_buff *skb)
+{
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+
+       ASSERTCMP(skb->mark, ==, RXRPC_SKB_MARK_DATA);
+
+       return sp->hdr.flags & RXRPC_LAST_PACKET;
+}
+
+EXPORT_SYMBOL(rxrpc_kernel_is_data_last);
+
+/**
+ * rxrpc_kernel_get_abort_code - Get the abort code from an RxRPC abort message
+ * @skb: Message indicating an abort
+ *
+ * Get the abort code from an RxRPC abort message.
+ */
+u32 rxrpc_kernel_get_abort_code(struct sk_buff *skb)
+{
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+
+       ASSERTCMP(skb->mark, ==, RXRPC_SKB_MARK_REMOTE_ABORT);
+
+       return sp->call->abort_code;
+}
+
+EXPORT_SYMBOL(rxrpc_kernel_get_abort_code);
+
+/**
+ * rxrpc_kernel_get_error - Get the error number from an RxRPC error message
+ * @skb: Message indicating an error
+ *
+ * Get the error number from an RxRPC error message.
+ */
+int rxrpc_kernel_get_error_number(struct sk_buff *skb)
+{
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+
+       return sp->error;
+}
+
+EXPORT_SYMBOL(rxrpc_kernel_get_error_number);