Re: [PATCH v5 1/5] counter: Internalize sysfs interface code

From: David Lechner
Date: Wed Oct 14 2020 - 21:38:49 EST


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;
+}