diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2015-10-25 19:27:09 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2015-10-25 21:05:15 +0100 |
commit | 9ef820a2a5e174cd08097981d7879e1f4cbded01 (patch) | |
tree | 50ff045949f27d20bae806d3c67903445b8e7058 | |
parent | 40eea582aea512db7fceafd8559bf66df0733b55 (diff) | |
download | lvm2-9ef820a2a5e174cd08097981d7879e1f4cbded01.tar.gz |
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.
-rw-r--r-- | WHATS_NEW_DM | 1 | ||||
-rw-r--r-- | libdm/.exported_symbols.Base | 1 | ||||
-rw-r--r-- | libdm/.exported_symbols.DM_1_02_110 | 1 | ||||
-rw-r--r-- | libdm/libdevmapper.h | 5 | ||||
-rw-r--r-- | libdm/libdm-deptree.c | 25 |
5 files changed, 29 insertions, 4 deletions
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index 910f6d668..e09ab6394 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.110 - ====================================== + Enhance dm_tree_node_size_changed() to recognize size reduction. Support exit on idle for dmenventd (1 hour). Add support to allow unmonitor device from plugin itself. New design for thread co-operation in dmeventd. diff --git a/libdm/.exported_symbols.Base b/libdm/.exported_symbols.Base index f9c3cb1a0..27fef5394 100644 --- a/libdm/.exported_symbols.Base +++ b/libdm/.exported_symbols.Base @@ -262,7 +262,6 @@ dm_tree_node_set_thin_external_origin dm_tree_node_set_thin_pool_discard dm_tree_node_set_thin_pool_error_if_no_space dm_tree_node_set_udev_flags -dm_tree_node_size_changed dm_tree_preload_children dm_tree_retry_remove dm_tree_set_cookie diff --git a/libdm/.exported_symbols.DM_1_02_110 b/libdm/.exported_symbols.DM_1_02_110 index da742eef7..eba56259a 100644 --- a/libdm/.exported_symbols.DM_1_02_110 +++ b/libdm/.exported_symbols.DM_1_02_110 @@ -1,2 +1,3 @@ dm_report_compact_given_fields dm_hold_control_dev +dm_tree_node_size_changed diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h index 08b24feea..f7ab2577e 100644 --- a/libdm/libdevmapper.h +++ b/libdm/libdevmapper.h @@ -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 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); +/* + * 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); /* diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c index afdce8d72..d7e2143ae 100644 --- a/libdm/libdm-deptree.c +++ b/libdm/libdm-deptree.c @@ -220,7 +220,7 @@ struct load_properties { uint32_t read_ahead_flags; unsigned segment_count; - unsigned size_changed; + int size_changed; struct dm_list segs; 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); 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 * 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 */ - if (child->props.size_changed) + if (child->props.size_changed > 0 && !dnode->props.size_changed) 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 */ 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_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 |