__entry->pid, __entry->comm, __entry->off, __entry->len)
 );
 
+/* A bare tracepoint with no event associated with it */
+DECLARE_TRACE(bpf_testmod_test_write_bare,
+       TP_PROTO(struct task_struct *task, struct bpf_testmod_test_write_ctx *ctx),
+       TP_ARGS(task, ctx)
+);
+
 #endif /* _BPF_TESTMOD_EVENTS_H */
 
 #undef TRACE_INCLUDE_PATH
 
 EXPORT_SYMBOL(bpf_testmod_test_read);
 ALLOW_ERROR_INJECTION(bpf_testmod_test_read, ERRNO);
 
+noinline ssize_t
+bpf_testmod_test_write(struct file *file, struct kobject *kobj,
+                     struct bin_attribute *bin_attr,
+                     char *buf, loff_t off, size_t len)
+{
+       struct bpf_testmod_test_write_ctx ctx = {
+               .buf = buf,
+               .off = off,
+               .len = len,
+       };
+
+       trace_bpf_testmod_test_write_bare(current, &ctx);
+
+       return -EIO; /* always fail */
+}
+EXPORT_SYMBOL(bpf_testmod_test_write);
+ALLOW_ERROR_INJECTION(bpf_testmod_test_write, ERRNO);
+
 static struct bin_attribute bin_attr_bpf_testmod_file __ro_after_init = {
-       .attr = { .name = "bpf_testmod", .mode = 0444, },
+       .attr = { .name = "bpf_testmod", .mode = 0666, },
        .read = bpf_testmod_test_read,
+       .write = bpf_testmod_test_write,
 };
 
 static int bpf_testmod_init(void)
 
        size_t len;
 };
 
+struct bpf_testmod_test_write_ctx {
+       char *buf;
+       loff_t off;
+       size_t len;
+};
+
 #endif /* _BPF_TESTMOD_H */
 
        return 0;
 }
 
+static int trigger_module_test_write(int write_sz)
+{
+       int fd, err;
+       char *buf = malloc(write_sz);
+
+       if (!buf)
+               return -ENOMEM;
+
+       memset(buf, 'a', write_sz);
+       buf[write_sz-1] = '\0';
+
+       fd = open("/sys/kernel/bpf_testmod", O_WRONLY);
+       err = -errno;
+       if (CHECK(fd < 0, "testmod_file_open", "failed: %d\n", err)) {
+               free(buf);
+               return err;
+       }
+
+       write(fd, buf, write_sz);
+       close(fd);
+       free(buf);
+       return 0;
+}
+
 void test_module_attach(void)
 {
        const int READ_SZ = 456;
+       const int WRITE_SZ = 457;
        struct test_module_attach* skel;
        struct test_module_attach__bss *bss;
        int err;
 
        /* trigger tracepoint */
        ASSERT_OK(trigger_module_test_read(READ_SZ), "trigger_read");
+       ASSERT_OK(trigger_module_test_write(WRITE_SZ), "trigger_write");
 
        ASSERT_EQ(bss->raw_tp_read_sz, READ_SZ, "raw_tp");
+       ASSERT_EQ(bss->raw_tp_bare_write_sz, WRITE_SZ, "raw_tp_bare");
        ASSERT_EQ(bss->tp_btf_read_sz, READ_SZ, "tp_btf");
        ASSERT_EQ(bss->fentry_read_sz, READ_SZ, "fentry");
        ASSERT_EQ(bss->fentry_manual_read_sz, READ_SZ, "fentry_manual");
 
        return 0;
 }
 
+__u32 raw_tp_bare_write_sz = 0;
+
+SEC("raw_tp/bpf_testmod_test_write_bare")
+int BPF_PROG(handle_raw_tp_bare,
+            struct task_struct *task, struct bpf_testmod_test_write_ctx *write_ctx)
+{
+       raw_tp_bare_write_sz = BPF_CORE_READ(write_ctx, len);
+       return 0;
+}
+
 __u32 tp_btf_read_sz = 0;
 
 SEC("tp_btf/bpf_testmod_test_read")