mirror of https://github.com/hak5/openwrt.git
kernel/3.10: move squashfs check from rootfs split code into a separate file
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 38109lede-17.01
parent
3b71cd94bc
commit
d89bea92b3
|
@ -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
|
||||
|
|
|
@ -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);
|
|
@ -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 */
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue