Dump FD flags and mode on state dump
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 11 Apr 2014 18:50:53 +0000 (14:50 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 20 May 2014 14:25:33 +0000 (10:25 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
instrumentation/events/lttng-module/lttng-statedump.h
lttng-statedump-impl.c
probes/lttng-events.h

index efd22d77dfb774a7711ed4a0daa6dd45149ceafa..74233ca1d8fb7fc8d118d4d9c112bd53f41dff17 100644 (file)
@@ -88,16 +88,21 @@ TRACE_EVENT(lttng_statedump_process_state,
 
 TRACE_EVENT(lttng_statedump_file_descriptor,
        TP_PROTO(struct lttng_session *session,
-               struct task_struct *p, int fd, const char *filename),
-       TP_ARGS(session, p, fd, filename),
+               struct task_struct *p, int fd, const char *filename,
+               unsigned int flags, fmode_t fmode),
+       TP_ARGS(session, p, fd, filename, flags, fmode),
        TP_STRUCT__entry(
                __field(pid_t, pid)
                __field(int, fd)
+               __field_oct(unsigned int, flags)
+               __field_hex(fmode_t, fmode)
                __string(filename, filename)
        ),
        TP_fast_assign(
                tp_assign(pid, p->tgid)
                tp_assign(fd, fd)
+               tp_assign(flags, flags)
+               tp_assign(fmode, fmode)
                tp_strcpy(filename, filename)
        ),
        TP_printk("")
index e9fe829f17bad251a4a985997c011c7acdd2f191..1bf58ad43d126c8bf0d128f089a01619a6dd05a5 100644 (file)
@@ -79,6 +79,7 @@ struct lttng_fd_ctx {
        char *page;
        struct lttng_session *session;
        struct task_struct *p;
+       struct fdtable *fdt;
 };
 
 /*
@@ -209,18 +210,27 @@ int lttng_dump_one_fd(const void *p, struct file *file, unsigned int fd)
 {
        const struct lttng_fd_ctx *ctx = p;
        const char *s = d_path(&file->f_path, ctx->page, PAGE_SIZE);
+       unsigned int flags = file->f_flags;
 
+       /*
+        * We don't expose kernel internal flags, only userspace-visible
+        * flags.
+        */
+       flags &= ~FMODE_NONOTIFY;
+       if (test_bit(fd, ctx->fdt->close_on_exec))
+               flags |= O_CLOEXEC;
        if (IS_ERR(s)) {
                struct dentry *dentry = file->f_path.dentry;
 
                /* Make sure we give at least some info */
                spin_lock(&dentry->d_lock);
                trace_lttng_statedump_file_descriptor(ctx->session, ctx->p, fd,
-                       dentry->d_name.name);
+                       dentry->d_name.name, flags, file->f_mode);
                spin_unlock(&dentry->d_lock);
                goto end;
        }
-       trace_lttng_statedump_file_descriptor(ctx->session, ctx->p, fd, s);
+       trace_lttng_statedump_file_descriptor(ctx->session, ctx->p, fd, s,
+               flags, file->f_mode);
 end:
        return 0;
 }
@@ -232,6 +242,7 @@ void lttng_enumerate_task_fd(struct lttng_session *session,
        struct lttng_fd_ctx ctx = { .page = tmp, .session = session, .p = p };
 
        task_lock(p);
+       ctx.fdt = files_fdtable(p->files);
        lttng_iterate_fd(p->files, 0, lttng_dump_one_fd, &ctx);
        task_unlock(p);
 }
index ab6f342b3e9c8df6c08dc17af8a2203589d3214e..596b706085847037d71298c42f7b059b92939da9 100644 (file)
@@ -186,6 +186,10 @@ void trace_##_name(void *__data);
 #define __field_hex(_type, _item)                              \
        __field_full(_type, _item, __BYTE_ORDER, 16)
 
+#undef __field_oct
+#define __field_oct(_type, _item)                              \
+       __field_full(_type, _item, __BYTE_ORDER, 8)
+
 #undef __field_network
 #define __field_network(_type, _item)                          \
        __field_full(_type, _item, __BIG_ENDIAN, 10)
This page took 0.028075 seconds and 4 git commands to generate.