Commit e7264308 authored by Linus Torvalds's avatar Linus Torvalds

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
...@@ -264,6 +264,9 @@ static struct dentry *dfs_rootdir; ...@@ -264,6 +264,9 @@ static struct dentry *dfs_rootdir;
*/ */
int ubi_debugfs_init(void) int ubi_debugfs_init(void)
{ {
if (!IS_ENABLED(DEBUG_FS))
return 0;
dfs_rootdir = debugfs_create_dir("ubi", NULL); dfs_rootdir = debugfs_create_dir("ubi", NULL);
if (IS_ERR_OR_NULL(dfs_rootdir)) { if (IS_ERR_OR_NULL(dfs_rootdir)) {
int err = dfs_rootdir ? -ENODEV : PTR_ERR(dfs_rootdir); int err = dfs_rootdir ? -ENODEV : PTR_ERR(dfs_rootdir);
...@@ -281,7 +284,8 @@ int ubi_debugfs_init(void) ...@@ -281,7 +284,8 @@ int ubi_debugfs_init(void)
*/ */
void ubi_debugfs_exit(void) void ubi_debugfs_exit(void)
{ {
debugfs_remove(dfs_rootdir); if (IS_ENABLED(DEBUG_FS))
debugfs_remove(dfs_rootdir);
} }
/* Read an UBI debugfs file */ /* Read an UBI debugfs file */
...@@ -403,6 +407,9 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi) ...@@ -403,6 +407,9 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi)
struct dentry *dent; struct dentry *dent;
struct ubi_debug_info *d = ubi->dbg; 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, n = snprintf(d->dfs_dir_name, UBI_DFS_DIR_LEN + 1, UBI_DFS_DIR_NAME,
ubi->ubi_num); ubi->ubi_num);
if (n == UBI_DFS_DIR_LEN) { if (n == UBI_DFS_DIR_LEN) {
...@@ -470,5 +477,6 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi) ...@@ -470,5 +477,6 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi)
*/ */
void ubi_debugfs_exit_dev(struct ubi_device *ubi) 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) ...@@ -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)", dbg_wl("flush pending work for LEB %d:%d (%d pending works)",
vol_id, lnum, ubi->works_count); vol_id, lnum, ubi->works_count);
down_write(&ubi->work_sem);
while (found) { while (found) {
struct ubi_work *wrk; struct ubi_work *wrk;
found = 0; found = 0;
down_read(&ubi->work_sem);
spin_lock(&ubi->wl_lock); spin_lock(&ubi->wl_lock);
list_for_each_entry(wrk, &ubi->works, list) { list_for_each_entry(wrk, &ubi->works, list) {
if ((vol_id == UBI_ALL || wrk->vol_id == vol_id) && 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) ...@@ -1277,18 +1277,27 @@ int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum)
spin_unlock(&ubi->wl_lock); spin_unlock(&ubi->wl_lock);
err = wrk->func(ubi, wrk, 0); err = wrk->func(ubi, wrk, 0);
if (err) if (err) {
goto out; up_read(&ubi->work_sem);
return err;
}
spin_lock(&ubi->wl_lock); spin_lock(&ubi->wl_lock);
found = 1; found = 1;
break; break;
} }
} }
spin_unlock(&ubi->wl_lock); 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); up_write(&ubi->work_sem);
return err; return err;
} }
......
...@@ -2918,6 +2918,9 @@ int dbg_debugfs_init_fs(struct ubifs_info *c) ...@@ -2918,6 +2918,9 @@ int dbg_debugfs_init_fs(struct ubifs_info *c)
struct dentry *dent; struct dentry *dent;
struct ubifs_debug_info *d = c->dbg; 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, n = snprintf(d->dfs_dir_name, UBIFS_DFS_DIR_LEN + 1, UBIFS_DFS_DIR_NAME,
c->vi.ubi_num, c->vi.vol_id); c->vi.ubi_num, c->vi.vol_id);
if (n == UBIFS_DFS_DIR_LEN) { if (n == UBIFS_DFS_DIR_LEN) {
...@@ -3010,7 +3013,8 @@ int dbg_debugfs_init_fs(struct ubifs_info *c) ...@@ -3010,7 +3013,8 @@ int dbg_debugfs_init_fs(struct ubifs_info *c)
*/ */
void dbg_debugfs_exit_fs(struct ubifs_info *c) 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; struct ubifs_global_debug_info ubifs_dbg;
...@@ -3095,6 +3099,9 @@ int dbg_debugfs_init(void) ...@@ -3095,6 +3099,9 @@ int dbg_debugfs_init(void)
const char *fname; const char *fname;
struct dentry *dent; struct dentry *dent;
if (!IS_ENABLED(DEBUG_FS))
return 0;
fname = "ubifs"; fname = "ubifs";
dent = debugfs_create_dir(fname, NULL); dent = debugfs_create_dir(fname, NULL);
if (IS_ERR_OR_NULL(dent)) if (IS_ERR_OR_NULL(dent))
...@@ -3159,7 +3166,8 @@ int dbg_debugfs_init(void) ...@@ -3159,7 +3166,8 @@ int dbg_debugfs_init(void)
*/ */
void dbg_debugfs_exit(void) void dbg_debugfs_exit(void)
{ {
debugfs_remove_recursive(dfs_rootdir); if (IS_ENABLED(DEBUG_FS))
debugfs_remove_recursive(dfs_rootdir);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment