|
12 | 12 | #define pr_fmt(fmt) "trace_probe: " fmt
|
13 | 13 |
|
14 | 14 | #include <linux/bpf.h>
|
| 15 | +#include <linux/fs.h> |
15 | 16 | #include "trace_btf.h"
|
16 | 17 |
|
17 | 18 | #include "trace_probe.h"
|
@@ -1751,35 +1752,47 @@ int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
|
1751 | 1752 |
|
1752 | 1753 | used = 0;
|
1753 | 1754 | for (i = 0; i < argc; i++) {
|
1754 |
| - if (glob_match("*:%pd", argv[i])) { |
1755 |
| - char *tmp; |
1756 |
| - char *equal; |
1757 |
| - |
1758 |
| - if (!tmpbuf) { |
1759 |
| - tmpbuf = kmalloc(bufsize, GFP_KERNEL); |
1760 |
| - if (!tmpbuf) |
1761 |
| - return -ENOMEM; |
1762 |
| - } |
| 1755 | + char *tmp; |
| 1756 | + char *equal; |
| 1757 | + size_t arg_len; |
1763 | 1758 |
|
1764 |
| - tmp = kstrdup(argv[i], GFP_KERNEL); |
1765 |
| - if (!tmp) |
1766 |
| - goto nomem; |
| 1759 | + if (!glob_match("*:%p[dD]", argv[i])) |
| 1760 | + continue; |
1767 | 1761 |
|
1768 |
| - equal = strchr(tmp, '='); |
1769 |
| - if (equal) |
1770 |
| - *equal = '\0'; |
1771 |
| - tmp[strlen(argv[i]) - 4] = '\0'; |
| 1762 | + if (!tmpbuf) { |
| 1763 | + tmpbuf = kmalloc(bufsize, GFP_KERNEL); |
| 1764 | + if (!tmpbuf) |
| 1765 | + return -ENOMEM; |
| 1766 | + } |
| 1767 | + |
| 1768 | + tmp = kstrdup(argv[i], GFP_KERNEL); |
| 1769 | + if (!tmp) |
| 1770 | + goto nomem; |
| 1771 | + |
| 1772 | + equal = strchr(tmp, '='); |
| 1773 | + if (equal) |
| 1774 | + *equal = '\0'; |
| 1775 | + arg_len = strlen(argv[i]); |
| 1776 | + tmp[arg_len - 4] = '\0'; |
| 1777 | + if (argv[i][arg_len - 1] == 'd') |
1772 | 1778 | ret = snprintf(tmpbuf + used, bufsize - used,
|
1773 | 1779 | "%s%s+0x0(+0x%zx(%s)):string",
|
1774 | 1780 | equal ? tmp : "", equal ? "=" : "",
|
1775 | 1781 | offsetof(struct dentry, d_name.name),
|
1776 | 1782 | equal ? equal + 1 : tmp);
|
1777 |
| - kfree(tmp); |
1778 |
| - if (ret >= bufsize - used) |
1779 |
| - goto nomem; |
1780 |
| - argv[i] = tmpbuf + used; |
1781 |
| - used += ret + 1; |
1782 |
| - } |
| 1783 | + else |
| 1784 | + ret = snprintf(tmpbuf + used, bufsize - used, |
| 1785 | + "%s%s+0x0(+0x%zx(+0x%zx(%s))):string", |
| 1786 | + equal ? tmp : "", equal ? "=" : "", |
| 1787 | + offsetof(struct dentry, d_name.name), |
| 1788 | + offsetof(struct file, f_path.dentry), |
| 1789 | + equal ? equal + 1 : tmp); |
| 1790 | + |
| 1791 | + kfree(tmp); |
| 1792 | + if (ret >= bufsize - used) |
| 1793 | + goto nomem; |
| 1794 | + argv[i] = tmpbuf + used; |
| 1795 | + used += ret + 1; |
1783 | 1796 | }
|
1784 | 1797 |
|
1785 | 1798 | *buf = tmpbuf;
|
|
0 commit comments