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

Commit 783b273a authored by Artem Bityutskiy's avatar Artem Bityutskiy
Browse files

UBI: use separate mutex for volumes checking



Introduce a separate mutex which serializes volumes checking,
because we cammot really use volumes_mutex - it cases reverse
locking problems with mtd_tbl_mutex when gluebi is used -
thanks to lockdep.

Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
parent 897a316c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -703,6 +703,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
		goto out_free;

	mutex_init(&ubi->buf_mutex);
	mutex_init(&ubi->ckvol_mutex);
	ubi->peb_buf1 = vmalloc(ubi->peb_size);
	if (!ubi->peb_buf1)
		goto out_free;
+3 −8
Original line number Diff line number Diff line
@@ -169,17 +169,12 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
	desc->vol = vol;
	desc->mode = mode;

	/*
	 * To prevent simultaneous checks of the same volume we use
	 * @volumes_mutex, although it is not the purpose it was introduced
	 * for.
	 */
	mutex_lock(&ubi->volumes_mutex);
	mutex_lock(&ubi->ckvol_mutex);
	if (!vol->checked) {
		/* This is the first open - check the volume */
		err = ubi_check_volume(ubi, vol_id);
		if (err < 0) {
			mutex_unlock(&ubi->volumes_mutex);
			mutex_unlock(&ubi->ckvol_mutex);
			ubi_close_volume(desc);
			return ERR_PTR(err);
		}
@@ -190,7 +185,7 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
		}
		vol->checked = 1;
	}
	mutex_unlock(&ubi->volumes_mutex);
	mutex_unlock(&ubi->ckvol_mutex);

	return desc;

+1 −0
Original line number Diff line number Diff line
@@ -392,6 +392,7 @@ struct ubi_device {
	void *peb_buf1;
	void *peb_buf2;
	struct mutex buf_mutex;
	struct mutex ckvol_mutex;
#ifdef CONFIG_MTD_UBI_DEBUG
	void *dbg_peb_buf;
	struct mutex dbg_buf_mutex;