X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttng-statedump-impl.c;h=c8ac2d12750d210a11a9c375d2cf0f0aed39e189;hb=5a91f3dfb2ea8b50bfcba45c4440cf20735ea3ee;hp=3e46ca165fd8d71da80dc49b9aa8ff35f5d42c45;hpb=20591cf76d5dfd42d61a18bd494b40a70a04dd59;p=lttng-modules.git diff --git a/lttng-statedump-impl.c b/lttng-statedump-impl.c index 3e46ca16..c8ac2d12 100644 --- a/lttng-statedump-impl.c +++ b/lttng-statedump-impl.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "lttng-events.h" #include "lttng-tracer.h" @@ -54,6 +55,7 @@ #include "wrapper/nsproxy.h" #include "wrapper/irq.h" #include "wrapper/tracepoint.h" +#include "wrapper/genhd.h" #ifdef CONFIG_LTTNG_HAS_LIST_IRQ #include @@ -65,6 +67,7 @@ #define TRACE_INCLUDE_FILE lttng-statedump #include "instrumentation/events/lttng-module/lttng-statedump.h" +DEFINE_TRACE(lttng_statedump_block_device); DEFINE_TRACE(lttng_statedump_end); DEFINE_TRACE(lttng_statedump_interrupt); DEFINE_TRACE(lttng_statedump_file_descriptor); @@ -76,6 +79,7 @@ struct lttng_fd_ctx { char *page; struct lttng_session *session; struct task_struct *p; + struct fdtable *fdt; }; /* @@ -115,7 +119,57 @@ enum lttng_process_status { LTTNG_DEAD = 7, }; +static +int lttng_enumerate_block_devices(struct lttng_session *session) +{ + struct class *ptr_block_class; + struct device_type *ptr_disk_type; + struct class_dev_iter iter; + struct device *dev; + + ptr_block_class = wrapper_get_block_class(); + if (!ptr_block_class) + return -ENOSYS; + ptr_disk_type = wrapper_get_disk_type(); + if (!ptr_disk_type) { + return -ENOSYS; + } + class_dev_iter_init(&iter, ptr_block_class, NULL, ptr_disk_type); + while ((dev = class_dev_iter_next(&iter))) { + struct disk_part_iter piter; + struct gendisk *disk = dev_to_disk(dev); + struct hd_struct *part; + + /* + * Don't show empty devices or things that have been + * suppressed + */ + if (get_capacity(disk) == 0 || + (disk->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)) + continue; + + disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); + while ((part = disk_part_iter_next(&piter))) { + char name_buf[BDEVNAME_SIZE]; + char *p; + + p = wrapper_disk_name(disk, part->partno, name_buf); + if (!p) { + disk_part_iter_exit(&piter); + class_dev_iter_exit(&iter); + return -ENOSYS; + } + trace_lttng_statedump_block_device(session, + part_devt(part), name_buf); + } + disk_part_iter_exit(&piter); + } + class_dev_iter_exit(&iter); + return 0; +} + #ifdef CONFIG_INET + static void lttng_enumerate_device(struct lttng_session *session, struct net_device *dev) @@ -164,18 +218,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; } @@ -187,6 +250,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); } @@ -397,6 +461,7 @@ int do_lttng_statedump(struct lttng_session *session) /* FIXME lttng_enumerate_vm_maps(session); */ lttng_list_interrupts(session); lttng_enumerate_network_ip_interface(session); + lttng_enumerate_block_devices(session); /* TODO lttng_dump_idt_table(session); */ /* TODO lttng_dump_softirq_vec(session); */