can: add protocol counter for AF_CAN sockets
authorDavide Caratti <dcaratti@redhat.com>
Fri, 14 Mar 2025 11:39:49 +0000 (12:39 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 14 Mar 2025 12:27:33 +0000 (13:27 +0100)
The third column in the output of the following command:

| # grep CAN /proc/net/protocols

is systematically '0': use sock_prot_inuse_add() to account for the number
of sockets for each protocol on top of AF_CAN family.

Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Link: https://patch.msgid.link/9db5d0e6c11b232ad895885616f1258882a32f61.1741952160.git.dcaratti@redhat.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
net/can/af_can.c
net/can/bcm.c
net/can/isotp.c
net/can/raw.c

index 01f3fbb3b67dc687a82661395c5f99e325c54120..7b191dbe36930bf9c56565e3d13f4c8cab6712f0 100644 (file)
@@ -172,6 +172,8 @@ static int can_create(struct net *net, struct socket *sock, int protocol,
                sock_orphan(sk);
                sock_put(sk);
                sock->sk = NULL;
+       } else {
+               sock_prot_inuse_add(net, sk->sk_prot, 1);
        }
 
  errout:
index 217049fa496e9db80bf0ffaf97d66ac731042ee6..6dc041e054ba12fed58bf215904dcbbeb1b056e3 100644 (file)
@@ -1625,6 +1625,7 @@ static int bcm_release(struct socket *sock)
        sock->sk = NULL;
 
        release_sock(sk);
+       sock_prot_inuse_add(net, sk->sk_prot, -1);
        sock_put(sk);
 
        return 0;
index 16046931542a57cbf1e35c5d0c402db00cff1bd2..789583c62f980a49b44c1f4fd458716e83ef2f5e 100644 (file)
@@ -1239,6 +1239,7 @@ static int isotp_release(struct socket *sock)
        sock->sk = NULL;
 
        release_sock(sk);
+       sock_prot_inuse_add(net, sk->sk_prot, -1);
        sock_put(sk);
 
        return 0;
index 9b1d5f036f57996f7d10b03aab95cd0a15de701e..020f21430b1d84517574cb30f9bf25cfa51e2eed 100644 (file)
@@ -397,11 +397,13 @@ static int raw_release(struct socket *sock)
 {
        struct sock *sk = sock->sk;
        struct raw_sock *ro;
+       struct net *net;
 
        if (!sk)
                return 0;
 
        ro = raw_sk(sk);
+       net = sock_net(sk);
 
        spin_lock(&raw_notifier_lock);
        while (raw_busy_notifier == ro) {
@@ -421,7 +423,7 @@ static int raw_release(struct socket *sock)
                        raw_disable_allfilters(dev_net(ro->dev), ro->dev, sk);
                        netdev_put(ro->dev, &ro->dev_tracker);
                } else {
-                       raw_disable_allfilters(sock_net(sk), NULL, sk);
+                       raw_disable_allfilters(net, NULL, sk);
                }
        }
 
@@ -440,6 +442,7 @@ static int raw_release(struct socket *sock)
        release_sock(sk);
        rtnl_unlock();
 
+       sock_prot_inuse_add(net, sk->sk_prot, -1);
        sock_put(sk);
 
        return 0;