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

Commit e7264308 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'upstream-3.5-rc2' of git://git.infradead.org/linux-ubifs

Pull UBI/UBIFS fixes from Artem Bityutskiy:
 "Fix UBI and UBIFS - they refuse to work without debugfs.  This was
  broken by the 3.5-rc1 UBI/UBIFS changes when we removed the debugging
  Kconfig switches.

  Also, correct locking in 'ubi_wl_flush()' - it was extended to support
  flushing a specific LEB in 3.5-rc1, and the locking was sub-optimal."

* tag 'upstream-3.5-rc2' of git://git.infradead.org/linux-ubifs:
  UBI: correct ubi_wl_flush locking
  UBIFS: fix debugfs-less systems support
  UBI: fix debugfs-less systems support
parents 32ba9c3f 12027f1b
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -264,6 +264,9 @@ static struct dentry *dfs_rootdir;
 */
int ubi_debugfs_init(void)
{
	if (!IS_ENABLED(DEBUG_FS))
		return 0;

	dfs_rootdir = debugfs_create_dir("ubi", NULL);
	if (IS_ERR_OR_NULL(dfs_rootdir)) {
		int err = dfs_rootdir ? -ENODEV : PTR_ERR(dfs_rootdir);
@@ -281,6 +284,7 @@ int ubi_debugfs_init(void)
 */
void ubi_debugfs_exit(void)
{
	if (IS_ENABLED(DEBUG_FS))
		debugfs_remove(dfs_rootdir);
}

@@ -403,6 +407,9 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi)
	struct dentry *dent;
	struct ubi_debug_info *d = ubi->dbg;

	if (!IS_ENABLED(DEBUG_FS))
		return 0;

	n = snprintf(d->dfs_dir_name, UBI_DFS_DIR_LEN + 1, UBI_DFS_DIR_NAME,
		     ubi->ubi_num);
	if (n == UBI_DFS_DIR_LEN) {
@@ -470,5 +477,6 @@ out:
 */
void ubi_debugfs_exit_dev(struct ubi_device *ubi)
{
	if (IS_ENABLED(DEBUG_FS))
		debugfs_remove_recursive(ubi->dbg->dfs_dir);
}
+13 −4
Original line number Diff line number Diff line
@@ -1262,11 +1262,11 @@ int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum)
	dbg_wl("flush pending work for LEB %d:%d (%d pending works)",
	       vol_id, lnum, ubi->works_count);

	down_write(&ubi->work_sem);
	while (found) {
		struct ubi_work *wrk;
		found = 0;

		down_read(&ubi->work_sem);
		spin_lock(&ubi->wl_lock);
		list_for_each_entry(wrk, &ubi->works, list) {
			if ((vol_id == UBI_ALL || wrk->vol_id == vol_id) &&
@@ -1277,18 +1277,27 @@ int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum)
				spin_unlock(&ubi->wl_lock);

				err = wrk->func(ubi, wrk, 0);
				if (err)
					goto out;
				if (err) {
					up_read(&ubi->work_sem);
					return err;
				}

				spin_lock(&ubi->wl_lock);
				found = 1;
				break;
			}
		}
		spin_unlock(&ubi->wl_lock);
		up_read(&ubi->work_sem);
	}

out:
	/*
	 * Make sure all the works which have been done in parallel are
	 * finished.
	 */
	down_write(&ubi->work_sem);
	up_write(&ubi->work_sem);

	return err;
}

+10 −2
Original line number Diff line number Diff line
@@ -2918,6 +2918,9 @@ int dbg_debugfs_init_fs(struct ubifs_info *c)
	struct dentry *dent;
	struct ubifs_debug_info *d = c->dbg;

	if (!IS_ENABLED(DEBUG_FS))
		return 0;

	n = snprintf(d->dfs_dir_name, UBIFS_DFS_DIR_LEN + 1, UBIFS_DFS_DIR_NAME,
		     c->vi.ubi_num, c->vi.vol_id);
	if (n == UBIFS_DFS_DIR_LEN) {
@@ -3010,6 +3013,7 @@ out:
 */
void dbg_debugfs_exit_fs(struct ubifs_info *c)
{
	if (IS_ENABLED(DEBUG_FS))
		debugfs_remove_recursive(c->dbg->dfs_dir);
}

@@ -3095,6 +3099,9 @@ int dbg_debugfs_init(void)
	const char *fname;
	struct dentry *dent;

	if (!IS_ENABLED(DEBUG_FS))
		return 0;

	fname = "ubifs";
	dent = debugfs_create_dir(fname, NULL);
	if (IS_ERR_OR_NULL(dent))
@@ -3159,6 +3166,7 @@ out:
 */
void dbg_debugfs_exit(void)
{
	if (IS_ENABLED(DEBUG_FS))
		debugfs_remove_recursive(dfs_rootdir);
}