]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Detail: deterministic ordering in --brief --verbose
authormwilck@arcor.de <mwilck@arcor.de>
Thu, 20 Jun 2013 20:21:05 +0000 (22:21 +0200)
committerNeilBrown <neilb@suse.de>
Mon, 24 Jun 2013 06:56:47 +0000 (16:56 +1000)
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>
Detail.c

index 802e69e5dbde103f1ca18978d6a8847f47dc6130..05e645c1adfed5462b9d567ee5496af46fed8597 100644 (file)
--- a/Detail.c
+++ b/Detail.c
 #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;
 }