mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
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. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJP0jAHAAoJECmIfjd9wqK0qN8P/1JRuky3xsX8o5S5tqVLKkzO 4naM8bH1AuUemg8f+K+2IUyHp1Mp0lsBj7zA46+3xWXvRcZBJaWgqZFkLOuWSZn0 ChRGKKhdwRkXokq7JHgUJCrdTLyXsBV+uuBbJ+oTPQa2+7f1mxgZuLc+MJzpoKAs sNdE3A2pH3hhXDJKuT6hrM2wqD/2rW5bGurW4sYBxVUJEZ793HeXu30lTffZuWHo ClzDtC0iWIS5NmdN0sbQL6Os3p+uiR5mjJek0eABTHAmgXvfBUWpf9ewTXYS2ulK zY8brtIy2N8qmXFa8ZyguZKpCdulDqRLPz/2bmX5rOJSsyogoNxHI+UlZFCfq0u/ txA+Wm4dQZtvSM3Stws6gxuIDCX83wOgHq/gUitMsVkxo+McwevjXpZb4Ha80OVl Iw7ERGrbxZn+B+lTh+9jgD6kstqpefO7fBP5gkLRvHToxDKY+6sdH6b3UuE6pDJI SA2D1uDyk33A/dyvYZThcvsq7KMdF0mhfLuxkScSfP17hc0hnh/FSzkj3fHrADfy oA4Oo/jKFbOFnmByNHjzvOaqeYHVsKwzq+feDcZ7sYA5GNrVMVViLZQljQBdJWo5 E9howusrb81AGvjCIFobntBLE8DZF5OGfgt/n+60+jo3/qern/4jeuWfGL/Q9Wcw x27oVmOBLjuHuG3hXlGt =X7QS -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
e72643088f
@ -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,7 +284,8 @@ int ubi_debugfs_init(void)
|
||||
*/
|
||||
void ubi_debugfs_exit(void)
|
||||
{
|
||||
debugfs_remove(dfs_rootdir);
|
||||
if (IS_ENABLED(DEBUG_FS))
|
||||
debugfs_remove(dfs_rootdir);
|
||||
}
|
||||
|
||||
/* Read an UBI debugfs file */
|
||||
@ -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)
|
||||
{
|
||||
debugfs_remove_recursive(ubi->dbg->dfs_dir);
|
||||
if (IS_ENABLED(DEBUG_FS))
|
||||
debugfs_remove_recursive(ubi->dbg->dfs_dir);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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,7 +3013,8 @@ out:
|
||||
*/
|
||||
void dbg_debugfs_exit_fs(struct ubifs_info *c)
|
||||
{
|
||||
debugfs_remove_recursive(c->dbg->dfs_dir);
|
||||
if (IS_ENABLED(DEBUG_FS))
|
||||
debugfs_remove_recursive(c->dbg->dfs_dir);
|
||||
}
|
||||
|
||||
struct ubifs_global_debug_info ubifs_dbg;
|
||||
@ -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,7 +3166,8 @@ out:
|
||||
*/
|
||||
void dbg_debugfs_exit(void)
|
||||
{
|
||||
debugfs_remove_recursive(dfs_rootdir);
|
||||
if (IS_ENABLED(DEBUG_FS))
|
||||
debugfs_remove_recursive(dfs_rootdir);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user