Commit 77cb51e6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'tags/upstream-4.17-rc1' of git://git.infradead.org/linux-ubifs

Pull UBI and UBIFS updates from Richard Weinberger:
 "Minor bug fixes and improvements"

* tag 'tags/upstream-4.17-rc1' of git://git.infradead.org/linux-ubifs:
  ubi: Reject MLC NAND
  ubifs: Remove useless parameter of lpt_heap_replace
  ubifs: Constify struct ubifs_lprops in scan_for_leb_for_idx
  ubifs: remove unnecessary assignment
  ubi: Fix error for write access
  ubi: fastmap: Don't flush fastmap work on detach
  ubifs: Check ubifs_wbuf_sync() return code
parents 375479c3 b5094b7f
...@@ -244,7 +244,7 @@ static int ubiblock_open(struct block_device *bdev, fmode_t mode) ...@@ -244,7 +244,7 @@ static int ubiblock_open(struct block_device *bdev, fmode_t mode)
* in any case. * in any case.
*/ */
if (mode & FMODE_WRITE) { if (mode & FMODE_WRITE) {
ret = -EPERM; ret = -EROFS;
goto out_unlock; goto out_unlock;
} }
......
...@@ -854,6 +854,17 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, ...@@ -854,6 +854,17 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
return -EINVAL; return -EINVAL;
} }
/*
* Both UBI and UBIFS have been designed for SLC NAND and NOR flashes.
* MLC NAND is different and needs special care, otherwise UBI or UBIFS
* will die soon and you will lose all your data.
*/
if (mtd->type == MTD_MLCNANDFLASH) {
pr_err("ubi: refuse attaching mtd%d - MLC NAND is not supported\n",
mtd->index);
return -EINVAL;
}
if (ubi_num == UBI_DEV_NUM_AUTO) { if (ubi_num == UBI_DEV_NUM_AUTO) {
/* Search for an empty slot in the @ubi_devices array */ /* Search for an empty slot in the @ubi_devices array */
for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++)
......
...@@ -362,7 +362,6 @@ static void ubi_fastmap_close(struct ubi_device *ubi) ...@@ -362,7 +362,6 @@ static void ubi_fastmap_close(struct ubi_device *ubi)
{ {
int i; int i;
flush_work(&ubi->fm_work);
return_unused_pool_pebs(ubi, &ubi->fm_pool); return_unused_pool_pebs(ubi, &ubi->fm_pool);
return_unused_pool_pebs(ubi, &ubi->fm_wl_pool); return_unused_pool_pebs(ubi, &ubi->fm_wl_pool);
......
...@@ -632,7 +632,7 @@ static int scan_for_idx_cb(struct ubifs_info *c, ...@@ -632,7 +632,7 @@ static int scan_for_idx_cb(struct ubifs_info *c,
*/ */
static const struct ubifs_lprops *scan_for_leb_for_idx(struct ubifs_info *c) static const struct ubifs_lprops *scan_for_leb_for_idx(struct ubifs_info *c)
{ {
struct ubifs_lprops *lprops; const struct ubifs_lprops *lprops;
struct scan_data data; struct scan_data data;
int err; int err;
......
...@@ -244,7 +244,6 @@ static void remove_from_lpt_heap(struct ubifs_info *c, ...@@ -244,7 +244,6 @@ static void remove_from_lpt_heap(struct ubifs_info *c,
/** /**
* lpt_heap_replace - replace lprops in a category heap. * lpt_heap_replace - replace lprops in a category heap.
* @c: UBIFS file-system description object * @c: UBIFS file-system description object
* @old_lprops: LEB properties to replace
* @new_lprops: LEB properties with which to replace * @new_lprops: LEB properties with which to replace
* @cat: LEB category * @cat: LEB category
* *
...@@ -254,7 +253,6 @@ static void remove_from_lpt_heap(struct ubifs_info *c, ...@@ -254,7 +253,6 @@ static void remove_from_lpt_heap(struct ubifs_info *c,
* lprops. This function does that. * lprops. This function does that.
*/ */
static void lpt_heap_replace(struct ubifs_info *c, static void lpt_heap_replace(struct ubifs_info *c,
struct ubifs_lprops *old_lprops,
struct ubifs_lprops *new_lprops, int cat) struct ubifs_lprops *new_lprops, int cat)
{ {
struct ubifs_lpt_heap *heap; struct ubifs_lpt_heap *heap;
...@@ -362,7 +360,7 @@ void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops, ...@@ -362,7 +360,7 @@ void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops,
case LPROPS_DIRTY: case LPROPS_DIRTY:
case LPROPS_DIRTY_IDX: case LPROPS_DIRTY_IDX:
case LPROPS_FREE: case LPROPS_FREE:
lpt_heap_replace(c, old_lprops, new_lprops, cat); lpt_heap_replace(c, new_lprops, cat);
break; break;
case LPROPS_UNCAT: case LPROPS_UNCAT:
case LPROPS_EMPTY: case LPROPS_EMPTY:
......
...@@ -175,7 +175,6 @@ struct ubifs_scan_leb *ubifs_start_scan(const struct ubifs_info *c, int lnum, ...@@ -175,7 +175,6 @@ struct ubifs_scan_leb *ubifs_start_scan(const struct ubifs_info *c, int lnum,
void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb, void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
int lnum, int offs) int lnum, int offs)
{ {
lnum = lnum;
dbg_scan("stop scanning LEB %d at offset %d", lnum, offs); dbg_scan("stop scanning LEB %d at offset %d", lnum, offs);
ubifs_assert(offs % c->min_io_size == 0); ubifs_assert(offs % c->min_io_size == 0);
......
...@@ -1737,8 +1737,11 @@ static void ubifs_remount_ro(struct ubifs_info *c) ...@@ -1737,8 +1737,11 @@ static void ubifs_remount_ro(struct ubifs_info *c)
dbg_save_space_info(c); dbg_save_space_info(c);
for (i = 0; i < c->jhead_cnt; i++) for (i = 0; i < c->jhead_cnt; i++) {
ubifs_wbuf_sync(&c->jheads[i].wbuf); err = ubifs_wbuf_sync(&c->jheads[i].wbuf);
if (err)
ubifs_ro_mode(c, err);
}
c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_DIRTY); c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_DIRTY);
c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS); c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS);
...@@ -1804,8 +1807,11 @@ static void ubifs_put_super(struct super_block *sb) ...@@ -1804,8 +1807,11 @@ static void ubifs_put_super(struct super_block *sb)
int err; int err;
/* Synchronize write-buffers */ /* Synchronize write-buffers */
for (i = 0; i < c->jhead_cnt; i++) for (i = 0; i < c->jhead_cnt; i++) {
ubifs_wbuf_sync(&c->jheads[i].wbuf); err = ubifs_wbuf_sync(&c->jheads[i].wbuf);
if (err)
ubifs_ro_mode(c, err);
}
/* /*
* We are being cleanly unmounted which means the * We are being cleanly unmounted which means the
......
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