diff options
Diffstat (limited to 'net/dsa/dsa2.c')
| -rw-r--r-- | net/dsa/dsa2.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index b29262eee00b..e9911b18bdbf 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -170,7 +170,7 @@ void dsa_bridge_num_put(const struct net_device *bridge_dev, int bridge_num)  	/* Check if the bridge is still in use, otherwise it is time  	 * to clean it up so we can reuse this bridge_num later.  	 */ -	if (!dsa_bridge_num_find(bridge_dev)) +	if (dsa_bridge_num_find(bridge_dev) < 0)  		clear_bit(bridge_num, &dsa_fwd_offloading_bridges);  } @@ -811,7 +811,9 @@ static int dsa_switch_setup_tag_protocol(struct dsa_switch *ds)  		if (!dsa_is_cpu_port(ds, port))  			continue; +		rtnl_lock();  		err = ds->ops->change_tag_protocol(ds, port, tag_ops->proto); +		rtnl_unlock();  		if (err) {  			dev_err(ds->dev, "Unable to use tag protocol \"%s\": %pe\n",  				tag_ops->name, ERR_PTR(err)); @@ -1372,12 +1374,15 @@ static int dsa_switch_parse_ports_of(struct dsa_switch *ds,  	for_each_available_child_of_node(ports, port) {  		err = of_property_read_u32(port, "reg", ®); -		if (err) +		if (err) { +			of_node_put(port);  			goto out_put_node; +		}  		if (reg >= ds->num_ports) {  			dev_err(ds->dev, "port %pOF index %u exceeds num_ports (%zu)\n",  				port, reg, ds->num_ports); +			of_node_put(port);  			err = -EINVAL;  			goto out_put_node;  		} @@ -1385,8 +1390,10 @@ static int dsa_switch_parse_ports_of(struct dsa_switch *ds,  		dp = dsa_to_port(ds, reg);  		err = dsa_port_parse_of(dp, port); -		if (err) +		if (err) { +			of_node_put(port);  			goto out_put_node; +		}  	}  out_put_node:  | 
