Hi,
在 2024/03/21 17:17, Mateusz Kusiak 写道:
Hello,
We discovered an issue when trying to create imsm container with mdadm
on dm-device.
The scenario is as follows:
1. Create dm device
# echo -e '0 195312 linear /dev/nvme2n1 0' | dmsetup create nvme2n1DM
2. Create IMSM container.
# dmdev=$(readlink -f /dev/mapper/nvme2n1DM)
# export IMSM_DEVNAME_AS_SERIAL=1 IMSM_NO_PLATFORM=1; mdadm --create
/dev/md/container --metadata=imsm --raid-disks=1 $dmdev --force
Result:
Error message is displayed
# mdadm: imsm: /dev/dm-0 is a partition, cannot be used in IMSM
Mdadm's function for checking "if partition" looks like so.
int test_partition(int fd)
{
/* Check if fd is a whole-disk or a partition.
* BLKPG will return EINVAL on a partition, and BLKPG_DEL_PARTITION
* will return ENXIO on an invalid partition number.
*/
struct blkpg_ioctl_arg a;
struct blkpg_partition p;
a.op = BLKPG_DEL_PARTITION;
a.data = (void*)&p;
a.datalen = sizeof(p);
a.flags = 0;
memset(a.data, 0, a.datalen);
p.pno = 1<<30;
if (ioctl(fd, BLKPG, &a) == 0)
/* Very unlikely, but not a partition */
return 0;
if (errno == ENXIO || errno == ENOTTY)
/* not a partition */
return 0;
return 1;
}
I plugged in with debugger and established that when ioctl is run on
dm-device errno is EINVAL, as if it was a partition.
This is a known regression, reported here:
https://lore.kernel.org/all/CAOYeF9VsmqKMcQjo1k6YkGNujwN-nzfxY17N3F-CMikE1tYp+w@xxxxxxxxxxxxxx/
please try this patch:
https://lore.kernel.org/all/20240118130401.792757-1-lilingfeng@xxxxxxxxxxxxxxx/
Thanks,
Kuai
The issue is reproducible only with newer kernels which leads me te
believe there is a regression in device mapper. This code has been
working stable for last 10+ years, which is another reason. I tested
this on RHEL 8.9 with inbox 5.14 kernel and 6.5.7-1 I happen to have
installed. The issue reproduced only on 6.5.7-1 kernel. I also observed
same regression on stock Ubuntu 24.04 with inbox 6.6.0 kernel.
Can you please point me to when it was introduced and are there any
plans for fixing it?
Thanks,
Mateusz
.