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:
parent
40eea582ae
commit
9ef820a2a5
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user