diff options
author | David S. Miller <davem@davemloft.net> | 2018-10-13 00:38:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-10-13 00:38:46 -0400 |
commit | d864991b220b7c62e81d21209e1fd978fd67352c (patch) | |
tree | b570a1ad6fc1b959c5bcda6ceca0b321319c01e0 /net/core/devlink.c | |
parent | a688c53a0277d8ea21d86a5c56884892e3442c5e (diff) | |
parent | bab5c80b211035739997ebd361a679fa85b39465 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts were easy to resolve using immediate context mostly,
except the cls_u32.c one where I simply too the entire HEAD
chunk.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r-- | net/core/devlink.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c index 6dae81d65d5c..3a4b29a13d31 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c | |||
@@ -3012,6 +3012,8 @@ devlink_param_value_get_from_info(const struct devlink_param *param, | |||
3012 | struct genl_info *info, | 3012 | struct genl_info *info, |
3013 | union devlink_param_value *value) | 3013 | union devlink_param_value *value) |
3014 | { | 3014 | { |
3015 | int len; | ||
3016 | |||
3015 | if (param->type != DEVLINK_PARAM_TYPE_BOOL && | 3017 | if (param->type != DEVLINK_PARAM_TYPE_BOOL && |
3016 | !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) | 3018 | !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) |
3017 | return -EINVAL; | 3019 | return -EINVAL; |
@@ -3027,10 +3029,13 @@ devlink_param_value_get_from_info(const struct devlink_param *param, | |||
3027 | value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); | 3029 | value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); |
3028 | break; | 3030 | break; |
3029 | case DEVLINK_PARAM_TYPE_STRING: | 3031 | case DEVLINK_PARAM_TYPE_STRING: |
3030 | if (nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) > | 3032 | len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]), |
3031 | DEVLINK_PARAM_MAX_STRING_VALUE) | 3033 | nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); |
3034 | if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) || | ||
3035 | len >= __DEVLINK_PARAM_MAX_STRING_VALUE) | ||
3032 | return -EINVAL; | 3036 | return -EINVAL; |
3033 | value->vstr = nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); | 3037 | strcpy(value->vstr, |
3038 | nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); | ||
3034 | break; | 3039 | break; |
3035 | case DEVLINK_PARAM_TYPE_BOOL: | 3040 | case DEVLINK_PARAM_TYPE_BOOL: |
3036 | value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ? | 3041 | value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ? |
@@ -3117,7 +3122,10 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff *skb, | |||
3117 | return -EOPNOTSUPP; | 3122 | return -EOPNOTSUPP; |
3118 | 3123 | ||
3119 | if (cmode == DEVLINK_PARAM_CMODE_DRIVERINIT) { | 3124 | if (cmode == DEVLINK_PARAM_CMODE_DRIVERINIT) { |
3120 | param_item->driverinit_value = value; | 3125 | if (param->type == DEVLINK_PARAM_TYPE_STRING) |
3126 | strcpy(param_item->driverinit_value.vstr, value.vstr); | ||
3127 | else | ||
3128 | param_item->driverinit_value = value; | ||
3121 | param_item->driverinit_value_valid = true; | 3129 | param_item->driverinit_value_valid = true; |
3122 | } else { | 3130 | } else { |
3123 | if (!param->set) | 3131 | if (!param->set) |
@@ -4557,7 +4565,10 @@ int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, | |||
4557 | DEVLINK_PARAM_CMODE_DRIVERINIT)) | 4565 | DEVLINK_PARAM_CMODE_DRIVERINIT)) |
4558 | return -EOPNOTSUPP; | 4566 | return -EOPNOTSUPP; |
4559 | 4567 | ||
4560 | *init_val = param_item->driverinit_value; | 4568 | if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING) |
4569 | strcpy(init_val->vstr, param_item->driverinit_value.vstr); | ||
4570 | else | ||
4571 | *init_val = param_item->driverinit_value; | ||
4561 | 4572 | ||
4562 | return 0; | 4573 | return 0; |
4563 | } | 4574 | } |
@@ -4588,7 +4599,10 @@ int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id, | |||
4588 | DEVLINK_PARAM_CMODE_DRIVERINIT)) | 4599 | DEVLINK_PARAM_CMODE_DRIVERINIT)) |
4589 | return -EOPNOTSUPP; | 4600 | return -EOPNOTSUPP; |
4590 | 4601 | ||
4591 | param_item->driverinit_value = init_val; | 4602 | if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING) |
4603 | strcpy(param_item->driverinit_value.vstr, init_val.vstr); | ||
4604 | else | ||
4605 | param_item->driverinit_value = init_val; | ||
4592 | param_item->driverinit_value_valid = true; | 4606 | param_item->driverinit_value_valid = true; |
4593 | 4607 | ||
4594 | devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW); | 4608 | devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW); |
@@ -4621,6 +4635,23 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id) | |||
4621 | EXPORT_SYMBOL_GPL(devlink_param_value_changed); | 4635 | EXPORT_SYMBOL_GPL(devlink_param_value_changed); |
4622 | 4636 | ||
4623 | /** | 4637 | /** |
4638 | * devlink_param_value_str_fill - Safely fill-up the string preventing | ||
4639 | * from overflow of the preallocated buffer | ||
4640 | * | ||
4641 | * @dst_val: destination devlink_param_value | ||
4642 | * @src: source buffer | ||
4643 | */ | ||
4644 | void devlink_param_value_str_fill(union devlink_param_value *dst_val, | ||
4645 | const char *src) | ||
4646 | { | ||
4647 | size_t len; | ||
4648 | |||
4649 | len = strlcpy(dst_val->vstr, src, __DEVLINK_PARAM_MAX_STRING_VALUE); | ||
4650 | WARN_ON(len >= __DEVLINK_PARAM_MAX_STRING_VALUE); | ||
4651 | } | ||
4652 | EXPORT_SYMBOL_GPL(devlink_param_value_str_fill); | ||
4653 | |||
4654 | /** | ||
4624 | * devlink_region_create - create a new address region | 4655 | * devlink_region_create - create a new address region |
4625 | * | 4656 | * |
4626 | * @devlink: devlink | 4657 | * @devlink: devlink |