btrfs-progs: mkfs: output device list in sorted order

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>
master
Zhao Lei 2015-11-03 19:03:00 +08:00 committed by David Sterba
parent c5cb2432bf
commit 568a3743f5
1 changed files with 11 additions and 1 deletions

12
mkfs.c
View File

@ -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);