zed: Ignore false 'atari' partitions in autoreplace

libudev will sometimes falsely identify an 'atari' partition on a
blank disk, preventing it from being used in an autoreplace.  This
seems to be a known issue.  The workaround is to just ignore the
fake partition and continue with the autoreplace.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
Closes #13497
Closes #13632
This commit is contained in:
Tony Hutter 2022-07-11 13:35:19 -07:00 committed by GitHub
parent 677ca1e825
commit e4ab3f40df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -208,6 +208,12 @@ zed_udev_monitor(void *arg)
* if this is a disk and it is partitioned, then the * if this is a disk and it is partitioned, then the
* zfs label will reside in a DEVTYPE=partition and * zfs label will reside in a DEVTYPE=partition and
* we can skip passing this event * we can skip passing this event
*
* Special case: Blank disks are sometimes reported with
* an erroneous 'atari' partition, and should not be
* excluded from being used as an autoreplace disk:
*
* https://github.com/openzfs/zfs/issues/13497
*/ */
type = udev_device_get_property_value(dev, "DEVTYPE"); type = udev_device_get_property_value(dev, "DEVTYPE");
part = udev_device_get_property_value(dev, part = udev_device_get_property_value(dev,
@ -215,15 +221,24 @@ zed_udev_monitor(void *arg)
if (type != NULL && type[0] != '\0' && if (type != NULL && type[0] != '\0' &&
strcmp(type, "disk") == 0 && strcmp(type, "disk") == 0 &&
part != NULL && part[0] != '\0') { part != NULL && part[0] != '\0') {
const char *devname =
udev_device_get_property_value(dev, "DEVNAME");
if (strcmp(part, "atari") == 0) {
zed_log_msg(LOG_INFO, zed_log_msg(LOG_INFO,
"%s: skip %s since it has a %s partition already", "%s: %s is reporting an atari partition, "
__func__, "but we're going to assume it's a false "
udev_device_get_property_value(dev, "DEVNAME"), "positive and still use it (issue #13497)",
part); __func__, devname);
} else {
zed_log_msg(LOG_INFO,
"%s: skip %s since it has a %s partition "
"already", __func__, devname, part);
/* skip and wait for partition event */ /* skip and wait for partition event */
udev_device_unref(dev); udev_device_unref(dev);
continue; continue;
} }
}
/* /*
* ignore small partitions * ignore small partitions