system-linux: fix race condition on bringing up wireless devices
[project/netifd.git] / bonding.c
index 402c71cb7a89a62eeda5fdde0a59014eaabcf233..1f13148fea41c929bb5dcf5db6771de722d6f072 100644 (file)
--- a/bonding.c
+++ b/bonding.c
@@ -442,10 +442,10 @@ bonding_reload(struct device *dev, struct blob_attr *attr)
        struct blob_attr *tb_dev[__DEV_ATTR_MAX];
        struct blob_attr *tb_b[__BOND_ATTR_MAX];
        enum dev_change_type ret = DEV_CONFIG_APPLIED;
-       unsigned long diff;
+       unsigned long diff[2] = {};
        struct bonding_device *bdev;
 
-       BUILD_BUG_ON(sizeof(diff) < __BOND_ATTR_MAX / 8);
+       BUILD_BUG_ON(sizeof(diff[0]) < __BOND_ATTR_MAX / 8);
        BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
 
        bdev = container_of(dev, struct bonding_device, dev);
@@ -472,17 +472,16 @@ bonding_reload(struct device *dev, struct blob_attr *attr)
                blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, otb_dev,
                        blob_data(bdev->config_data), blob_len(bdev->config_data));
 
-               diff = 0;
-               uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff);
-               if (diff)
+               uci_blob_diff(tb_dev, otb_dev, &device_attr_list, diff);
+               if (diff[0] | diff[1])
                    ret = DEV_CONFIG_RESTART;
 
                blobmsg_parse(bonding_attrs, __BOND_ATTR_MAX, otb_b,
                        blob_data(bdev->config_data), blob_len(bdev->config_data));
 
-               diff = 0;
-               uci_blob_diff(tb_b, otb_b, &bonding_attr_list, &diff);
-               if (diff & ~(1 << BOND_ATTR_PORTS))
+               diff[0] = 0;
+               uci_blob_diff(tb_b, otb_b, &bonding_attr_list, diff);
+               if (diff[0] & ~(1 << BOND_ATTR_PORTS))
                    ret = DEV_CONFIG_RESTART;
 
                bonding_config_init(dev);