From 472bd5575707c78a6601e4ebe1e0e08e1125f231 Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Wed, 28 Jul 2010 10:30:28 +0000 Subject: [PATCH] Revert unsuccessful table load preparation in combined "create, load and resume" scenario. There was missing "revert" call in _create_and_load_v4 fn while the preparation for table load ends up with failure in create/load/resume sequence. Otherwise we could end up with a device being created, but not table-loaded nor resumed. Even though the table is not loaded and the device is not resumed at this stage, we still need to synchronize with udev when calling the revert "remove" ioctl - there's still a remove uevent generated! The "revert" code does exactly that. --- libdm/ioctl/libdm-iface.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c index 5f71098f0..50cdec848 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -1655,14 +1655,16 @@ static int _create_and_load_v4(struct dm_task *dmt) if (!(task = dm_task_create(DM_DEVICE_RELOAD))) { log_error("Failed to create device-mapper task struct"); _udev_complete(dmt); - return 0; + r = 0; + goto revert; } /* Copy across relevant fields */ if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name)) { dm_task_destroy(task); _udev_complete(dmt); - return 0; + r = 0; + goto revert; } task->read_only = dmt->read_only;