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

config: fix one-node dumpconfig, add dm_config_write_one_node

A regression introduced in 2.02.89 (11e520256b)
caused the lvm dumpconfig <node> to print out
the node as well as its subsequent siblings.
The information about "only_one" mode got lost.

Before this patch (just an example node):
  # lvm dumpconfig global/use_lvmetad
  use_lvmetad=1
  thin_check_executable="/usr/sbin/thin_check"
  thin_check_options="-q"
  (...all nodes to the end of the section)

With this patch applied:
   # lvm dumpconfig global/use_lvmetad
   use_lvmetad=1
This commit is contained in:
Peter Rajnoha 2012-07-20 15:53:04 +02:00
parent 8d5ae472e5
commit 5e36b86c46
5 changed files with 19 additions and 3 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.97 - Version 2.02.97 -
=============================== ===============================
Fix dumpconfig <node> to print only <node> without its siblings (2.02.89).
Do not issue "Failed to handle a client connection" error if lvmetad killed. Do not issue "Failed to handle a client connection" error if lvmetad killed.
Support changing of discard and zeroing for thin pool. Support changing of discard and zeroing for thin pool.
Report used discard for thin pool and volume. Report used discard for thin pool and volume.

View File

@ -1,5 +1,6 @@
Version 1.02.76 - Version 1.02.76 -
=============================== ===============================
Add dm_config_write_one_node to libdevmapper.
Add support for thin pool message release/reserve_metadata_snap. Add support for thin pool message release/reserve_metadata_snap.
Add support for thin pool discard and external origin. Add support for thin pool discard and external origin.
Add configure --enable-udev-rule-exec-detection to detect exec path in rules. Add configure --enable-udev-rule-exec-detection to detect exec path in rules.

View File

@ -473,7 +473,7 @@ int config_write(struct dm_config_tree *cft, const char *file,
} }
} else while (argc--) { } else while (argc--) {
if ((cn = dm_config_find_node(cft->root, *argv))) { if ((cn = dm_config_find_node(cft->root, *argv))) {
if (!dm_config_write_node(cn, _putline_fn, fp)) { if (!dm_config_write_one_node(cn, _putline_fn, fp)) {
log_error("Failure while writing to %s", file); log_error("Failure while writing to %s", file);
r = 0; r = 0;
} }

View File

@ -1488,7 +1488,10 @@ struct dm_config_tree *dm_config_remove_cascaded_tree(struct dm_config_tree *cft
void dm_config_destroy(struct dm_config_tree *cft); void dm_config_destroy(struct dm_config_tree *cft);
typedef int (*dm_putline_fn)(const char *line, void *baton); typedef int (*dm_putline_fn)(const char *line, void *baton);
/* Write the node and any subsequent siblings it has. */
int dm_config_write_node(const struct dm_config_node *cn, dm_putline_fn putline, void *baton); int dm_config_write_node(const struct dm_config_node *cn, dm_putline_fn putline, void *baton);
/* Write given node only without subsequent siblings. */
int dm_config_write_one_node(const struct dm_config_node *cn, dm_putline_fn putline, void *baton);
struct dm_config_node *dm_config_find_node(const struct dm_config_node *cn, const char *path); struct dm_config_node *dm_config_find_node(const struct dm_config_node *cn, const char *path);
int dm_config_has_node(const struct dm_config_node *cn, const char *path); int dm_config_has_node(const struct dm_config_node *cn, const char *path);

View File

@ -331,14 +331,15 @@ static int _write_config(const struct dm_config_node *n, int only_one,
return 1; return 1;
} }
int dm_config_write_node(const struct dm_config_node *cn, dm_putline_fn putline, void *baton) static int _write_node(const struct dm_config_node *cn, int only_one,
dm_putline_fn putline, void *baton)
{ {
struct output_line outline; struct output_line outline;
if (!(outline.mem = dm_pool_create("config_line", 1024))) if (!(outline.mem = dm_pool_create("config_line", 1024)))
return_0; return_0;
outline.putline = putline; outline.putline = putline;
outline.putline_baton = baton; outline.putline_baton = baton;
if (!_write_config(cn, 0, &outline, 0)) { if (!_write_config(cn, only_one, &outline, 0)) {
dm_pool_destroy(outline.mem); dm_pool_destroy(outline.mem);
return_0; return_0;
} }
@ -346,6 +347,16 @@ int dm_config_write_node(const struct dm_config_node *cn, dm_putline_fn putline,
return 1; return 1;
} }
int dm_config_write_one_node(const struct dm_config_node *cn, dm_putline_fn putline, void *baton)
{
return _write_node(cn, 1, putline, baton);
}
int dm_config_write_node(const struct dm_config_node *cn, dm_putline_fn putline, void *baton)
{
return _write_node(cn, 0, putline, baton);
}
/* /*
* parser * parser