Browse Source

tipc: Introduce __tipc_nl_media_set

Introduce __tipc_nl_media_set() which doesn't hold RTNL lock.

Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Ying Xue 7 years ago
parent
commit
07ffb22357
2 changed files with 15 additions and 9 deletions
  1. 14 9
      net/tipc/bearer.c
  2. 1 0
      net/tipc/bearer.h

+ 14 - 9
net/tipc/bearer.c

@@ -1130,7 +1130,7 @@ err_out:
 	return err;
 	return err;
 }
 }
 
 
-int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
+int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
 {
 {
 	int err;
 	int err;
 	char *name;
 	char *name;
@@ -1148,22 +1148,17 @@ int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
 		return -EINVAL;
 		return -EINVAL;
 	name = nla_data(attrs[TIPC_NLA_MEDIA_NAME]);
 	name = nla_data(attrs[TIPC_NLA_MEDIA_NAME]);
 
 
-	rtnl_lock();
 	m = tipc_media_find(name);
 	m = tipc_media_find(name);
-	if (!m) {
-		rtnl_unlock();
+	if (!m)
 		return -EINVAL;
 		return -EINVAL;
-	}
 
 
 	if (attrs[TIPC_NLA_MEDIA_PROP]) {
 	if (attrs[TIPC_NLA_MEDIA_PROP]) {
 		struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
 		struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
 
 
 		err = tipc_nl_parse_link_prop(attrs[TIPC_NLA_MEDIA_PROP],
 		err = tipc_nl_parse_link_prop(attrs[TIPC_NLA_MEDIA_PROP],
 					      props);
 					      props);
-		if (err) {
-			rtnl_unlock();
+		if (err)
 			return err;
 			return err;
-		}
 
 
 		if (props[TIPC_NLA_PROP_TOL])
 		if (props[TIPC_NLA_PROP_TOL])
 			m->tolerance = nla_get_u32(props[TIPC_NLA_PROP_TOL]);
 			m->tolerance = nla_get_u32(props[TIPC_NLA_PROP_TOL]);
@@ -1172,7 +1167,17 @@ int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
 		if (props[TIPC_NLA_PROP_WIN])
 		if (props[TIPC_NLA_PROP_WIN])
 			m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
 			m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
 	}
 	}
-	rtnl_unlock();
 
 
 	return 0;
 	return 0;
 }
 }
+
+int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
+{
+	int err;
+
+	rtnl_lock();
+	err = __tipc_nl_media_set(skb, info);
+	rtnl_unlock();
+
+	return err;
+}

+ 1 - 0
net/tipc/bearer.h

@@ -200,6 +200,7 @@ int tipc_nl_bearer_add(struct sk_buff *skb, struct genl_info *info);
 int tipc_nl_media_dump(struct sk_buff *skb, struct netlink_callback *cb);
 int tipc_nl_media_dump(struct sk_buff *skb, struct netlink_callback *cb);
 int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info);
 int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info);
 int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info);
 int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info);
+int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info);
 
 
 int tipc_media_set_priority(const char *name, u32 new_value);
 int tipc_media_set_priority(const char *name, u32 new_value);
 int tipc_media_set_window(const char *name, u32 new_value);
 int tipc_media_set_window(const char *name, u32 new_value);