In many cases, it results in simpler code. For example: - prefix_len = str_has_prefix(name, PDSC_FW_COMPONENT_PREFIX); - if (prefix_len) - name += prefix_len; + name = strprefix(name, PDSC_FW_COMPONENT_PREFIX) ?: name; It avoids explicit pointer arithmetic, which also prevents certain bugs. After this commit, only a few uses of str_has_prefix() remain. Those are difficult to remove, as the surrounding code is deeply based on lengths. Let's leave those, as it's too risky to touch that code. Signed-off-by: Alejandro Colomar --- drivers/net/ethernet/amd/pds_core/fw.c | 5 +-- kernel/printk/braille.c | 14 ++++---- kernel/trace/trace.c | 9 +++--- kernel/trace/trace_events.c | 3 +- kernel/trace/trace_events_hist.c | 44 ++++++++++++-------------- kernel/trace/trace_events_synth.c | 8 +++-- kernel/trace/trace_stack.c | 6 ++-- 7 files changed, 42 insertions(+), 47 deletions(-) diff --git a/drivers/net/ethernet/amd/pds_core/fw.c b/drivers/net/ethernet/amd/pds_core/fw.c index 7fe4594e9f9b..3f0b1137dd90 100644 --- a/drivers/net/ethernet/amd/pds_core/fw.c +++ b/drivers/net/ethernet/amd/pds_core/fw.c @@ -50,16 +50,13 @@ void pdsc_fw_components_invalidate(struct pdsc *pdsc) static u8 pdsc_name_to_fw_type(const char *name) { - size_t prefix_len; int i; /* "fw" without suffix maps to main firmware */ if (!strcmp(name, "fw")) return PDS_CORE_FW_TYPE_MAIN; - prefix_len = str_has_prefix(name, PDSC_FW_COMPONENT_PREFIX); - if (prefix_len) - name += prefix_len; + name = strprefix(name, PDSC_FW_COMPONENT_PREFIX) ?: name; for (i = 1; i < ARRAY_SIZE(pdsc_fw_type_names); i++) { if (pdsc_fw_type_names[i] && diff --git a/kernel/printk/braille.c b/kernel/printk/braille.c index 17a9591e54ff..18847d88140b 100644 --- a/kernel/printk/braille.c +++ b/kernel/printk/braille.c @@ -11,18 +11,18 @@ int _braille_console_setup(char **str, char **brl_options) { - size_t len; + char *p; - len = str_has_prefix(*str, "brl,"); - if (len) { + p = strprefix(*str, "brl,"); + if (p) { *brl_options = ""; - *str += len; + *str = p; return 0; } - len = str_has_prefix(*str, "brl="); - if (len) { - *brl_options = *str + len; + p = strprefix(*str, "brl="); + if (p) { + *brl_options = p; *str = strchr(*brl_options, ','); if (!*str) { pr_err("need port name after brl=\n"); diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index e8c4efa8107b..1c40a00c5bd7 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -4085,19 +4085,18 @@ int set_tracer_flag(struct trace_array *tr, u64 mask, int enabled) int trace_set_options(struct trace_array *tr, char *option) { - char *cmp; + char *cmp, *p; int neg = 0; int ret; size_t orig_len = strlen(option); - int len; cmp = strstrip(option); - len = str_has_prefix(cmp, "no"); - if (len) + p = strprefix(cmp, "no"); + if (p) neg = 1; - cmp += len; + cmp = p; mutex_lock(&event_mutex); mutex_lock(&trace_types_lock); diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index d467cdf9c805..72e42def1dd0 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -266,9 +266,8 @@ static struct trace_event_fields *find_event_field(const char *fmt, const char *p = fmt; int len; - if (!(len = str_has_prefix(fmt, "REC->"))) + if (!(fmt = strprefix(fmt, "REC->"))) return NULL; - fmt += len; for (p = fmt; *p; p++) { if (!isalnum(*p) && *p != '_') break; diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index c099bfbb9fb6..d5578b67ce9f 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -1485,25 +1485,26 @@ static int parse_action(char *str, struct hist_trigger_attrs *attrs) static int parse_assignment(struct trace_array *tr, char *str, struct hist_trigger_attrs *attrs) { - int len, ret = 0; + char *p; + int ret = 0; - if ((len = str_has_prefix(str, "key=")) || - (len = str_has_prefix(str, "keys="))) { - attrs->keys_str = kstrdup(str + len, GFP_KERNEL); + if ((p = strprefix(str, "key=")) || + (p = strprefix(str, "keys="))) { + attrs->keys_str = kstrdup(p, GFP_KERNEL); if (!attrs->keys_str) { ret = -ENOMEM; goto out; } - } else if ((len = str_has_prefix(str, "val=")) || - (len = str_has_prefix(str, "vals=")) || - (len = str_has_prefix(str, "values="))) { - attrs->vals_str = kstrdup(str + len, GFP_KERNEL); + } else if ((p = strprefix(str, "val=")) || + (p = strprefix(str, "vals=")) || + (p = strprefix(str, "values="))) { + attrs->vals_str = kstrdup(p, GFP_KERNEL); if (!attrs->vals_str) { ret = -ENOMEM; goto out; } - } else if ((len = str_has_prefix(str, "sort="))) { - attrs->sort_key_str = kstrdup(str + len, GFP_KERNEL); + } else if ((p = strprefix(str, "sort="))) { + attrs->sort_key_str = kstrdup(p, GFP_KERNEL); if (!attrs->sort_key_str) { ret = -ENOMEM; goto out; @@ -1514,17 +1515,15 @@ static int parse_assignment(struct trace_array *tr, ret = -ENOMEM; goto out; } - } else if ((len = str_has_prefix(str, "clock="))) { - str += len; - - str = strstrip(str); - attrs->clock = kstrdup(str, GFP_KERNEL); + } else if ((p = strprefix(str, "clock="))) { + p = strstrip(p); + attrs->clock = kstrdup(p, GFP_KERNEL); if (!attrs->clock) { ret = -ENOMEM; goto out; } - } else if ((len = str_has_prefix(str, "size="))) { - int map_bits = parse_map_size(str + len); + } else if ((p = strprefix(str, "size="))) { + int map_bits = parse_map_size(p); if (map_bits < 0) { ret = map_bits; @@ -4881,8 +4880,7 @@ static int parse_actions(struct hist_trigger_data *hist_data) struct action_data *data; unsigned int i; int ret = 0; - char *str; - int len; + char *str, *p; for (i = 0; i < hist_data->attrs->n_actions; i++) { enum handler_id hid = 0; @@ -4890,14 +4888,14 @@ static int parse_actions(struct hist_trigger_data *hist_data) str = hist_data->attrs->action_str[i]; - if ((len = str_has_prefix(str, "onmatch("))) + if ((p = strprefix(str, "onmatch("))) hid = HANDLER_ONMATCH; - else if ((len = str_has_prefix(str, "onmax("))) + else if ((p = strprefix(str, "onmax("))) hid = HANDLER_ONMAX; - else if ((len = str_has_prefix(str, "onchange("))) + else if ((p = strprefix(str, "onchange("))) hid = HANDLER_ONCHANGE; - action_str = str + len; + action_str = p ?: str; switch (hid) { case HANDLER_ONMATCH: diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c index 016ca522e5af..2a7df262aa8f 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -2268,12 +2268,14 @@ static int create_synth_event(const char *raw_command) /* This interface accepts group name prefix */ if (strchr(name, '/')) { - len = str_has_prefix(name, SYNTH_SYSTEM "/"); - if (len == 0) { + const char *n; + + n = strprefix(name, SYNTH_SYSTEM "/"); + if (!n) { synth_err(SYNTH_ERR_INVALID_DYN_CMD, 0); return -EINVAL; } - name += len; + name = n; } len = name - raw_command; diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index e7f4e523587d..3f8ddb7b8530 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -539,10 +539,10 @@ static char stack_trace_filter_buf[COMMAND_LINE_SIZE+1] __initdata; static __init int enable_stacktrace(char *str) { - int len; + char *p; - if ((len = str_has_prefix(str, "_filter="))) - strscpy(stack_trace_filter_buf, str + len); + if ((p = strprefix(str, "_filter="))) + strscpy(stack_trace_filter_buf, p); stack_tracer_enabled = 1; return 1; -- 2.55.0