btrfs-progs: mkfs: output device list in sorted order
authorZhao Lei <zhaolei@cn.fujitsu.com>
Tue, 3 Nov 2015 11:03:00 +0000 (19:03 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 3 Nov 2015 11:56:52 +0000 (12:56 +0100)
list_for_each_entry_reverse() in current code can not output
devices in sorted order, because the sequence are broken in
btrfs_alloc_chunk().

We can use list_sort() instead.

Before patch:
 # mkfs.btrfs -f /dev/vdd /dev/vde /dev/vdf
 ...
 Number of devices:  3
 Devices:
    ID        SIZE  PATH
     3     2.60GiB  /dev/vdf
     1     2.60GiB  /dev/vdd
     2     2.60GiB  /dev/vde

After patch:
 # mkfs.btrfs -f /dev/vdd /dev/vde /dev/vdf
 ...
 Number of devices:  3
 Devices:
    ID        SIZE  PATH
     1     2.60GiB  /dev/vdd
     2     2.60GiB  /dev/vde
     3     2.60GiB  /dev/vdf

Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
mkfs.c

diff --git a/mkfs.c b/mkfs.c
index 8691734..70883d3 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -42,6 +42,7 @@
 #include "volumes.h"
 #include "transaction.h"
 #include "utils.h"
+#include "list_sort.h"
 
 static u64 index_cnt = 2;
 static int verbose = 1;
@@ -1146,6 +1147,13 @@ static int is_ssd(const char *file)
        return !atoi((const char *)&rotational);
 }
 
+static int _cmp_device_by_id(void *priv, struct list_head *a,
+                            struct list_head *b)
+{
+       return list_entry(a, struct btrfs_device, dev_list)->devid -
+              list_entry(b, struct btrfs_device, dev_list)->devid;
+}
+
 static void list_all_devices(struct btrfs_root *root)
 {
        struct btrfs_fs_devices *fs_devices;
@@ -1158,12 +1166,14 @@ static void list_all_devices(struct btrfs_root *root)
        list_for_each_entry(device, &fs_devices->devices, dev_list)
                number_of_devices++;
 
+       list_sort(NULL, &fs_devices->devices, _cmp_device_by_id);
+
        printf("Number of devices:  %d\n", number_of_devices);
        /* printf("Total devices size: %10s\n", */
                /* pretty_size(total_block_count)); */
        printf("Devices:\n");
        printf("   ID        SIZE  PATH\n");
-       list_for_each_entry_reverse(device, &fs_devices->devices, dev_list) {
+       list_for_each_entry(device, &fs_devices->devices, dev_list) {
                char dev_uuid[BTRFS_UUID_UNPARSED_SIZE];
 
                uuid_unparse(device->uuid, dev_uuid);