mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-04 09:18:36 +03:00
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.
This commit is contained in:
parent
c7b7cb60e4
commit
203affffc7
@ -1,5 +1,6 @@
|
|||||||
Version 1.02.85 -
|
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.
|
Transaction_id could be lower by one only when messages are prepared.
|
||||||
Do not call callback when preload fails.
|
Do not call callback when preload fails.
|
||||||
Wrap is_selinux_enabled() to be called just once.
|
Wrap is_selinux_enabled() to be called just once.
|
||||||
|
@ -1478,9 +1478,11 @@ out:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For preload pass only validate pool's transaction_id */
|
||||||
static int _node_send_messages(struct dm_tree_node *dnode,
|
static int _node_send_messages(struct dm_tree_node *dnode,
|
||||||
const char *uuid_prefix,
|
const char *uuid_prefix,
|
||||||
size_t uuid_prefix_len)
|
size_t uuid_prefix_len,
|
||||||
|
int send)
|
||||||
{
|
{
|
||||||
struct load_segment *seg;
|
struct load_segment *seg;
|
||||||
struct thin_message *tmsg;
|
struct thin_message *tmsg;
|
||||||
@ -1522,6 +1524,9 @@ static int _node_send_messages(struct dm_tree_node *dnode,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!send)
|
||||||
|
return 1; /* transaction_id is matching */
|
||||||
|
|
||||||
dm_list_iterate_items(tmsg, &seg->thin_messages)
|
dm_list_iterate_items(tmsg, &seg->thin_messages)
|
||||||
if (!(_thin_pool_node_message(dnode, tmsg)))
|
if (!(_thin_pool_node_message(dnode, tmsg)))
|
||||||
return_0;
|
return_0;
|
||||||
@ -1865,7 +1870,7 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
|
|||||||
* has to report failure.
|
* has to report failure.
|
||||||
*/
|
*/
|
||||||
if (r && dnode->props.send_messages &&
|
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;
|
stack;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
@ -2713,6 +2718,18 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
|
|||||||
if (!child->info.live_table) {
|
if (!child->info.live_table) {
|
||||||
/* Collect newly introduced devices for revert */
|
/* Collect newly introduced devices for revert */
|
||||||
dm_list_add_h(&dnode->activated, &child->activated_list);
|
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 */
|
/* Update cached info */
|
||||||
|
Loading…
Reference in New Issue
Block a user