On 9/26/20 9:18 PM, William Breathitt Gray wrote:
+static ssize_t counter_comp_u8_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + const struct counter_attribute *const a = to_counter_attribute(attr); + struct counter_device *const counter = dev_get_drvdata(dev); + struct counter_count *const count = a->parent; + struct counter_synapse *const synapse = a->comp.priv; + const struct counter_available *const avail = a->comp.priv; + int err; + bool bool_data; + u8 data; + + switch (a->comp.type) { + case COUNTER_COMP_BOOL: + err = kstrtobool(buf, &bool_data); + data = bool_data; + break; + case COUNTER_COMP_FUNCTION: + err = find_in_string_array(&data, count->functions_list, + count->num_functions, buf, + counter_function_str); + break; + case COUNTER_COMP_SYNAPSE_ACTION: + err = find_in_string_array(&data, synapse->actions_list, + synapse->num_actions, buf, + counter_synapse_action_str); + break; + case COUNTER_COMP_ENUM: + err = __sysfs_match_string(avail->strs, avail->num_items, buf); + data = err; + break; + case COUNTER_COMP_COUNT_MODE: + err = find_in_string_array(&data, avail->enums, + avail->num_items, buf, + counter_count_mode_str); + break; + default: + err = kstrtou8(buf, 0, &data); + break; + }
In this function, return values are not always errors. So it would make sense to call the err variable ret instead and check for ret < 0 below. Setting enums to a value with index > 0 fails currently because of this.
+ if (err) + return err; + + switch (a->scope) { + case COUNTER_SCOPE_DEVICE: + err = a->comp.device_u8_write(counter, data); + break; + case COUNTER_SCOPE_SIGNAL: + err = a->comp.signal_u8_write(counter, a->parent, data); + break; + case COUNTER_SCOPE_COUNT: + if (a->comp.type == COUNTER_COMP_SYNAPSE_ACTION) + err = a->comp.action_write(counter, count, synapse, + data); + else + err = a->comp.count_u8_write(counter, count, data); + break; + } + if (err) + return err; + + return len; +}