Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8e10cd3 authored by Anand Jain's avatar Anand Jain Committed by David Sterba
Browse files

btrfs: keep device list sorted



By maintaining the device list sorted lets us reproduce the problems
related to missing chunk in the degraded mode much more consistent. So
fix this by sorting the devices by devid within the kernel. So that we
know which device is assigned to the struct fs_info::latest_bdev when
all the devices are having and same SB generation.

Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
[ update changelog ]
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 3d5addaf
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/raid/pq.h>
#include <linux/raid/pq.h>
#include <linux/semaphore.h>
#include <linux/semaphore.h>
#include <linux/uuid.h>
#include <linux/uuid.h>
#include <linux/list_sort.h>
#include <asm/div64.h>
#include <asm/div64.h>
#include "ctree.h"
#include "ctree.h"
#include "extent_map.h"
#include "extent_map.h"
@@ -1103,6 +1104,20 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
	return ret;
	return ret;
}
}


static int devid_cmp(void *priv, struct list_head *a, struct list_head *b)
{
	struct btrfs_device *dev1, *dev2;

	dev1 = list_entry(a, struct btrfs_device, dev_list);
	dev2 = list_entry(b, struct btrfs_device, dev_list);

	if (dev1->devid < dev2->devid)
		return -1;
	else if (dev1->devid > dev2->devid)
		return 1;
	return 0;
}

int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
		       fmode_t flags, void *holder)
		       fmode_t flags, void *holder)
{
{
@@ -1113,6 +1128,7 @@ int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
		fs_devices->opened++;
		fs_devices->opened++;
		ret = 0;
		ret = 0;
	} else {
	} else {
		list_sort(NULL, &fs_devices->devices, devid_cmp);
		ret = __btrfs_open_devices(fs_devices, flags, holder);
		ret = __btrfs_open_devices(fs_devices, flags, holder);
	}
	}
	mutex_unlock(&uuid_mutex);
	mutex_unlock(&uuid_mutex);