Merge remote-tracking branch 'omap_dss2/for-next'
[deliverable/linux.git] / net / rxrpc / peer_event.c
index 8940674b5e08f1abd90b0906b8c051ea8465e3e2..c8948936c6fccf92ea6bd608d8b1495cc40ea56b 100644 (file)
@@ -129,15 +129,14 @@ void rxrpc_error_report(struct sock *sk)
                _leave("UDP socket errqueue empty");
                return;
        }
+       rxrpc_new_skb(skb);
        serr = SKB_EXT_ERR(skb);
        if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) {
                _leave("UDP empty message");
-               kfree_skb(skb);
+               rxrpc_free_skb(skb);
                return;
        }
 
-       rxrpc_new_skb(skb);
-
        rcu_read_lock();
        peer = rxrpc_lookup_peer_icmp_rcu(local, skb);
        if (peer && !rxrpc_get_peer_maybe(peer))
@@ -248,13 +247,20 @@ void rxrpc_peer_error_distributor(struct work_struct *work)
        struct rxrpc_peer *peer =
                container_of(work, struct rxrpc_peer, error_distributor);
        struct rxrpc_call *call;
-       int error_report;
+       enum rxrpc_call_completion compl;
+       int error;
 
        _enter("");
 
-       error_report = READ_ONCE(peer->error_report);
+       error = READ_ONCE(peer->error_report);
+       if (error < RXRPC_LOCAL_ERROR_OFFSET) {
+               compl = RXRPC_CALL_NETWORK_ERROR;
+       } else {
+               compl = RXRPC_CALL_LOCAL_ERROR;
+               error -= RXRPC_LOCAL_ERROR_OFFSET;
+       }
 
-       _debug("ISSUE ERROR %d", error_report);
+       _debug("ISSUE ERROR %s %d", rxrpc_call_completions[compl], error);
 
        spin_lock_bh(&peer->lock);
 
@@ -262,16 +268,10 @@ void rxrpc_peer_error_distributor(struct work_struct *work)
                call = hlist_entry(peer->error_targets.first,
                                   struct rxrpc_call, error_link);
                hlist_del_init(&call->error_link);
+               rxrpc_see_call(call);
 
-               write_lock(&call->state_lock);
-               if (call->state != RXRPC_CALL_COMPLETE &&
-                   call->state < RXRPC_CALL_NETWORK_ERROR) {
-                       call->error_report = error_report;
-                       call->state = RXRPC_CALL_NETWORK_ERROR;
-                       set_bit(RXRPC_CALL_EV_RCVD_ERROR, &call->events);
-                       rxrpc_queue_call(call);
-               }
-               write_unlock(&call->state_lock);
+               if (rxrpc_set_call_completion(call, compl, 0, error))
+                       rxrpc_notify_socket(call);
        }
 
        spin_unlock_bh(&peer->lock);
This page took 0.0315260000000001 seconds and 5 git commands to generate.