From fef7fe6ab7d3a9bb2e218fd41277b43dbb3de01a Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Wed, 13 Jan 2021 14:27:41 -0500 Subject: [PATCH] fix: block: merge struct block_device and struct hd_struct (v5.11) See upstream commit : commit 0d02129e76edf91cf04fabf1efbc3a9a1f1d729a Author: Christoph Hellwig Date: Fri Nov 27 16:43:51 2020 +0100 block: merge struct block_device and struct hd_struct Instead of having two structures that represent each block device with different life time rules, merge them into a single one. This also greatly simplifies the reference counting rules, as we can use the inode reference count as the main reference count for the new struct block_device, with the device model reference front ending it for device model interaction. Change-Id: I47702d1867fda0d8fc0754d761aa4d1ae702cdeb Signed-off-by: Michael Jeanson Signed-off-by: Mathieu Desnoyers --- src/lttng-statedump-impl.c | 72 ++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/src/lttng-statedump-impl.c b/src/lttng-statedump-impl.c index 42052fae..f9917bb2 100644 --- a/src/lttng-statedump-impl.c +++ b/src/lttng-statedump-impl.c @@ -194,6 +194,61 @@ enum lttng_process_status { LTTNG_DEAD = 7, }; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,11,0)) + +#define LTTNG_PART_STRUCT_TYPE struct block_device + +static +int lttng_get_part_name(struct gendisk *disk, struct block_device *part, char *name_buf) +{ + const char *p; + + p = bdevname(part, name_buf); + if (!p) + return -ENOSYS; + + return 0; +} + +static +dev_t lttng_get_part_devt(struct block_device *part) +{ + return part->bd_dev; +} + +#else + +#define LTTNG_PART_STRUCT_TYPE struct hd_struct + +static +int lttng_get_part_name(struct gendisk *disk, struct hd_struct *part, char *name_buf) +{ + const char *p; + struct block_device bdev; + + /* + * Create a partial 'struct blockdevice' to use + * 'bdevname()' which is a simple wrapper over + * 'disk_name()' but has the honor to be EXPORT_SYMBOL. + */ + bdev.bd_disk = disk; + bdev.bd_part = part; + + p = bdevname(&bdev, name_buf); + if (!p) + return -ENOSYS; + + return 0; +} + +static +dev_t lttng_get_part_devt(struct hd_struct *part) +{ + return part_devt(part); +} +#endif + static int lttng_enumerate_block_devices(struct lttng_session *session) { @@ -213,7 +268,7 @@ int lttng_enumerate_block_devices(struct lttng_session *session) while ((dev = class_dev_iter_next(&iter))) { struct disk_part_iter piter; struct gendisk *disk = dev_to_disk(dev); - struct hd_struct *part; + LTTNG_PART_STRUCT_TYPE *part; /* * Don't show empty devices or things that have been @@ -225,26 +280,15 @@ int lttng_enumerate_block_devices(struct lttng_session *session) disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); while ((part = disk_part_iter_next(&piter))) { - struct block_device bdev; char name_buf[BDEVNAME_SIZE]; - const char *p; - - /* - * Create a partial 'struct blockdevice' to use - * 'bdevname()' which is a simple wrapper over - * 'disk_name()' but has the honor to be EXPORT_SYMBOL. - */ - bdev.bd_disk = disk; - bdev.bd_part = part; - p = bdevname(&bdev, name_buf); - if (!p) { + if (lttng_get_part_name(disk, part, name_buf) == -ENOSYS) { disk_part_iter_exit(&piter); class_dev_iter_exit(&iter); return -ENOSYS; } trace_lttng_statedump_block_device(session, - part_devt(part), name_buf); + lttng_get_part_devt(part), name_buf); } disk_part_iter_exit(&piter); } -- 2.34.1