diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index 6304ff614..8e221c110 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.88 - ================================= + Warn user about incorrect use of cookie with 'dmsetup remove --force'. Also recognize 'help'/'?' as reserved sort key name to show help. Export recognized DM_REPORT_FIELD_RESERVED_NAME_{HELP,HELP_ALT} to show help. Add dm_units_to_factor for size unit parsing. diff --git a/man/dmsetup.8.in b/man/dmsetup.8.in index 599c843d6..ae8448946 100644 --- a/man/dmsetup.8.in +++ b/man/dmsetup.8.in @@ -243,6 +243,9 @@ Specify a one-line table directly on the command line. .TP .B \-\-udevcookie \fIcookie Use cookie for udev synchronisation. +Note: Same cookie should be used for same type of operations i.e. creation of +multiple different devices. It's not adviced to combine different +operations on the single device. .TP .BR \-u | \-\-uuid Specify the uuid. @@ -429,6 +432,9 @@ process to be killed. If an attempt to remove a device fails, perhaps because a process run from a quick udev rule temporarily opened the device, the \-\-retry option will cause the operation to be retried for a few seconds before failing. +Do NOT combine \fB\-\-force\fP and \fB\-\-udevcookie\fP, +as udev may start to process udev rules in the middle of error target +replacement and result in nondeterministic result. .br .HP .B remove_all diff --git a/tools/dmsetup.c b/tools/dmsetup.c index 4433571ec..f84d1a897 100644 --- a/tools/dmsetup.c +++ b/tools/dmsetup.c @@ -1498,8 +1498,16 @@ error: static int _remove(CMD_ARGS) { - if (_switches[FORCE_ARG] && argc > 1) + if (_switches[FORCE_ARG] && argc > 1) { + /* + * 'remove --force' option is doing 2 operations on the same device + * this is not compatible with the use of --udevcookie/DM_UDEV_COOKIE. + * Udevd collision could be partially avoided with --retry. + */ + if (_udev_cookie) + log_warn("WARNING: Use of cookie and --force is not compatible."); (void) _error_device(cmd, argc, argv, NULL, 0); + } return _simple(DM_DEVICE_REMOVE, argc > 1 ? argv[1] : NULL, 0, 0); }