X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Flttng-statedump-impl.c;h=164345ca463865a6e4332d15aa91fe25c03f9f43;hb=f3a2b1ec84e4140c50a63d872b56c840a9b929e6;hp=394f661861a88a8f00a52002b2440112b9df2b68;hpb=a40e3229afb952bcd6f13e47aa1b4f568c345a23;p=lttng-modules.git diff --git a/src/lttng-statedump-impl.c b/src/lttng-statedump-impl.c index 394f6618..164345ca 100644 --- a/src/lttng-statedump-impl.c +++ b/src/lttng-statedump-impl.c @@ -249,6 +249,61 @@ dev_t lttng_get_part_devt(struct hd_struct *part) } #endif +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,12,0)) +static +int lttng_statedump_each_block_device(struct lttng_kernel_session *session, struct gendisk *disk) +{ + struct block_device *part; + unsigned long idx; + int ret = 0; + + /* Include partition 0 */ + idx = 0; + + rcu_read_lock(); + xa_for_each(&disk->part_tbl, idx, part) { + char name_buf[BDEVNAME_SIZE]; + + /* Exclude non-partitions bdev and empty partitions. */ + if (bdev_is_partition(part) && !bdev_nr_sectors(part)) + continue; + + if (lttng_get_part_name(disk, part, name_buf) == -ENOSYS) { + ret = -ENOSYS; + goto end; + } + trace_lttng_statedump_block_device(session, lttng_get_part_devt(part), + name_buf); + } +end: + rcu_read_unlock(); + return ret; +} +#else +static +int lttng_statedump_each_block_device(struct lttng_kernel_session *session, struct gendisk *disk) +{ + struct disk_part_iter piter; + LTTNG_PART_STRUCT_TYPE *part; + + disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); + + while ((part = disk_part_iter_next(&piter))) { + char name_buf[BDEVNAME_SIZE]; + + if (lttng_get_part_name(disk, part, name_buf) == -ENOSYS) { + disk_part_iter_exit(&piter); + return -ENOSYS; + } + trace_lttng_statedump_block_device(session, lttng_get_part_devt(part), + name_buf); + } + disk_part_iter_exit(&piter); + + return 0; +} +#endif + static int lttng_enumerate_block_devices(struct lttng_kernel_session *session) { @@ -270,9 +325,7 @@ int lttng_enumerate_block_devices(struct lttng_kernel_session *session) } 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); - LTTNG_PART_STRUCT_TYPE *part; /* * Don't show empty devices or things that have been @@ -282,29 +335,8 @@ int lttng_enumerate_block_devices(struct lttng_kernel_session *session) (disk->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)) continue; - /* - * The original 'disk_part_iter_init' returns void, but our - * wrapper can fail to lookup the original symbol. - */ - if (wrapper_disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0) < 0) { - ret = -ENOSYS; - goto iter_exit; - } - - while ((part = wrapper_disk_part_iter_next(&piter))) { - char name_buf[BDEVNAME_SIZE]; - - if (lttng_get_part_name(disk, part, name_buf) == -ENOSYS) { - wrapper_disk_part_iter_exit(&piter); - ret = -ENOSYS; - goto iter_exit; - } - trace_lttng_statedump_block_device(session, - lttng_get_part_devt(part), name_buf); - } - wrapper_disk_part_iter_exit(&piter); + ret = lttng_statedump_each_block_device(session, disk); } -iter_exit: class_dev_iter_exit(&iter); end: return ret; @@ -585,7 +617,8 @@ void lttng_statedump_process_ns(struct lttng_kernel_session *session, #endif trace_lttng_statedump_process_net_ns(session, p, proxy->net_ns); trace_lttng_statedump_process_uts_ns(session, p, proxy->uts_ns); -#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,6,0)) +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,6,0) || \ + LTTNG_RHEL_KERNEL_RANGE(4,18,0,305,0,0, 4,19,0,0,0,0)) trace_lttng_statedump_process_time_ns(session, p, proxy->time_ns); #endif }