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
owl
Gabor Juhos 2013-09-21 17:55:44 +00:00
parent 3b71cd94bc
commit d89bea92b3
5 changed files with 192 additions and 0 deletions

View 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

View 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);

View 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 */

View File

@ -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

View File

@ -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