summaryrefslogtreecommitdiff
path: root/Detail.c
diff options
context:
space:
mode:
authormwilck@arcor.de <mwilck@arcor.de>2013-06-20 22:21:05 +0200
committerNeilBrown <neilb@suse.de>2013-06-24 16:56:47 +1000
commit41a663b26781f4339d4284e87c5bb179d76abd0a (patch)
treed9b87fb2777be056860a1af5a828f60521ac5abc /Detail.c
parent0ddc35beedea6f07c686c99429aaddd8b5e1182d (diff)
Detail: deterministic ordering in --brief --verbose
Have mdadm --Detail --brief --verbose print the list of devices in alphabetical order. This is useful for debugging purposes. E.g. the test script 10ddf-create compares the output of two mdadm -Dbv calls which may be different if the order is not deterministic. (I confess: I use a modified "test" script that always runs "mdadm --verbose" rather than "mdadm --quiet", otherwise this wouldn't happen in 10ddf-create). Signed-off-by: Martin Wilck <mwilck@arcor.de> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Detail.c')
-rw-r--r--Detail.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/Detail.c b/Detail.c
index 802e69e5..05e645c1 100644
--- a/Detail.c
+++ b/Detail.c
@@ -27,6 +27,11 @@
#include "md_u.h"
#include <dirent.h>
+static int cmpstringp(const void *p1, const void *p2)
+{
+ return strcmp(* (char * const *) p1, * (char * const *) p2);
+}
+
int Detail(char *dev, struct context *c)
{
/*
@@ -42,7 +47,8 @@ int Detail(char *dev, struct context *c)
int d;
time_t atime;
char *str;
- char *devices = NULL;
+ char **devices = NULL;
+ int max_devices = 0, n_devices = 0;
int spares = 0;
struct stat stb;
int is_26 = get_linux_version() >= 2006000;
@@ -655,12 +661,15 @@ This is pretty boring
dv=map_dev_preferred(disk.major, disk.minor, 0, c->prefer);
if (dv != NULL) {
if (c->brief) {
- if (devices) {
- devices = xrealloc(devices,
- strlen(devices)+1+strlen(dv)+1);
- strcat(strcat(devices,","),dv);
- } else
- devices = xstrdup(dv);
+ if (n_devices + 1 >= max_devices) {
+ max_devices += 16;
+ devices = xrealloc(devices, max_devices
+ *sizeof(*devices));
+ if (!devices)
+ goto out;
+ };
+ devices[n_devices] = xstrdup(dv);
+ n_devices++;
} else
printf(" %s", dv);
}
@@ -672,7 +681,12 @@ This is pretty boring
if (st)
st->ss->free_super(st);
- if (c->brief && c->verbose > 0 && devices) printf("\n devices=%s", devices);
+ if (c->brief && c->verbose > 0 && devices) {
+ qsort(devices, n_devices, sizeof(*devices), cmpstringp);
+ printf("\n devices=%s", devices[0]);
+ for (d = 1; d < n_devices; d++)
+ printf(",%s", devices[d]);
+ }
if (c->brief)
printf("\n");
if (c->test &&
@@ -685,6 +699,9 @@ out:
close(fd);
free(subarray);
free(avail);
+ for (d = 0; d < n_devices; d++)
+ free(devices[d]);
+ free(devices);
sysfs_free(sra);
return rv;
}