kernel/3.10: move squashfs check from rootfs split code into a separate file
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 38109
This commit is contained in:
parent
3b71cd94bc
commit
d89bea92b3
5 changed files with 192 additions and 0 deletions
|
@ -1932,6 +1932,7 @@ CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
|
||||||
CONFIG_MTD_ROOTFS_ROOT_DEV=y
|
CONFIG_MTD_ROOTFS_ROOT_DEV=y
|
||||||
CONFIG_MTD_ROOTFS_SPLIT=y
|
CONFIG_MTD_ROOTFS_SPLIT=y
|
||||||
# CONFIG_MTD_SLRAM is not set
|
# CONFIG_MTD_SLRAM is not set
|
||||||
|
CONFIG_MTD_SPLIT=y
|
||||||
# CONFIG_MTD_SPLIT_FIRMWARE is not set
|
# CONFIG_MTD_SPLIT_FIRMWARE is not set
|
||||||
CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware"
|
CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware"
|
||||||
# CONFIG_MTD_SST25L is not set
|
# CONFIG_MTD_SST25L is not set
|
||||||
|
|
66
target/linux/generic/files/drivers/mtd/mtdsplit.c
Normal file
66
target/linux/generic/files/drivers/mtd/mtdsplit.c
Normal file
|
@ -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);
|
31
target/linux/generic/files/drivers/mtd/mtdsplit.h
Normal file
31
target/linux/generic/files/drivers/mtd/mtdsplit.h
Normal file
|
@ -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 a new issue