1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

libdm: dm_tree_node_size_changed recognizes reduction

Add more functionality to size_changed function.
While 'existing' API only detected  0 for
unchanged,  and !0 for changed,
new improved API will also detected if the
size has only went bigger - or there was
size reduction.

Function work for the whole dm-tree - so
no change is size is always 0.
only size extension  1.
and if some size reduction is there - returns -1.

This result can be used for better evaluation
whether we need to flush before suspend.
This commit is contained in:
Zdenek Kabelac 2015-10-25 19:27:09 +01:00
parent 40eea582ae
commit 9ef820a2a5
5 changed files with 29 additions and 4 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.110 - Version 1.02.110 -
====================================== ======================================
Enhance dm_tree_node_size_changed() to recognize size reduction.
Support exit on idle for dmenventd (1 hour). Support exit on idle for dmenventd (1 hour).
Add support to allow unmonitor device from plugin itself. Add support to allow unmonitor device from plugin itself.
New design for thread co-operation in dmeventd. New design for thread co-operation in dmeventd.

View File

@ -262,7 +262,6 @@ dm_tree_node_set_thin_external_origin
dm_tree_node_set_thin_pool_discard dm_tree_node_set_thin_pool_discard
dm_tree_node_set_thin_pool_error_if_no_space dm_tree_node_set_thin_pool_error_if_no_space
dm_tree_node_set_udev_flags dm_tree_node_set_udev_flags
dm_tree_node_size_changed
dm_tree_preload_children dm_tree_preload_children
dm_tree_retry_remove dm_tree_retry_remove
dm_tree_set_cookie dm_tree_set_cookie

View File

@ -1,2 +1,3 @@
dm_report_compact_given_fields dm_report_compact_given_fields
dm_hold_control_dev dm_hold_control_dev
dm_tree_node_size_changed

View File

@ -1256,6 +1256,11 @@ const char *dm_tree_node_get_name(const struct dm_tree_node *node);
const char *dm_tree_node_get_uuid(const struct dm_tree_node *node); const char *dm_tree_node_get_uuid(const struct dm_tree_node *node);
const struct dm_info *dm_tree_node_get_info(const struct dm_tree_node *node); const struct dm_info *dm_tree_node_get_info(const struct dm_tree_node *node);
void *dm_tree_node_get_context(const struct dm_tree_node *node); void *dm_tree_node_get_context(const struct dm_tree_node *node);
/*
* Returns 0 when node size and its children is unchanged.
* Returns 1 when node or any of its children has increased size.
* Rerurns -1 when node or any of its children has reduced size.
*/
int dm_tree_node_size_changed(const struct dm_tree_node *dnode); int dm_tree_node_size_changed(const struct dm_tree_node *dnode);
/* /*

View File

@ -220,7 +220,7 @@ struct load_properties {
uint32_t read_ahead_flags; uint32_t read_ahead_flags;
unsigned segment_count; unsigned segment_count;
unsigned size_changed; int size_changed;
struct dm_list segs; struct dm_list segs;
const char *new_name; const char *new_name;
@ -2729,7 +2729,8 @@ static int _load_node(struct dm_tree_node *dnode)
existing_table_size = dm_task_get_existing_table_size(dmt); existing_table_size = dm_task_get_existing_table_size(dmt);
if ((dnode->props.size_changed = if ((dnode->props.size_changed =
(existing_table_size == seg_start) ? 0 : 1)) { (existing_table_size == seg_start) ? 0 :
(existing_table_size > seg_start) ? -1 : 1)) {
/* /*
* Kernel usually skips size validation on zero-length devices * Kernel usually skips size validation on zero-length devices
* now so no need to preload them. * now so no need to preload them.
@ -2825,8 +2826,10 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
} }
/* Propagate device size change change */ /* Propagate device size change change */
if (child->props.size_changed) if (child->props.size_changed > 0 && !dnode->props.size_changed)
dnode->props.size_changed = 1; dnode->props.size_changed = 1;
else if (child->props.size_changed < 0)
dnode->props.size_changed = -1;
/* Resume device immediately if it has parents and its size changed */ /* Resume device immediately if it has parents and its size changed */
if (!dm_tree_node_num_children(child, 1) || !child->props.size_changed) if (!dm_tree_node_num_children(child, 1) || !child->props.size_changed)
@ -3853,3 +3856,19 @@ void dm_tree_node_set_callback(struct dm_tree_node *dnode,
dnode->callback = cb; dnode->callback = cb;
dnode->callback_data = data; dnode->callback_data = data;
} }
/*
* Backward compatible dm_tree_node_size_changed() implementations.
*
* Keep these at the end of the file to avoid adding clutter around the
* current dm_tree_node_size_changed() version.
*/
#if defined(__GNUC__)
int dm_tree_node_size_changed_base(const struct dm_tree_node *dnode);
DM_EXPORT_SYMBOL_BASE(dm_tree_node_size_changed);
int dm_tree_node_size_changed_base(const struct dm_tree_node *dnode)
{
/* Base does not make difference between smaller and bigger */
return dm_tree_node_size_changed(dnode) ? 1 : 0;
}
#endif