diff options
Diffstat (limited to 'net/switchdev/switchdev.c')
| -rw-r--r-- | net/switchdev/switchdev.c | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 23d868545362..2c1ffc9ba2eb 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c @@ -460,10 +460,11 @@ static int __switchdev_handle_port_obj_add(struct net_device *dev,  	extack = switchdev_notifier_info_to_extack(&port_obj_info->info);  	if (check_cb(dev)) { -		/* This flag is only checked if the return value is success. */ -		port_obj_info->handled = true; -		return add_cb(dev, port_obj_info->obj, port_obj_info->trans, -			      extack); +		err = add_cb(dev, port_obj_info->obj, port_obj_info->trans, +			     extack); +		if (err != -EOPNOTSUPP) +			port_obj_info->handled = true; +		return err;  	}  	/* Switch ports might be stacked under e.g. a LAG. Ignore the @@ -515,9 +516,10 @@ static int __switchdev_handle_port_obj_del(struct net_device *dev,  	int err = -EOPNOTSUPP;  	if (check_cb(dev)) { -		/* This flag is only checked if the return value is success. */ -		port_obj_info->handled = true; -		return del_cb(dev, port_obj_info->obj); +		err = del_cb(dev, port_obj_info->obj); +		if (err != -EOPNOTSUPP) +			port_obj_info->handled = true; +		return err;  	}  	/* Switch ports might be stacked under e.g. a LAG. Ignore the @@ -568,9 +570,10 @@ static int __switchdev_handle_port_attr_set(struct net_device *dev,  	int err = -EOPNOTSUPP;  	if (check_cb(dev)) { -		port_attr_info->handled = true; -		return set_cb(dev, port_attr_info->attr, -			      port_attr_info->trans); +		err = set_cb(dev, port_attr_info->attr, port_attr_info->trans); +		if (err != -EOPNOTSUPP) +			port_attr_info->handled = true; +		return err;  	}  	/* Switch ports might be stacked under e.g. a LAG. Ignore the  | 
