1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

dmsetup: fix udev event handling for create

With newer kernels (>5.13)  DM_CREATE no longer generates
uevent for DM devices without table.
There are even no sysfs block device entries in such case,
although device has asigned major:minor and it is being listed
by 'dmsetup info'.

So this patch calculates amount of 'table' lines and in case
no table line comes from cmdline or stdin - waiting on cookie
is avoided generically instead of disabling just case with
option --notable - which then also skipped handling of an
option --addnodeoncreate (which is however historical and
should be avoided)

As a result there should be no leaking udev cookies and endlessly
waiting commands like this:

dmsetup create mytestdev  </dev/null
This commit is contained in:
Zdenek Kabelac 2022-11-25 15:45:47 +01:00
parent ae916f77c9
commit a5042375de
2 changed files with 10 additions and 5 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.189 - Version 1.02.189 -
===================================== =====================================
Improve 'dmsetup create' without given table line with new kernels.
Version 1.02.187 - 10th November 2022 Version 1.02.187 - 10th November 2022
===================================== =====================================

View File

@ -274,6 +274,7 @@ static char _disp_units = 's';
const char *_program_id = DM_STATS_PROGRAM_ID; /* program_id used for reports. */ const char *_program_id = DM_STATS_PROGRAM_ID; /* program_id used for reports. */
static uint64_t _statstype = 0; /* stats objects to report */ static uint64_t _statstype = 0; /* stats objects to report */
static int _concise_output_produced = 0; /* Was any concise output already printed? */ static int _concise_output_produced = 0; /* Was any concise output already printed? */
static int _added_target = 0; /* Count added target (no target -> no event) */
struct command; struct command;
static const struct command *_selection_cmd = NULL; /* Command to run against each device select with -S */ static const struct command *_selection_cmd = NULL; /* Command to run against each device select with -S */
@ -357,6 +358,8 @@ static int _parse_line(struct dm_task *dmt, char *buffer, const char *file,
if (!dm_task_add_target(dmt, start, size, ttype, ptr)) if (!dm_task_add_target(dmt, start, size, ttype, ptr))
return_0; return_0;
_added_target++;
return 1; return 1;
} }
@ -1175,9 +1178,6 @@ static int _create_one_device(const char *name, const char *file)
_read_ahead_flags)) _read_ahead_flags))
goto_out; goto_out;
if (_switches[NOTABLE_ARG])
dm_udev_set_sync_support(0);
if (_switches[NOUDEVRULES_ARG]) if (_switches[NOUDEVRULES_ARG])
udev_flags |= DM_UDEV_DISABLE_DM_RULES_FLAG | udev_flags |= DM_UDEV_DISABLE_DM_RULES_FLAG |
DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG; DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG;
@ -1194,8 +1194,12 @@ static int _create_one_device(const char *name, const char *file)
if (_udev_only) if (_udev_only)
udev_flags |= DM_UDEV_DISABLE_LIBRARY_FALLBACK; udev_flags |= DM_UDEV_DISABLE_LIBRARY_FALLBACK;
if (!dm_task_set_cookie(dmt, &cookie, udev_flags) || if (_switches[NOTABLE_ARG] || !_added_target)
!_task_run(dmt)) cookie = 0; // ADD event -> no udev event handling
else if (!dm_task_set_cookie(dmt, &cookie, udev_flags))
goto_out;
if (!_task_run(dmt))
goto_out; goto_out;
r = 1; r = 1;