mctp: Warn if pointer is set for a wrong dev type
authorMatt Johnston <matt@codeconstruct.com.au>
Wed, 29 Sep 2021 07:26:14 +0000 (15:26 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Sep 2021 10:00:12 +0000 (11:00 +0100)
Should not occur but is a sanity check.

May help tracking down Trinity reported issue
https://lore.kernel.org/lkml/20210913030701.GA5926@xsang-OptiPlex-9020/

Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mctp/device.c

index f556c6d01abcad29feeb72f460780a4d93c989be..3827d62f52c9bf92472541c17aed6c4072c3f30e 100644 (file)
@@ -337,12 +337,26 @@ static int mctp_set_link_af(struct net_device *dev, const struct nlattr *attr,
        return 0;
 }
 
+/* Matches netdev types that should have MCTP handling */
+static bool mctp_known(struct net_device *dev)
+{
+       /* only register specific types (inc. NONE for TUN devices) */
+       return dev->type == ARPHRD_MCTP ||
+                  dev->type == ARPHRD_LOOPBACK ||
+                  dev->type == ARPHRD_NONE;
+}
+
 static void mctp_unregister(struct net_device *dev)
 {
        struct mctp_dev *mdev;
 
        mdev = mctp_dev_get_rtnl(dev);
-
+       if (mctp_known(dev) != (bool)mdev) {
+               // Sanity check, should match what was set in mctp_register
+               netdev_warn(dev, "%s: mdev pointer %d but type (%d) match is %d",
+                           __func__, (bool)mdev, mctp_known(dev), dev->type);
+               return;
+       }
        if (!mdev)
                return;
 
@@ -360,16 +374,19 @@ static int mctp_register(struct net_device *dev)
        struct mctp_dev *mdev;
 
        /* Already registered? */
-       if (rtnl_dereference(dev->mctp_ptr))
-               return 0;
+       mdev = rtnl_dereference(dev->mctp_ptr);
 
-       /* only register specific types (inc. NONE for TUN devices) */
-       if (!(dev->type == ARPHRD_MCTP ||
-             dev->type == ARPHRD_LOOPBACK ||
-             dev->type == ARPHRD_NONE)) {
+       if (mdev) {
+               if (!mctp_known(dev))
+                       netdev_warn(dev, "%s: mctp_dev set for unknown type %d",
+                                   __func__, dev->type);
                return 0;
        }
 
+       /* only register specific types */
+       if (!mctp_known(dev))
+               return 0;
+
        mdev = mctp_add_dev(dev);
        if (IS_ERR(mdev))
                return PTR_ERR(mdev);