net/sched: taprio: Fix init procedure
[linux-2.6-microblaze.git] / net / can / isotp.c
index be6183f..caaa532 100644 (file)
@@ -168,7 +168,7 @@ static enum hrtimer_restart isotp_rx_timer_handler(struct hrtimer *hrtimer)
                /* report 'connection timed out' */
                sk->sk_err = ETIMEDOUT;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
 
                /* reset rx state */
                so->rx.state = ISOTP_IDLE;
@@ -225,8 +225,8 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 flowstatus)
 
        can_send_ret = can_send(nskb, 1);
        if (can_send_ret)
-               pr_notice_once("can-isotp: %s: can_send_ret %d\n",
-                              __func__, can_send_ret);
+               pr_notice_once("can-isotp: %s: can_send_ret %pe\n",
+                              __func__, ERR_PTR(can_send_ret));
 
        dev_put(dev);
 
@@ -339,7 +339,7 @@ static int isotp_rcv_fc(struct isotp_sock *so, struct canfd_frame *cf, int ae)
                /* malformed PDU - report 'not a data message' */
                sk->sk_err = EBADMSG;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
 
                so->tx.state = ISOTP_IDLE;
                wake_up_interruptible(&so->wait);
@@ -392,7 +392,7 @@ static int isotp_rcv_fc(struct isotp_sock *so, struct canfd_frame *cf, int ae)
                /* overflow on receiver side - report 'message too long' */
                sk->sk_err = EMSGSIZE;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
                fallthrough;
 
        default:
@@ -420,7 +420,7 @@ static int isotp_rcv_sf(struct sock *sk, struct canfd_frame *cf, int pcilen,
                /* malformed PDU - report 'not a data message' */
                sk->sk_err = EBADMSG;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
                return 1;
        }
 
@@ -535,7 +535,7 @@ static int isotp_rcv_cf(struct sock *sk, struct canfd_frame *cf, int ae,
                /* wrong sn detected - report 'illegal byte sequence' */
                sk->sk_err = EILSEQ;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
 
                /* reset rx state */
                so->rx.state = ISOTP_IDLE;
@@ -559,7 +559,7 @@ static int isotp_rcv_cf(struct sock *sk, struct canfd_frame *cf, int ae,
                        /* malformed PDU - report 'not a data message' */
                        sk->sk_err = EBADMSG;
                        if (!sock_flag(sk, SOCK_DEAD))
-                               sk->sk_error_report(sk);
+                               sk_error_report(sk);
                        return 1;
                }
 
@@ -758,7 +758,7 @@ static enum hrtimer_restart isotp_tx_timer_handler(struct hrtimer *hrtimer)
                /* report 'communication error on send' */
                sk->sk_err = ECOMM;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
 
                /* reset tx state */
                so->tx.state = ISOTP_IDLE;
@@ -801,10 +801,12 @@ isotp_tx_burst:
                can_skb_set_owner(skb, sk);
 
                can_send_ret = can_send(skb, 1);
-               if (can_send_ret)
-                       pr_notice_once("can-isotp: %s: can_send_ret %d\n",
-                                      __func__, can_send_ret);
-
+               if (can_send_ret) {
+                       pr_notice_once("can-isotp: %s: can_send_ret %pe\n",
+                                      __func__, ERR_PTR(can_send_ret));
+                       if (can_send_ret == -ENOBUFS)
+                               pr_notice_once("can-isotp: tx queue is full, increasing txqueuelen may prevent this error\n");
+               }
                if (so->tx.idx >= so->tx.len) {
                        /* we are done */
                        so->tx.state = ISOTP_IDLE;
@@ -950,8 +952,8 @@ static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
        err = can_send(skb, 1);
        dev_put(dev);
        if (err) {
-               pr_notice_once("can-isotp: %s: can_send_ret %d\n",
-                              __func__, err);
+               pr_notice_once("can-isotp: %s: can_send_ret %pe\n",
+                              __func__, ERR_PTR(err));
                return err;
        }
 
@@ -1028,9 +1030,6 @@ static int isotp_release(struct socket *sock)
 
        lock_sock(sk);
 
-       hrtimer_cancel(&so->txtimer);
-       hrtimer_cancel(&so->rxtimer);
-
        /* remove current filters & unregister */
        if (so->bound && (!(so->opt.flags & CAN_ISOTP_SF_BROADCAST))) {
                if (so->ifindex) {
@@ -1042,10 +1041,14 @@ static int isotp_release(struct socket *sock)
                                                  SINGLE_MASK(so->rxid),
                                                  isotp_rcv, sk);
                                dev_put(dev);
+                               synchronize_rcu();
                        }
                }
        }
 
+       hrtimer_cancel(&so->txtimer);
+       hrtimer_cancel(&so->rxtimer);
+
        so->ifindex = 0;
        so->bound = 0;
 
@@ -1155,7 +1158,7 @@ out:
        if (notify_enetdown) {
                sk->sk_err = ENETDOWN;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
        }
 
        return err;
@@ -1354,13 +1357,13 @@ static void isotp_notify(struct isotp_sock *so, unsigned long msg,
 
                sk->sk_err = ENODEV;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
                break;
 
        case NETDEV_DOWN:
                sk->sk_err = ENETDOWN;
                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_error_report(sk);
+                       sk_error_report(sk);
                break;
        }
 }
@@ -1482,7 +1485,7 @@ static __init int isotp_module_init(void)
 
        err = can_proto_register(&isotp_can_proto);
        if (err < 0)
-               pr_err("can: registration of isotp protocol failed\n");
+               pr_err("can: registration of isotp protocol failed %pe\n", ERR_PTR(err));
        else
                register_netdevice_notifier(&canisotp_notifier);