summaryrefslogtreecommitdiff
path: root/libdm
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2022-11-25 15:45:47 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2022-11-25 16:41:53 +0100
commita5042375de3fd7146906614bffbcc960349c2b20 (patch)
treeeafb34b07d5ebcd658c540c5a1a76c16b5466f6a /libdm
parentae916f77c92c1765c76fbb849a2eaeb5e0724768 (diff)
downloadlvm2-a5042375de3fd7146906614bffbcc960349c2b20.tar.gz
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
Diffstat (limited to 'libdm')
-rw-r--r--libdm/dm-tools/dmsetup.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/libdm/dm-tools/dmsetup.c b/libdm/dm-tools/dmsetup.c
index 42eeead68..ea03d66c8 100644
--- a/libdm/dm-tools/dmsetup.c
+++ b/libdm/dm-tools/dmsetup.c
@@ -274,6 +274,7 @@ static char _disp_units = 's';
const char *_program_id = DM_STATS_PROGRAM_ID; /* program_id used for reports. */
static uint64_t _statstype = 0; /* stats objects to report */
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;
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))
return_0;
+ _added_target++;
+
return 1;
}
@@ -1175,9 +1178,6 @@ static int _create_one_device(const char *name, const char *file)
_read_ahead_flags))
goto_out;
- if (_switches[NOTABLE_ARG])
- dm_udev_set_sync_support(0);
-
if (_switches[NOUDEVRULES_ARG])
udev_flags |= DM_UDEV_DISABLE_DM_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)
udev_flags |= DM_UDEV_DISABLE_LIBRARY_FALLBACK;
- if (!dm_task_set_cookie(dmt, &cookie, udev_flags) ||
- !_task_run(dmt))
+ if (_switches[NOTABLE_ARG] || !_added_target)
+ 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;
r = 1;