Skip to content

Commit

Permalink
bridge: a netlink notification should be sent when those attributes a…
Browse files Browse the repository at this point in the history
…re changed by br_sysfs_br

Now when we change the attributes of bridge or br_port by netlink,
a relevant netlink notification will be sent, but if we change them
by ioctl or sysfs, no notification will be sent.

We should ensure that whenever those attributes change internally or from
sysfs/ioctl, that a netlink notification is sent out to listeners.

Also, NetworkManager will use this in the future to listen for out-of-band
bridge master attribute updates and incorporate them into the runtime
configuration.

This patch is used for br_sysfs_br. and we also need to remove some
rtnl_trylock in old functions so that we can call it in a common one.

For group_addr_store, we cannot make it use store_bridge_parm, because
it's not a string-to-long convert, we will add notification on it
individually.

Signed-off-by: Xin Long <[email protected]>
Signed-off-by: Nikolay Aleksandrov <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
lxin authored and davem330 committed Apr 14, 2016
1 parent 4436156 commit 047831a
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 37 deletions.
21 changes: 9 additions & 12 deletions net/bridge/br_sysfs_br.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,14 @@ static ssize_t store_bridge_parm(struct device *d,
if (endp == buf)
return -EINVAL;

if (!rtnl_trylock())
return restart_syscall();

err = (*set)(br, val);
if (!err)
netdev_state_change(br->dev);
rtnl_unlock();

return err ? err : len;
}

Expand Down Expand Up @@ -101,15 +108,7 @@ static ssize_t ageing_time_show(struct device *d,

static int set_ageing_time(struct net_bridge *br, unsigned long val)
{
int ret;

if (!rtnl_trylock())
return restart_syscall();

ret = br_set_ageing_time(br, val);
rtnl_unlock();

return ret;
return br_set_ageing_time(br, val);
}

static ssize_t ageing_time_store(struct device *d,
Expand All @@ -130,10 +129,7 @@ static ssize_t stp_state_show(struct device *d,

static int set_stp_state(struct net_bridge *br, unsigned long val)
{
if (!rtnl_trylock())
return restart_syscall();
br_stp_set_enabled(br, val);
rtnl_unlock();

return 0;
}
Expand Down Expand Up @@ -315,6 +311,7 @@ static ssize_t group_addr_store(struct device *d,

br->group_addr_set = true;
br_recalculate_fwd_mask(br);
netdev_state_change(br->dev);

rtnl_unlock();

Expand Down
30 changes: 5 additions & 25 deletions net/bridge/br_vlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -651,15 +651,7 @@ int __br_vlan_filter_toggle(struct net_bridge *br, unsigned long val)

int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val)
{
int err;

if (!rtnl_trylock())
return restart_syscall();

err = __br_vlan_filter_toggle(br, val);
rtnl_unlock();

return err;
return __br_vlan_filter_toggle(br, val);
}

int __br_vlan_set_proto(struct net_bridge *br, __be16 proto)
Expand Down Expand Up @@ -713,18 +705,10 @@ int __br_vlan_set_proto(struct net_bridge *br, __be16 proto)

int br_vlan_set_proto(struct net_bridge *br, unsigned long val)
{
int err;

if (val != ETH_P_8021Q && val != ETH_P_8021AD)
return -EPROTONOSUPPORT;

if (!rtnl_trylock())
return restart_syscall();

err = __br_vlan_set_proto(br, htons(val));
rtnl_unlock();

return err;
return __br_vlan_set_proto(br, htons(val));
}

static bool vlan_default_pvid(struct net_bridge_vlan_group *vg, u16 vid)
Expand Down Expand Up @@ -855,21 +839,17 @@ int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val)
if (val >= VLAN_VID_MASK)
return -EINVAL;

if (!rtnl_trylock())
return restart_syscall();

if (pvid == br->default_pvid)
goto unlock;
goto out;

/* Only allow default pvid change when filtering is disabled */
if (br->vlan_enabled) {
pr_info_once("Please disable vlan filtering to change default_pvid\n");
err = -EPERM;
goto unlock;
goto out;
}
err = __br_vlan_set_default_pvid(br, pvid);
unlock:
rtnl_unlock();
out:
return err;
}

Expand Down

0 comments on commit 047831a

Please sign in to comment.