[lvm-devel] master - libdm: enhance thin transaction_id validation
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Feb 24 20:17:02 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=203affffc70622e1b0db4734bc631cd7caf22442
Commit: 203affffc70622e1b0db4734bc631cd7caf22442
Parent: c7b7cb60e4de1aff7f9ea9e3a8116f851ef3089c
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Mon Feb 24 09:43:14 2014 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Feb 24 21:06:31 2014 +0100
libdm: enhance thin transaction_id validation
Reuse _node_send_messages for just checking
for valid transaction_id with preload.
This allows earlier detection of incosistent thin pool.
Code does the same thing, except for sending messages.
---
WHATS_NEW_DM | 1 +
libdm/libdm-deptree.c | 21 +++++++++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index c29cb39..32c2265 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.85 -
===================================
+ Reuse _node_send_messages() for validation of transaction_id in preload.
Transaction_id could be lower by one only when messages are prepared.
Do not call callback when preload fails.
Wrap is_selinux_enabled() to be called just once.
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 56ddd1a..fad14d6 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -1478,9 +1478,11 @@ out:
return r;
}
+/* For preload pass only validate pool's transaction_id */
static int _node_send_messages(struct dm_tree_node *dnode,
const char *uuid_prefix,
- size_t uuid_prefix_len)
+ size_t uuid_prefix_len,
+ int send)
{
struct load_segment *seg;
struct thin_message *tmsg;
@@ -1522,6 +1524,9 @@ static int _node_send_messages(struct dm_tree_node *dnode,
return 0;
}
+ if (!send)
+ return 1; /* transaction_id is matching */
+
dm_list_iterate_items(tmsg, &seg->thin_messages)
if (!(_thin_pool_node_message(dnode, tmsg)))
return_0;
@@ -1865,7 +1870,7 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
* has to report failure.
*/
if (r && dnode->props.send_messages &&
- !(r = _node_send_messages(dnode, uuid_prefix, uuid_prefix_len)))
+ !(r = _node_send_messages(dnode, uuid_prefix, uuid_prefix_len, 1)))
stack;
return r;
@@ -2713,6 +2718,18 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
if (!child->info.live_table) {
/* Collect newly introduced devices for revert */
dm_list_add_h(&dnode->activated, &child->activated_list);
+
+ /* When creating new node also check transaction_id. */
+ if (child->props.send_messages &&
+ !_node_send_messages(child, uuid_prefix, uuid_prefix_len, 0)) {
+ stack;
+ if (!dm_udev_wait(dm_tree_get_cookie(dnode)))
+ stack;
+ dm_tree_set_cookie(dnode, 0);
+ (void) _dm_tree_revert_activated(dnode);
+ r = 0;
+ continue;
+ }
}
/* Update cached info */
More information about the lvm-devel
mailing list