kernel/3.10: move squashfs check from rootfs split code into a separate file
authorGabor Juhos <juhosg@openwrt.org>
Sat, 21 Sep 2013 17:55:44 +0000 (17:55 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Sat, 21 Sep 2013 17:55:44 +0000 (17:55 +0000)
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 38109

target/linux/generic/config-3.10
target/linux/generic/files/drivers/mtd/mtdsplit.c [new file with mode: 0644]
target/linux/generic/files/drivers/mtd/mtdsplit.h [new file with mode: 0644]
target/linux/generic/patches-3.10/403-mtd-hook-mtdsplit-to-Kbuild.patch [new file with mode: 0644]
target/linux/generic/patches-3.10/404-mtd-use-mtd_get_squashfs_len-in-split_squasfh.patch [new file with mode: 0644]

index 46ac8c02854eebc8302b93c922610d7056edbb0f..9e1b10052a13f5dd30efc5da8b2f04ea17147ea1 100644 (file)
@@ -1932,6 +1932,7 @@ CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
 CONFIG_MTD_ROOTFS_ROOT_DEV=y
 CONFIG_MTD_ROOTFS_SPLIT=y
 # CONFIG_MTD_SLRAM is not set
+CONFIG_MTD_SPLIT=y
 # CONFIG_MTD_SPLIT_FIRMWARE is not set
 CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware"
 # CONFIG_MTD_SST25L is not set
diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit.c b/target/linux/generic/files/drivers/mtd/mtdsplit.c
new file mode 100644 (file)
index 0000000..0ba35fe
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2009-2013 Felix Fietkau <nbd@openwrt.org>
+ * Copyright (C) 2009-2013 Gabor Juhos <juhosg@openwrt.org>
+ * Copyright (C) 2012 Jonas Gorski <jogo@openwrt.org>
+ * Copyright (C) 2013 Hauke Mehrtens <hauke@hauke-m.de>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ *
+ */
+
+#define pr_fmt(fmt)    "mtdsplit: " fmt
+
+#include <linux/export.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/magic.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/byteorder/generic.h>
+
+#include "mtdsplit.h"
+
+struct squashfs_super_block {
+       __le32 s_magic;
+       __le32 pad0[9];
+       __le64 bytes_used;
+};
+
+int mtd_get_squashfs_len(struct mtd_info *master,
+                        size_t offset,
+                        size_t *squashfs_len)
+{
+       struct squashfs_super_block sb;
+       size_t retlen;
+       int err;
+
+       err = mtd_read(master, offset, sizeof(sb), &retlen, (void *)&sb);
+       if (err || (retlen != sizeof(sb))) {
+               pr_alert("error occured while reading from \"%s\"\n",
+                        master->name);
+               return -EIO;
+       }
+
+       if (le32_to_cpu(sb.s_magic) != SQUASHFS_MAGIC) {
+               pr_alert("no squashfs found in \"%s\"\n", master->name);
+               return -EINVAL;
+       }
+
+       retlen = le64_to_cpu(sb.bytes_used);
+       if (retlen <= 0) {
+               pr_alert("squashfs is empty in \"%s\"\n", master->name);
+               return -ENODEV;
+       }
+
+       if (offset + retlen > master->size) {
+               pr_alert("squashfs has invalid size in \"%s\"\n",
+                        master->name);
+               return -EINVAL;
+       }
+
+       *squashfs_len = retlen;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(mtd_get_squashfs_len);
diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit.h b/target/linux/generic/files/drivers/mtd/mtdsplit.h
new file mode 100644 (file)
index 0000000..8ba6c8b
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009-2013 Felix Fietkau <nbd@openwrt.org>
+ * Copyright (C) 2009-2013 Gabor Juhos <juhosg@openwrt.org>
+ * Copyright (C) 2012 Jonas Gorski <jogo@openwrt.org>
+ * Copyright (C) 2013 Hauke Mehrtens <hauke@hauke-m.de>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ *
+ */
+
+#ifndef _MTDSPLIT_H
+#define _MTDSPLIT_H
+
+#define ROOTFS_SPLIT_NAME      "rootfs_data"
+
+#ifdef CONFIG_MTD_SPLIT
+int mtd_get_squashfs_len(struct mtd_info *master,
+                        size_t offset,
+                        size_t *squashfs_len);
+#else
+static inline int mtd_get_squashfs_len(struct mtd_info *master,
+                                      size_t offset,
+                                      size_t *squashfs_len)
+{
+       return -ENODEV;
+}
+#endif
+
+#endif /* _MTDSPLIT_H */
diff --git a/target/linux/generic/patches-3.10/403-mtd-hook-mtdsplit-to-Kbuild.patch b/target/linux/generic/patches-3.10/403-mtd-hook-mtdsplit-to-Kbuild.patch
new file mode 100644 (file)
index 0000000..c24f34c
--- /dev/null
@@ -0,0 +1,25 @@
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -36,6 +36,11 @@ config MTD_UIMAGE_SPLIT
+       depends on MTD_SPLIT_FIRMWARE
+       default y
++config MTD_SPLIT
++      def_bool n
++      help 
++        Generic MTD split support.
++
+ endmenu
+ config MTD_TESTS
+--- a/drivers/mtd/Makefile
++++ b/drivers/mtd/Makefile
+@@ -6,6 +6,8 @@
+ obj-$(CONFIG_MTD)             += mtd.o
+ mtd-y                         := mtdcore.o mtdsuper.o mtdconcat.o mtdpart.o mtdchar.o
++mtd-$(CONFIG_MTD_SPLIT)               += mtdsplit.o
++
+ obj-$(CONFIG_MTD_OF_PARTS)    += ofpart.o
+ obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
+ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
diff --git a/target/linux/generic/patches-3.10/404-mtd-use-mtd_get_squashfs_len-in-split_squasfh.patch b/target/linux/generic/patches-3.10/404-mtd-use-mtd_get_squashfs_len-in-split_squasfh.patch
new file mode 100644 (file)
index 0000000..43960b3
--- /dev/null
@@ -0,0 +1,69 @@
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -34,6 +34,7 @@
+ #include <linux/err.h>
+ #include "mtdcore.h"
++#include "mtdsplit.h"
+ /* Our partition linked list */
+ static LIST_HEAD(mtd_partitions);
+@@ -669,43 +670,16 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+       return len;
+ }
+-#define ROOTFS_SPLIT_NAME "rootfs_data"
+-
+-struct squashfs_super_block {
+-      __le32 s_magic;
+-      __le32 pad0[9];
+-      __le64 bytes_used;
+-};
+-
+-
+ static int split_squashfs(struct mtd_info *master, int offset, int *split_offset)
+ {
+-      struct squashfs_super_block sb;
++      size_t squashfs_len;
+       int len, ret;
+-      ret = mtd_read(master, offset, sizeof(sb), &len, (void *) &sb);
+-      if (ret || (len != sizeof(sb))) {
+-              printk(KERN_ALERT "split_squashfs: error occured while reading "
+-                      "from \"%s\"\n", master->name);
+-              return -EINVAL;
+-      }
+-
+-      if (SQUASHFS_MAGIC != le32_to_cpu(sb.s_magic) ) {
+-              printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n",
+-                      master->name);
+-              *split_offset = 0;
+-              return 0;
+-      }
+-
+-      if (le64_to_cpu((sb.bytes_used)) <= 0) {
+-              printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
+-                      master->name);
+-              *split_offset = 0;
+-              return 0;
+-      }
++      ret = mtd_get_squashfs_len(master, offset, &squashfs_len);
++      if (ret)
++              return ret;
+-      len = (u32) le64_to_cpu(sb.bytes_used);
+-      len = mtd_pad_erasesize(master, offset, len);
++      len = mtd_pad_erasesize(master, offset, squashfs_len);
+       *split_offset = offset + len;
+       return 0;
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -20,6 +20,7 @@ config MTD_ROOTFS_ROOT_DEV
+ config MTD_ROOTFS_SPLIT
+       bool "Automatically split 'rootfs' partition for squashfs"
++      select MTD_SPLIT
+       default y
+ config MTD_SPLIT_FIRMWARE