r474 - in devmapper/trunk: . dmsetup
Bastian Blank
waldi at alioth.debian.org
Fri Jun 22 11:14:34 UTC 2007
Author: waldi
Date: Fri Jun 22 11:14:34 2007
New Revision: 474
Log:
Merge /devmapper/upstream/current (1.02.20).
Modified:
devmapper/trunk/ (props changed)
devmapper/trunk/VERSION
devmapper/trunk/WHATS_NEW
devmapper/trunk/dmsetup/dmsetup.c
Modified: devmapper/trunk/VERSION
==============================================================================
--- devmapper/trunk/VERSION (original)
+++ devmapper/trunk/VERSION Fri Jun 22 11:14:34 2007
@@ -1 +1 @@
-1.02.19 (2007-04-27)
+1.02.20 (2007-06-15)
Modified: devmapper/trunk/WHATS_NEW
==============================================================================
--- devmapper/trunk/WHATS_NEW (original)
+++ devmapper/trunk/WHATS_NEW Fri Jun 22 11:14:34 2007
@@ -1,3 +1,8 @@
+Version 1.02.20 - 15th June 2007
+================================
+ Fix default dmsetup report buffering and add --unbuffered.
+ Add tree-based and dependency fields to dmsetup reports.
+
Version 1.02.19 - 27th April 2007
=================================
Standardise protective include file #defines.
Modified: devmapper/trunk/dmsetup/dmsetup.c
==============================================================================
--- devmapper/trunk/dmsetup/dmsetup.c (original)
+++ devmapper/trunk/dmsetup/dmsetup.c Fri Jun 22 11:14:34 2007
@@ -90,6 +90,11 @@
#define ARGS_MAX 256
#define LOOP_TABLE_SIZE (PATH_MAX + 255)
+/* FIXME Should be imported */
+#ifndef DM_MAX_TYPE_NAME
+# define DM_MAX_TYPE_NAME 16
+#endif
+
/* FIXME Should be elsewhere */
#define SECTOR_SHIFT 9L
#define DEV_PATH "/dev/"
@@ -121,12 +126,20 @@
TARGET_ARG,
TREE_ARG,
UID_ARG,
+ UNBUFFERED_ARG,
UUID_ARG,
VERBOSE_ARG,
VERSION_ARG,
NUM_SWITCHES
};
+typedef enum {
+ DR_TASK = 1,
+ DR_INFO = 2,
+ DR_DEPS = 4,
+ DR_TREE = 8 /* Complete dependency tree required */
+} report_type_t;
+
static int _switches[NUM_SWITCHES];
static int _int_args[NUM_SWITCHES];
static char *_string_args[NUM_SWITCHES];
@@ -137,6 +150,7 @@
static char *_command;
static struct dm_tree *_dtree;
static struct dm_report *_report;
+static report_type_t _report_type;
/*
* Commands
@@ -240,11 +254,45 @@
struct dmsetup_report_obj {
struct dm_task *task;
struct dm_info *info;
+ struct dm_task *deps_task;
+ struct dm_tree_node *tree_node;
};
+static struct dm_task *_get_deps_task(int major, int minor)
+{
+ struct dm_task *dmt;
+ struct dm_info info;
+
+ if (!(dmt = dm_task_create(DM_DEVICE_DEPS)))
+ return NULL;
+
+ if (!dm_task_set_major(dmt, major) ||
+ !dm_task_set_minor(dmt, minor))
+ goto err;
+
+ if (_switches[NOOPENCOUNT_ARG] && !dm_task_no_open_count(dmt))
+ goto err;
+
+ if (!dm_task_run(dmt))
+ goto err;
+
+ if (!dm_task_get_info(dmt, &info))
+ goto err;
+
+ if (!info.exists)
+ goto err;
+
+ return dmt;
+
+ err:
+ dm_task_destroy(dmt);
+ return NULL;
+}
+
static int _display_info_cols(struct dm_task *dmt, struct dm_info *info)
{
struct dmsetup_report_obj obj;
+ int r = 0;
if (!info->exists) {
fprintf(stderr, "Device does not exist.\n");
@@ -253,11 +301,23 @@
obj.task = dmt;
obj.info = info;
+ obj.deps_task = NULL;
+
+ if (_report_type & DR_TREE)
+ obj.tree_node = dm_tree_find_node(_dtree, info->major, info->minor);
+
+ if (_report_type & DR_DEPS)
+ obj.deps_task = _get_deps_task(info->major, info->minor);
if (!dm_report_object(_report, &obj))
- return 0;
+ goto out;
- return 1;
+ r = 1;
+
+ out:
+ if (obj.deps_task)
+ dm_task_destroy(obj.deps_task);
+ return r;
}
static void _display_info_long(struct dm_task *dmt, struct dm_info *info)
@@ -1419,7 +1479,8 @@
/*
* Walk the dependency tree
*/
-static void _tree_walk_children(struct dm_tree_node *node, unsigned depth)
+static void _display_tree_walk_children(struct dm_tree_node *node,
+ unsigned depth)
{
struct dm_tree_node *child, *next_child;
void *handle = NULL;
@@ -1438,7 +1499,7 @@
next_child ? 0U : 1U, has_children);
if (has_children)
- _tree_walk_children(child, depth + 1);
+ _display_tree_walk_children(child, depth + 1);
first_child = 0;
}
@@ -1457,17 +1518,28 @@
/*
* Create and walk dependency tree
*/
-static int _tree(int argc, char **argv, void *data __attribute((unused)))
+static int _build_whole_deptree(void)
{
+ if (_dtree)
+ return 1;
+
if (!(_dtree = dm_tree_create()))
return 0;
- if (!_process_all(argc, argv, 0, _add_dep))
+ if (!_process_all(0, NULL, 0, _add_dep))
return 0;
- _tree_walk_children(dm_tree_find_node(_dtree, 0, 0), 0);
+ return 1;
+}
- dm_tree_free(_dtree);
+static int _display_tree(int argc __attribute((unused)),
+ char **argv __attribute((unused)),
+ void *data __attribute((unused)))
+{
+ if (!_build_whole_deptree())
+ return 0;
+
+ _display_tree_walk_children(dm_tree_find_node(_dtree, 0, 0), 0);
return 1;
}
@@ -1490,8 +1562,8 @@
static int _uint32_disp(struct dm_report *rh,
struct dm_pool *mem __attribute((unused)),
- struct dm_report_field *field, const void *data,
- void *private __attribute((unused)))
+ struct dm_report_field *field, const void *data,
+ void *private __attribute((unused)))
{
const uint32_t value = *(const int32_t *)data;
@@ -1539,8 +1611,203 @@
return dm_report_field_string(rh, field, &s);
}
-/* Report types */
-enum { DR_TASK = 1, DR_INFO = 2 };
+static int _dm_info_devno_disp(struct dm_report *rh, struct dm_pool *mem,
+ struct dm_report_field *field, const void *data,
+ void *private)
+{
+ char buf[DM_MAX_TYPE_NAME], *repstr;
+ struct dm_info *info = (struct dm_info *) data;
+
+ if (!dm_pool_begin_object(mem, 8)) {
+ log_error("dm_pool_begin_object failed");
+ return 0;
+ }
+
+ if (dm_snprintf(buf, sizeof(buf), "%d:%d",
+ info->major, info->minor) < 0) {
+ log_error("dm_pool_alloc failed");
+ goto out_abandon;
+ }
+
+ if (!dm_pool_grow_object(mem, buf, strlen(buf))) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+
+ repstr = dm_pool_end_object(mem);
+ dm_report_field_set_value(field, repstr, repstr);
+ return 1;
+
+ out_abandon:
+ dm_pool_abandon_object(mem);
+ return 0;
+}
+
+static int _dm_tree_names(struct dm_report *rh, struct dm_pool *mem,
+ struct dm_report_field *field, const void *data,
+ void *private, unsigned inverted)
+{
+ struct dm_tree_node *node = (struct dm_tree_node *) data, *parent;
+ void *t = NULL;
+ const char *name;
+ int first_node = 1;
+ char *repstr;
+
+ if (!dm_pool_begin_object(mem, 16)) {
+ log_error("dm_pool_begin_object failed");
+ return 0;
+ }
+
+ while ((parent = dm_tree_next_child(&t, node, inverted))) {
+ name = dm_tree_node_get_name(parent);
+ if (!name || !*name)
+ continue;
+ if (!first_node && !dm_pool_grow_object(mem, ",", 1)) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+ if (!dm_pool_grow_object(mem, name, strlen(name))) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+ if (first_node)
+ first_node = 0;
+ }
+
+ if (!dm_pool_grow_object(mem, "\0", 1)) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+
+ repstr = dm_pool_end_object(mem);
+ dm_report_field_set_value(field, repstr, repstr);
+ return 1;
+
+ out_abandon:
+ dm_pool_abandon_object(mem);
+ return 0;
+}
+
+static int _dm_deps_names_disp(struct dm_report *rh,
+ struct dm_pool *mem,
+ struct dm_report_field *field,
+ const void *data, void *private)
+{
+ return _dm_tree_names(rh, mem, field, data, private, 0);
+}
+
+static int _dm_tree_parents_names_disp(struct dm_report *rh,
+ struct dm_pool *mem,
+ struct dm_report_field *field,
+ const void *data, void *private)
+{
+ return _dm_tree_names(rh, mem, field, data, private, 1);
+}
+
+static int _dm_tree_parents_devs_disp(struct dm_report *rh, struct dm_pool *mem,
+ struct dm_report_field *field,
+ const void *data, void *private)
+{
+ struct dm_tree_node *node = (struct dm_tree_node *) data, *parent;
+ void *t = NULL;
+ const struct dm_info *info;
+ int first_node = 1;
+ char buf[DM_MAX_TYPE_NAME], *repstr;
+
+ if (!dm_pool_begin_object(mem, 16)) {
+ log_error("dm_pool_begin_object failed");
+ return 0;
+ }
+
+ while ((parent = dm_tree_next_child(&t, node, 1))) {
+ info = dm_tree_node_get_info(parent);
+ if (!info->major && !info->minor)
+ continue;
+ if (!first_node && !dm_pool_grow_object(mem, ",", 1)) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+ if (dm_snprintf(buf, sizeof(buf), "%d:%d",
+ info->major, info->minor) < 0) {
+ log_error("dm_snprintf failed");
+ goto out_abandon;
+ }
+ if (!dm_pool_grow_object(mem, buf, strlen(buf))) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+ if (first_node)
+ first_node = 0;
+ }
+
+ if (!dm_pool_grow_object(mem, "\0", 1)) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+
+ repstr = dm_pool_end_object(mem);
+ dm_report_field_set_value(field, repstr, repstr);
+ return 1;
+
+ out_abandon:
+ dm_pool_abandon_object(mem);
+ return 0;
+}
+
+static int _dm_tree_parents_count_disp(struct dm_report *rh,
+ struct dm_pool *mem,
+ struct dm_report_field *field,
+ const void *data, void *private)
+{
+ struct dm_tree_node *node = (struct dm_tree_node *) data;
+ int num_parent = dm_tree_node_num_children(node, 1);
+
+ return dm_report_field_int(rh, field, &num_parent);
+}
+
+static int _dm_deps_disp(struct dm_report *rh, struct dm_pool *mem,
+ struct dm_report_field *field, const void *data,
+ void *private)
+{
+ struct dm_deps *deps = (struct dm_deps *) data;
+ int i;
+ char buf[DM_MAX_TYPE_NAME], *repstr;
+
+ if (!dm_pool_begin_object(mem, 16)) {
+ log_error("dm_pool_begin_object failed");
+ return 0;
+ }
+
+ for (i = 0; i < deps->count; i++) {
+ if (dm_snprintf(buf, sizeof(buf), "%d:%d",
+ (int) MAJOR(deps->device[i]),
+ (int) MINOR(deps->device[i])) < 0) {
+ log_error("dm_snprintf failed");
+ goto out_abandon;
+ }
+ if (!dm_pool_grow_object(mem, buf, strlen(buf))) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+ if (i + 1 < deps->count && !dm_pool_grow_object(mem, ",", 1)) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+ }
+
+ if (!dm_pool_grow_object(mem, "\0", 1)) {
+ log_error("dm_pool_grow_object failed");
+ goto out_abandon;
+ }
+
+ repstr = dm_pool_end_object(mem);
+ dm_report_field_set_value(field, repstr, repstr);
+ return 1;
+
+ out_abandon:
+ dm_pool_abandon_object(mem);
+ return 0;
+}
static void *_task_get_obj(void *obj)
{
@@ -1552,9 +1819,21 @@
return ((struct dmsetup_report_obj *)obj)->info;
}
+static void *_deps_get_obj(void *obj)
+{
+ return dm_task_get_deps(((struct dmsetup_report_obj *)obj)->deps_task);
+}
+
+static void *_tree_get_obj(void *obj)
+{
+ return ((struct dmsetup_report_obj *)obj)->tree_node;
+}
+
static const struct dm_report_object_type _report_types[] = {
{ DR_TASK, "Mapped Device Name", "", _task_get_obj },
{ DR_INFO, "Mapped Device Information", "", _info_get_obj },
+ { DR_DEPS, "Mapped Device Relationship Information", "", _deps_get_obj },
+ { DR_TREE, "Mapped Device Relationship Information", "", _tree_get_obj },
{ 0, "", "", NULL },
};
@@ -1570,11 +1849,20 @@
FIELD_F(TASK, STR, "Name", 16, dm_name, "name", "Name of mapped device.")
FIELD_F(TASK, STR, "UUID", 32, dm_uuid, "uuid", "Unique (optional) identifier for mapped device.")
FIELD_F(INFO, STR, "Stat", 4, dm_info_status, "attr", "(L)ive, (I)nactive, (s)uspended, (r)ead-only, read-(w)rite.")
+FIELD_F(INFO, STR, "DevNo", 5, dm_info_devno, "devno", "Device major and minor numbers")
FIELD_O(INFO, dm_info, NUM, "Maj", major, 3, int32, "major", "Block device major number.")
FIELD_O(INFO, dm_info, NUM, "Min", minor, 3, int32, "minor", "Block device minor number.")
FIELD_O(INFO, dm_info, NUM, "Open", open_count, 4, int32, "open", "Number of references to open device, if requested.")
FIELD_O(INFO, dm_info, NUM, "Targ", target_count, 4, int32, "segments", "Number of segments in live table, if present.")
FIELD_O(INFO, dm_info, NUM, "Event", event_nr, 6, uint32, "events", "Number of most recent event.")
+
+FIELD_O(DEPS, dm_deps, NUM, "#Devs", count, 5, int32, "device_count", "Number of devices used by this one.")
+FIELD_F(TREE, STR, "DevNames", 8, dm_deps_names, "devs_used", "List of names of mapped devices used by this one.")
+FIELD_F(DEPS, STR, "DevNos", 6, dm_deps, "devnos_used", "List of device numbers of devices used by this one.")
+
+FIELD_F(TREE, NUM, "#Refs", 5, dm_tree_parents_count, "device_ref_count", "Number of mapped devices referencing this one.")
+FIELD_F(TREE, STR, "RefNames", 8, dm_tree_parents_names, "names_using_dev", "List of names of mapped devices using this one.")
+FIELD_F(TREE, STR, "RefDevNos", 9, dm_tree_parents_devs, "devnos_using_dev", "List of device numbers of mapped devices using this one.")
{0, 0, 0, 0, "", "", NULL, NULL},
/* *INDENT-ON* */
};
@@ -1591,8 +1879,7 @@
char *options = (char *) default_report_options;
const char *keys = "";
const char *separator = " ";
- int aligned = 1, headings = 1, buffered = 0;
- uint32_t report_type = 0;
+ int aligned = 1, headings = 1, buffered = 1;
uint32_t flags = 0;
size_t len = 0;
int r = 0;
@@ -1604,6 +1891,9 @@
headings = 0;
}
+ if (_switches[UNBUFFERED_ARG])
+ buffered = 0;
+
if (_switches[OPTIONS_ARG] && _string_args[OPTIONS_ARG]) {
if (*_string_args[OPTIONS_ARG] != '+')
options = _string_args[OPTIONS_ARG];
@@ -1646,11 +1936,16 @@
if (headings)
flags |= DM_REPORT_OUTPUT_HEADINGS;
- if (!(_report = dm_report_init(&report_type,
- _report_types, _report_fields,
- options, separator, flags, keys, NULL)))
+ if (!(_report = dm_report_init(&_report_type,
+ _report_types, _report_fields,
+ options, separator, flags, keys, NULL)))
goto out;
+ if ((_report_type & DR_TREE) && !_build_whole_deptree()) {
+ err("Internal device dependency tree creation failed.");
+ goto out;
+ }
+
r = 1;
out:
@@ -1669,7 +1964,7 @@
(_switches[EXEC_ARG] && _command))
return _status(argc, argv, data);
else if ((_switches[TREE_ARG]))
- return _tree(argc, argv, data);
+ return _display_tree(argc, argv, data);
else
return _process_all(argc, argv, 0, _display_name);
}
@@ -2079,6 +2374,7 @@
{"tree", 0, &ind, TREE_ARG},
{"uid", 1, &ind, UID_ARG},
{"uuid", 1, &ind, UUID_ARG},
+ {"unbuffered", 0, &ind, UNBUFFERED_ARG},
{"verbose", 1, &ind, VERBOSE_ARG},
{"version", 0, &ind, VERSION_ARG},
{0, 0, 0, 0}
@@ -2210,6 +2506,8 @@
}
if ((ind == TREE_ARG))
_switches[TREE_ARG]++;
+ if ((ind == UNBUFFERED_ARG))
+ _switches[UNBUFFERED_ARG]++;
if ((ind == VERSION_ARG))
_switches[VERSION_ARG]++;
}
@@ -2289,5 +2587,8 @@
dm_report_free(_report);
}
+ if (_dtree)
+ dm_tree_free(_dtree);
+
return r;
}
More information about the pkg-lvm-commits
mailing list