diff options
Diffstat (limited to 'drivers/net/macsec.c')
| -rw-r--r-- | drivers/net/macsec.c | 34 | 
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 937f5b1f04ff..bf8ac7a3ded7 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -2593,7 +2593,7 @@ static int macsec_upd_offload(struct sk_buff *skb, struct genl_info *info)  	const struct macsec_ops *ops;  	struct macsec_context ctx;  	struct macsec_dev *macsec; -	int ret; +	int ret = 0;  	if (!attrs[MACSEC_ATTR_IFINDEX])  		return -EINVAL; @@ -2606,28 +2606,36 @@ static int macsec_upd_offload(struct sk_buff *skb, struct genl_info *info)  					macsec_genl_offload_policy, NULL))  		return -EINVAL; +	rtnl_lock(); +  	dev = get_dev_from_nl(genl_info_net(info), attrs); -	if (IS_ERR(dev)) -		return PTR_ERR(dev); +	if (IS_ERR(dev)) { +		ret = PTR_ERR(dev); +		goto out; +	}  	macsec = macsec_priv(dev); -	if (!tb_offload[MACSEC_OFFLOAD_ATTR_TYPE]) -		return -EINVAL; +	if (!tb_offload[MACSEC_OFFLOAD_ATTR_TYPE]) { +		ret = -EINVAL; +		goto out; +	}  	offload = nla_get_u8(tb_offload[MACSEC_OFFLOAD_ATTR_TYPE]);  	if (macsec->offload == offload) -		return 0; +		goto out;  	/* Check if the offloading mode is supported by the underlying layers */  	if (offload != MACSEC_OFFLOAD_OFF && -	    !macsec_check_offload(offload, macsec)) -		return -EOPNOTSUPP; +	    !macsec_check_offload(offload, macsec)) { +		ret = -EOPNOTSUPP; +		goto out; +	}  	/* Check if the net device is busy. */ -	if (netif_running(dev)) -		return -EBUSY; - -	rtnl_lock(); +	if (netif_running(dev)) { +		ret = -EBUSY; +		goto out; +	}  	prev_offload = macsec->offload;  	macsec->offload = offload; @@ -2662,7 +2670,7 @@ static int macsec_upd_offload(struct sk_buff *skb, struct genl_info *info)  rollback:  	macsec->offload = prev_offload; - +out:  	rtnl_unlock();  	return ret;  }  | 
