summaryrefslogtreecommitdiffstats
path: root/libdm
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2011-06-27 21:43:58 +0000
committerAlasdair Kergon <agk@redhat.com>2011-06-27 21:43:58 +0000
commit0437bccc3c2c2f19a6fdf008a389330531c40b6a (patch)
tree878bb7ac67a554560525d119abd0bb5dfa6f1474 /libdm
parent94bb67ab37aabf69e7617e8695bf364493c1bfa6 (diff)
downloadlvm2-0437bccc3c2c2f19a6fdf008a389330531c40b6a.tar.gz
lvm2-0437bccc3c2c2f19a6fdf008a389330531c40b6a.tar.xz
lvm2-0437bccc3c2c2f19a6fdf008a389330531c40b6a.zip
Move udev_only logic inside stacked node op code.
(We still need to treat add+readhead+del as a no-op.) Rename udev_fallback to verify_udev_operations. Rename --udevfallback to --verifyudev
Diffstat (limited to 'libdm')
-rw-r--r--libdm/ioctl/libdm-iface.c29
-rw-r--r--libdm/libdm-common.c115
-rw-r--r--libdm/libdm-common.h6
-rw-r--r--libdm/libdm-deptree.c7
4 files changed, 89 insertions, 68 deletions
diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c
index 1157f25d..9aa12a21 100644
--- a/libdm/ioctl/libdm-iface.c
+++ b/libdm/ioctl/libdm-iface.c
@@ -2025,7 +2025,7 @@ int dm_task_run(struct dm_task *dmt)
struct dm_ioctl *dmi;
unsigned command;
int check_udev;
- int udev_only;
+ int rely_on_udev;
int suspended_counter;
#ifdef DM_COMPAT
@@ -2097,40 +2097,43 @@ repeat_ioctl:
}
}
+ /*
+ * Are we expecting a udev operation to occur that we need to check for?
+ */
check_udev = dmt->cookie_set &&
!(dmt->event_nr >> DM_UDEV_FLAGS_SHIFT &
DM_UDEV_DISABLE_DM_RULES_FLAG);
- udev_only = dmt->cookie_set ? (dmt->event_nr >> DM_UDEV_FLAGS_SHIFT &
- DM_UDEV_DISABLE_LIBRARY_FALLBACK) : 0;
+ rely_on_udev = dmt->cookie_set ? (dmt->event_nr >> DM_UDEV_FLAGS_SHIFT &
+ DM_UDEV_DISABLE_LIBRARY_FALLBACK) : 0;
switch (dmt->type) {
case DM_DEVICE_CREATE:
if ((dmt->add_node == DM_ADD_NODE_ON_CREATE) &&
- dmt->dev_name && *dmt->dev_name && !udev_only)
+ dmt->dev_name && *dmt->dev_name && !rely_on_udev)
add_dev_node(dmt->dev_name, MAJOR(dmi->dev),
MINOR(dmi->dev), dmt->uid, dmt->gid,
- dmt->mode, check_udev);
+ dmt->mode, check_udev, rely_on_udev);
break;
case DM_DEVICE_REMOVE:
/* FIXME Kernel needs to fill in dmi->name */
- if (dmt->dev_name && !udev_only)
- rm_dev_node(dmt->dev_name, check_udev);
+ if (dmt->dev_name && !rely_on_udev)
+ rm_dev_node(dmt->dev_name, check_udev, rely_on_udev);
break;
case DM_DEVICE_RENAME:
/* FIXME Kernel needs to fill in dmi->name */
- if (!dmt->new_uuid && dmt->dev_name && !udev_only)
+ if (!dmt->new_uuid && dmt->dev_name)
rename_dev_node(dmt->dev_name, dmt->newname,
- check_udev);
+ check_udev, rely_on_udev);
break;
case DM_DEVICE_RESUME:
if ((dmt->add_node == DM_ADD_NODE_ON_RESUME) &&
- dmt->dev_name && *dmt->dev_name && !udev_only)
+ dmt->dev_name && *dmt->dev_name)
add_dev_node(dmt->dev_name, MAJOR(dmi->dev),
MINOR(dmi->dev), dmt->uid, dmt->gid,
- dmt->mode, check_udev);
+ dmt->mode, check_udev, rely_on_udev);
/* FIXME Kernel needs to fill in dmi->name */
set_dev_node_read_ahead(dmt->dev_name, dmt->read_ahead,
dmt->read_ahead_flags);
@@ -2140,9 +2143,9 @@ repeat_ioctl:
if (dmi->flags & DM_EXISTS_FLAG)
add_dev_node(dmi->name, MAJOR(dmi->dev),
MINOR(dmi->dev), dmt->uid,
- dmt->gid, dmt->mode, 0);
+ dmt->gid, dmt->mode, 0, rely_on_udev);
else if (dmt->dev_name)
- rm_dev_node(dmt->dev_name, 0);
+ rm_dev_node(dmt->dev_name, 0, rely_on_udev);
break;
case DM_DEVICE_STATUS:
diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c
index b2b34b81..49a77285 100644
--- a/libdm/libdm-common.c
+++ b/libdm/libdm-common.c
@@ -501,8 +501,13 @@ void selinux_release(void)
#endif
}
+static int _warn_if_op_needed(int warn_if_udev_failed)
+{
+ return warn_if_udev_failed && dm_udev_get_sync_support() && dm_udev_get_checking();
+}
+
static int _add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
- uid_t uid, gid_t gid, mode_t mode, int check_udev)
+ uid_t uid, gid_t gid, mode_t mode, int warn_if_udev_failed)
{
char path[PATH_MAX];
struct stat info;
@@ -527,8 +532,7 @@ static int _add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
dev_name);
return 0;
}
- } else if (dm_udev_get_sync_support() && dm_udev_get_checking() &&
- check_udev)
+ } else if (_warn_if_op_needed(warn_if_udev_failed))
log_warn("%s not set up by udev: Falling back to direct "
"node creation.", path);
@@ -553,7 +557,7 @@ static int _add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
return 1;
}
-static int _rm_dev_node(const char *dev_name, int check_udev)
+static int _rm_dev_node(const char *dev_name, int warn_if_udev_failed)
{
char path[PATH_MAX];
struct stat info;
@@ -562,8 +566,7 @@ static int _rm_dev_node(const char *dev_name, int check_udev)
if (stat(path, &info) < 0)
return 1;
- else if (dm_udev_get_sync_support() && dm_udev_get_checking() &&
- check_udev)
+ else if (_warn_if_op_needed(warn_if_udev_failed))
log_warn("Node %s was not removed by udev. "
"Falling back to direct node removal.", path);
@@ -578,7 +581,7 @@ static int _rm_dev_node(const char *dev_name, int check_udev)
}
static int _rename_dev_node(const char *old_name, const char *new_name,
- int check_udev)
+ int warn_if_udev_failed)
{
char oldpath[PATH_MAX];
char newpath[PATH_MAX];
@@ -593,8 +596,7 @@ static int _rename_dev_node(const char *old_name, const char *new_name,
"is already present", newpath);
return 0;
}
- else if (dm_udev_get_sync_support() && dm_udev_get_checking() &&
- check_udev) {
+ else if (_warn_if_op_needed(warn_if_udev_failed)) {
if (stat(oldpath, &info) < 0 &&
errno == ENOENT)
/* assume udev already deleted this */
@@ -618,8 +620,7 @@ static int _rename_dev_node(const char *old_name, const char *new_name,
return 0;
}
}
- else if (dm_udev_get_sync_support() && dm_udev_get_checking() &&
- check_udev)
+ else if (_warn_if_op_needed(warn_if_udev_failed))
log_warn("The node %s should have been renamed to %s "
"by udev but new node is not present. "
"Falling back to direct node rename.",
@@ -759,16 +760,16 @@ typedef enum {
static int _do_node_op(node_op_t type, const char *dev_name, uint32_t major,
uint32_t minor, uid_t uid, gid_t gid, mode_t mode,
const char *old_name, uint32_t read_ahead,
- uint32_t read_ahead_flags, int check_udev)
+ uint32_t read_ahead_flags, int warn_if_udev_failed)
{
switch (type) {
case NODE_ADD:
return _add_dev_node(dev_name, major, minor, uid, gid,
- mode, check_udev);
+ mode, warn_if_udev_failed);
case NODE_DEL:
- return _rm_dev_node(dev_name, check_udev);
+ return _rm_dev_node(dev_name, warn_if_udev_failed);
case NODE_RENAME:
- return _rename_dev_node(old_name, dev_name, check_udev);
+ return _rename_dev_node(old_name, dev_name, warn_if_udev_failed);
case NODE_READ_AHEAD:
return _set_dev_node_read_ahead(dev_name, read_ahead,
read_ahead_flags);
@@ -794,7 +795,8 @@ struct node_op_parms {
uint32_t read_ahead;
uint32_t read_ahead_flags;
char *old_name;
- int check_udev;
+ int warn_if_udev_failed;
+ unsigned rely_on_udev;
char names[0];
};
@@ -824,16 +826,33 @@ static int _other_node_ops(node_op_t type)
return 0;
}
-/* Check if udev is supposed to create nodes */
-static int _check_udev(int check_udev)
+static void _log_node_op(const char *action_str, struct node_op_parms *nop)
{
- return check_udev && dm_udev_get_sync_support() && dm_udev_get_checking();
+ switch (nop->type) {
+ case NODE_ADD:
+ log_debug("%s: %s NODE_ADD (%" PRIu32 ",%" PRIu32 ") %u:%u 0%o",
+ nop->dev_name, action_str, nop->major, nop->minor, nop->uid, nop->gid, nop->mode);
+ break;
+ case NODE_DEL:
+ log_debug("%s: %s NODE_DEL", nop->dev_name, action_str);
+ break;
+ case NODE_RENAME:
+ log_debug("%s: %s NODE_RENAME to %s", nop->old_name, action_str, nop->dev_name);
+ break;
+ case NODE_READ_AHEAD:
+ log_debug("%s: %s NODE_READ_AHEAD %" PRIu32 " (flags=%" PRIu32
+ ")", nop->dev_name, action_str, nop->read_ahead, nop->read_ahead_flags);
+ break;
+ default:
+ ; /* NOTREACHED */
+ }
}
static int _stack_node_op(node_op_t type, const char *dev_name, uint32_t major,
uint32_t minor, uid_t uid, gid_t gid, mode_t mode,
const char *old_name, uint32_t read_ahead,
- uint32_t read_ahead_flags, int check_udev)
+ uint32_t read_ahead_flags, int warn_if_udev_failed,
+ unsigned rely_on_udev)
{
struct node_op_parms *nop;
struct dm_list *noph, *nopht;
@@ -841,7 +860,7 @@ static int _stack_node_op(node_op_t type, const char *dev_name, uint32_t major,
char *pos;
/*
- * Note: check_udev must have valid content
+ * Note: warn_if_udev_failed must have valid content
*/
if ((type == NODE_DEL) && _other_node_ops(type))
/*
@@ -850,27 +869,29 @@ static int _stack_node_op(node_op_t type, const char *dev_name, uint32_t major,
dm_list_iterate_safe(noph, nopht, &_node_ops) {
nop = dm_list_item(noph, struct node_op_parms);
if (!strcmp(dev_name, nop->dev_name)) {
+ _log_node_op("Unstacking", nop);
_del_node_op(nop);
if (!_other_node_ops(type))
break; /* no other non DEL ops */
}
}
- else if ((type == NODE_ADD) && _count_node_ops[NODE_DEL] && _check_udev(check_udev))
+ else if ((type == NODE_ADD) && _count_node_ops[NODE_DEL])
/*
- * If udev is running ignore previous DEL operation on added node.
+ * Ignore previous DEL operation on added node.
* (No other operations for this device then DEL could be stacked here).
*/
dm_list_iterate_safe(noph, nopht, &_node_ops) {
nop = dm_list_item(noph, struct node_op_parms);
if ((nop->type == NODE_DEL) &&
!strcmp(dev_name, nop->dev_name)) {
+ _log_node_op("Unstacking", nop);
_del_node_op(nop);
break; /* no other DEL ops */
}
}
- else if ((type == NODE_RENAME) && _check_udev(check_udev))
+ else if ((type == NODE_RENAME))
/*
- * If udev is running ignore any outstanding operations if renaming it.
+ * Ignore any outstanding operations if renaming it.
*
* Currently RENAME operation happens through 'suspend -> resume'.
* On 'resume' device is added with read_ahead settings, so it is
@@ -880,6 +901,7 @@ static int _stack_node_op(node_op_t type, const char *dev_name, uint32_t major,
dm_list_iterate_safe(noph, nopht, &_node_ops) {
nop = dm_list_item(noph, struct node_op_parms);
if (!strcmp(old_name, nop->dev_name))
+ _log_node_op("Unstacking", nop);
_del_node_op(nop);
}
@@ -897,7 +919,8 @@ static int _stack_node_op(node_op_t type, const char *dev_name, uint32_t major,
nop->mode = mode;
nop->read_ahead = read_ahead;
nop->read_ahead_flags = read_ahead_flags;
- nop->check_udev = check_udev;
+ nop->warn_if_udev_failed = warn_if_udev_failed;
+ nop->rely_on_udev = rely_on_udev;
_store_str(&pos, &nop->dev_name, dev_name);
_store_str(&pos, &nop->old_name, old_name);
@@ -905,6 +928,8 @@ static int _stack_node_op(node_op_t type, const char *dev_name, uint32_t major,
_count_node_ops[type]++;
dm_list_add(&_node_ops, &nop->list);
+ _log_node_op("Stacking", nop);
+
return 1;
}
@@ -915,38 +940,35 @@ static void _pop_node_ops(void)
dm_list_iterate_safe(noph, nopht, &_node_ops) {
nop = dm_list_item(noph, struct node_op_parms);
- _do_node_op(nop->type, nop->dev_name, nop->major, nop->minor,
- nop->uid, nop->gid, nop->mode, nop->old_name,
- nop->read_ahead, nop->read_ahead_flags,
- nop->check_udev);
+ if (!nop->rely_on_udev) {
+ _log_node_op("Processing", nop);
+ _do_node_op(nop->type, nop->dev_name, nop->major, nop->minor,
+ nop->uid, nop->gid, nop->mode, nop->old_name,
+ nop->read_ahead, nop->read_ahead_flags,
+ nop->warn_if_udev_failed);
+ } else
+ _log_node_op("Skipping (udev)", nop);
_del_node_op(nop);
}
}
int add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
- uid_t uid, gid_t gid, mode_t mode, int check_udev)
+ uid_t uid, gid_t gid, mode_t mode, int check_udev, unsigned rely_on_udev)
{
- log_debug("%s: Stacking NODE_ADD (%" PRIu32 ",%" PRIu32 ") %u:%u 0%o",
- dev_name, major, minor, uid, gid, mode);
-
return _stack_node_op(NODE_ADD, dev_name, major, minor, uid,
- gid, mode, "", 0, 0, check_udev);
+ gid, mode, "", 0, 0, check_udev, rely_on_udev);
}
-int rename_dev_node(const char *old_name, const char *new_name, int check_udev)
+int rename_dev_node(const char *old_name, const char *new_name, int check_udev, unsigned rely_on_udev)
{
- log_debug("%s: Stacking NODE_RENAME to %s", old_name, new_name);
-
return _stack_node_op(NODE_RENAME, new_name, 0, 0, 0,
- 0, 0, old_name, 0, 0, check_udev);
+ 0, 0, old_name, 0, 0, check_udev, rely_on_udev);
}
-int rm_dev_node(const char *dev_name, int check_udev)
+int rm_dev_node(const char *dev_name, int check_udev, unsigned rely_on_udev)
{
- log_debug("%s: Stacking NODE_DEL (replaces other stacked ops)", dev_name);
-
return _stack_node_op(NODE_DEL, dev_name, 0, 0, 0,
- 0, 0, "", 0, 0, check_udev);
+ 0, 0, "", 0, 0, check_udev, rely_on_udev);
}
int set_dev_node_read_ahead(const char *dev_name, uint32_t read_ahead,
@@ -955,11 +977,8 @@ int set_dev_node_read_ahead(const char *dev_name, uint32_t read_ahead,
if (read_ahead == DM_READ_AHEAD_AUTO)
return 1;
- log_debug("%s: Stacking NODE_READ_AHEAD %" PRIu32 " (flags=%" PRIu32
- ")", dev_name, read_ahead, read_ahead_flags);
-
return _stack_node_op(NODE_READ_AHEAD, dev_name, 0, 0, 0, 0,
- 0, "", read_ahead, read_ahead_flags, 0);
+ 0, "", read_ahead, read_ahead_flags, 0, 0);
}
void update_devs(void)
@@ -1428,7 +1447,7 @@ static int _udev_wait(uint32_t cookie)
return 0;
}
- log_debug("Udev cookie 0x%" PRIx32 " (semid %d): Waiting for zero",
+ log_debug("Udev cookie 0x%" PRIx32 " (semid %d) waiting for zero",
cookie, semid);
repeat_wait:
diff --git a/libdm/libdm-common.h b/libdm/libdm-common.h
index 2435f274..8b713ba4 100644
--- a/libdm/libdm-common.h
+++ b/libdm/libdm-common.h
@@ -23,10 +23,10 @@ struct target *create_target(uint64_t start,
const char *type, const char *params);
int add_dev_node(const char *dev_name, uint32_t minor, uint32_t major,
- uid_t uid, gid_t gid, mode_t mode, int check_udev);
-int rm_dev_node(const char *dev_name, int check_udev);
+ uid_t uid, gid_t gid, mode_t mode, int check_udev, unsigned rely_on_udev);
+int rm_dev_node(const char *dev_name, int check_udev, unsigned rely_on_udev);
int rename_dev_node(const char *old_name, const char *new_name,
- int check_udev);
+ int check_udev, unsigned rely_on_udev);
int get_dev_node_read_ahead(const char *dev_name, uint32_t *read_ahead);
int set_dev_node_read_ahead(const char *dev_name, uint32_t read_ahead,
uint32_t read_ahead_flags);
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index ff1f0dde..72eef576 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -983,10 +983,9 @@ static int _deactivate_node(const char *name, uint32_t major, uint32_t minor,
r = dm_task_run(dmt);
- /* FIXME Until kernel returns actual name so dm-ioctl.c can handle it */
- if (!(udev_flags & DM_UDEV_DISABLE_LIBRARY_FALLBACK))
- rm_dev_node(name, dmt->cookie_set &&
- !(udev_flags & DM_UDEV_DISABLE_DM_RULES_FLAG));
+ /* FIXME Until kernel returns actual name so dm-iface.c can handle it */
+ rm_dev_node(name, dmt->cookie_set && !(udev_flags & DM_UDEV_DISABLE_DM_RULES_FLAG),
+ dmt->cookie_set && !(udev_flags & DM_UDEV_DISABLE_LIBRARY_FALLBACK));
/* FIXME Remove node from tree or mark invalid? */