Merge tag 'mmc-merge-for-3.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / kernel / trace / trace_probe.c
index 8e526b9..daa9980 100644 (file)
@@ -550,7 +550,7 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t,
 
 /* Recursive argument parser */
 static int parse_probe_arg(char *arg, const struct fetch_type *t,
-                    struct fetch_param *f, bool is_return)
+                    struct fetch_param *f, bool is_return, bool is_kprobe)
 {
        unsigned long param;
        long offset;
@@ -558,6 +558,11 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
        int ret;
 
        ret = 0;
+
+       /* Until uprobe_events supports only reg arguments */
+       if (!is_kprobe && arg[0] != '%')
+               return -EINVAL;
+
        switch (arg[0]) {
        case '$':
                ret = parse_probe_vars(arg + 1, t, f, is_return);
@@ -619,7 +624,8 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
                                return -ENOMEM;
 
                        dprm->offset = offset;
-                       ret = parse_probe_arg(arg, t2, &dprm->orig, is_return);
+                       ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
+                                                       is_kprobe);
                        if (ret)
                                kfree(dprm);
                        else {
@@ -677,7 +683,7 @@ static int __parse_bitfield_probe_arg(const char *bf,
 
 /* String length checking wrapper */
 int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
-               struct probe_arg *parg, bool is_return)
+               struct probe_arg *parg, bool is_return, bool is_kprobe)
 {
        const char *t;
        int ret;
@@ -703,7 +709,7 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
        }
        parg->offset = *size;
        *size += parg->type->size;
-       ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return);
+       ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return, is_kprobe);
 
        if (ret >= 0 && t != NULL)
                ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch);