Merge tag 'tags/upstream-4.17-rc1' of git://git.infradead.org/linux-ubifs
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 11 Apr 2018 23:39:34 +0000 (16:39 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 11 Apr 2018 23:39:34 +0000 (16:39 -0700)
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

drivers/mtd/ubi/block.c
drivers/mtd/ubi/build.c
drivers/mtd/ubi/fastmap-wl.c
fs/ubifs/find.c
fs/ubifs/lprops.c
fs/ubifs/scan.c
fs/ubifs/super.c

index b1fc28f63882e75125230d05462b775cb18732f7..d0b63bbf46a792e3d168606b6dd102b7bb0c9079 100644 (file)
@@ -244,7 +244,7 @@ static int ubiblock_open(struct block_device *bdev, fmode_t mode)
         * in any case.
         */
        if (mode & FMODE_WRITE) {
-               ret = -EPERM;
+               ret = -EROFS;
                goto out_unlock;
        }
 
index e941395de3aedc0d4fc6d641e214ec9848c72e27..753494e042d51cdbfb22b93fc16c58fa43002ec0 100644 (file)
@@ -854,6 +854,17 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
                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) {
                /* Search for an empty slot in the @ubi_devices array */
                for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++)
index 590d967011bb78704c2e21be194ece15e1e5ce06..98f7d6be8d1fcba102b9c14555536c9e63aef074 100644 (file)
@@ -362,7 +362,6 @@ static void ubi_fastmap_close(struct ubi_device *ubi)
 {
        int i;
 
-       flush_work(&ubi->fm_work);
        return_unused_pool_pebs(ubi, &ubi->fm_pool);
        return_unused_pool_pebs(ubi, &ubi->fm_wl_pool);
 
index 2dcf3d473fec1d406bf0fc2d14d73828ff81f662..9571616b5ddaf1dbee1286dcbc0870b1df11d9b8 100644 (file)
@@ -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)
 {
-       struct ubifs_lprops *lprops;
+       const struct ubifs_lprops *lprops;
        struct scan_data data;
        int err;
 
index 6c3a1abd0e22c9e033da093e4f21b4d3ad9898b2..f5a46844340c0a6e8bde656f2ea48cc513d6900d 100644 (file)
@@ -244,7 +244,6 @@ static void remove_from_lpt_heap(struct ubifs_info *c,
 /**
  * lpt_heap_replace - replace lprops in a category heap.
  * @c: UBIFS file-system description object
- * @old_lprops: LEB properties to replace
  * @new_lprops: LEB properties with which to replace
  * @cat: LEB category
  *
@@ -254,7 +253,6 @@ static void remove_from_lpt_heap(struct ubifs_info *c,
  * lprops.  This function does that.
  */
 static void lpt_heap_replace(struct ubifs_info *c,
-                            struct ubifs_lprops *old_lprops,
                             struct ubifs_lprops *new_lprops, int cat)
 {
        struct ubifs_lpt_heap *heap;
@@ -362,7 +360,7 @@ void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops,
        case LPROPS_DIRTY:
        case LPROPS_DIRTY_IDX:
        case LPROPS_FREE:
-               lpt_heap_replace(c, old_lprops, new_lprops, cat);
+               lpt_heap_replace(c, new_lprops, cat);
                break;
        case LPROPS_UNCAT:
        case LPROPS_EMPTY:
index aab87340d3de8883c12bd888056d51efe454b9c8..16f03d9929e5ed7d90366992726793db16d1177d 100644 (file)
@@ -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,
                    int lnum, int offs)
 {
-       lnum = lnum;
        dbg_scan("stop scanning LEB %d at offset %d", lnum, offs);
        ubifs_assert(offs % c->min_io_size == 0);
 
index b16ef162344ab382143578d277248c88f2fdc067..6c397a389105a68f75b6c3dbaba9d7bf3e01c5af 100644 (file)
@@ -1737,8 +1737,11 @@ static void ubifs_remount_ro(struct ubifs_info *c)
 
        dbg_save_space_info(c);
 
-       for (i = 0; i < c->jhead_cnt; i++)
-               ubifs_wbuf_sync(&c->jheads[i].wbuf);
+       for (i = 0; i < c->jhead_cnt; i++) {
+               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_NO_ORPHS);
@@ -1804,8 +1807,11 @@ static void ubifs_put_super(struct super_block *sb)
                        int err;
 
                        /* Synchronize write-buffers */
-                       for (i = 0; i < c->jhead_cnt; i++)
-                               ubifs_wbuf_sync(&c->jheads[i].wbuf);
+                       for (i = 0; i < c->jhead_cnt; i++) {
+                               err = ubifs_wbuf_sync(&c->jheads[i].wbuf);
+                               if (err)
+                                       ubifs_ro_mode(c, err);
+                       }
 
                        /*
                         * We are being cleanly unmounted which means the