diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index 3d7217620106..398bebaad064 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c @@ -524,7 +524,10 @@ static int ioctl_get_info(struct client *client, union ioctl_arg *arg) memset(&bus_reset, 0, sizeof(bus_reset)); fill_bus_reset_event(&bus_reset, client); - /* unaligned size of bus_reset is 36 bytes */ + // This structure has 4 bytes of trailing padding under the System V ABI + // on most architectures (due to 8-byte alignment of the long long type), + // except for Intel386 (where long long type is aligned to 4 bytes). In + // either case, the effective length is 36 bytes. if (copy_to_user(u64_to_uptr(a->bus_reset), &bus_reset, 36)) return -EFAULT; } diff --git a/drivers/firewire/uapi-test.c b/drivers/firewire/uapi-test.c index bc3f10a2e516..0bdacb1caeb8 100644 --- a/drivers/firewire/uapi-test.c +++ b/drivers/firewire/uapi-test.c @@ -72,11 +72,31 @@ static void structure_layout_event_phy_packet2(struct kunit *test) KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_phy_packet2, data)); } +static void structure_layout_event_bus_reset(struct kunit *test) +{ +#if defined(CONFIG_X86_32) + // 4 bytes alignment for aggregate type including 8 bytes storage types. + KUNIT_EXPECT_EQ(test, 36, sizeof(struct fw_cdev_event_bus_reset)); +#else + KUNIT_EXPECT_EQ(test, 40, sizeof(struct fw_cdev_event_bus_reset)); +#endif + + KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_bus_reset, closure)); + KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_bus_reset, type)); + KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_bus_reset, node_id)); + KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_bus_reset, local_node_id)); + KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_bus_reset, bm_node_id)); + KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_bus_reset, irm_node_id)); + KUNIT_EXPECT_EQ(test, 28, offsetof(struct fw_cdev_event_bus_reset, root_node_id)); + KUNIT_EXPECT_EQ(test, 32, offsetof(struct fw_cdev_event_bus_reset, generation)); +} + static struct kunit_case structure_layout_test_cases[] = { KUNIT_CASE(structure_layout_event_response), KUNIT_CASE(structure_layout_event_request3), KUNIT_CASE(structure_layout_event_response2), KUNIT_CASE(structure_layout_event_phy_packet2), + KUNIT_CASE(structure_layout_event_bus_reset), {} };