Unverified Commit 6a6cc2b6 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!15050 brd: fix AA deadlock for concurrent brd_probe()

parents e7e24815 f6920411
Loading
Loading
Loading
Loading
+5 −18
Original line number Diff line number Diff line
@@ -418,15 +418,13 @@ static void brd_free(struct brd_device *brd)
	kfree(brd);
}

static struct brd_device *brd_init_one(int i, bool *new)
static void brd_init_one(int i)
{
	struct brd_device *brd;

	*new = false;
	list_for_each_entry(brd, &brd_devices, brd_list) {
	list_for_each_entry(brd, &brd_devices, brd_list)
		if (brd->brd_number == i)
			goto out;
	}
			return;

	brd = brd_alloc(i);
	if (brd) {
@@ -434,9 +432,6 @@ static struct brd_device *brd_init_one(int i, bool *new)
		add_disk(brd->brd_disk);
		list_add_tail(&brd->brd_list, &brd_devices);
	}
	*new = true;
out:
	return brd;
}

static void brd_del_one(struct brd_device *brd)
@@ -448,19 +443,11 @@ static void brd_del_one(struct brd_device *brd)

static struct kobject *brd_probe(dev_t dev, int *part, void *data)
{
	struct brd_device *brd;
	struct kobject *kobj;
	bool new;

	mutex_lock(&brd_devices_mutex);
	brd = brd_init_one(MINOR(dev) / max_part, &new);
	kobj = brd ? get_disk_and_module(brd->brd_disk) : NULL;
	brd_init_one(MINOR(dev) / max_part);
	mutex_unlock(&brd_devices_mutex);

	if (new)
		*part = 0;

	return kobj;
	return NULL;
}

static inline void brd_check_and_reset_par(void)