From: Rob Herring <robherring2@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 5/9] cmd_extX: use common get_device_and_partition function
Date: Thu, 23 Aug 2012 16:31:46 -0500 [thread overview]
Message-ID: <1345757510-6756-6-git-send-email-robherring2@gmail.com> (raw)
In-Reply-To: <1345757510-6756-1-git-send-email-robherring2@gmail.com>
From: Rob Herring <rob.herring@calxeda.com>
Convert ext2/4 load, ls, and write functions to use common device and
partition parsing function. With the common function "dev:part" can come
from the environment and a '-' can be used in that case.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
common/cmd_ext4.c | 102 ++++-------------------------------------------
common/cmd_ext_common.c | 95 +++++++++++--------------------------------
fs/ext4/dev.c | 32 ++++++---------
fs/ext4/ext4_common.h | 1 -
fs/ext4/ext4fs.c | 1 -
include/ext4fs.h | 3 +-
include/ext_common.h | 2 +
7 files changed, 46 insertions(+), 190 deletions(-)
diff --git a/common/cmd_ext4.c b/common/cmd_ext4.c
index e92c02f..48f9ba3 100644
--- a/common/cmd_ext4.c
+++ b/common/cmd_ext4.c
@@ -56,21 +56,6 @@
#include <usb.h>
#endif
-#if !defined(CONFIG_DOS_PARTITION) && !defined(CONFIG_EFI_PARTITION)
-#error DOS or EFI partition support must be selected
-#endif
-
-uint64_t total_sector;
-uint64_t part_offset;
-#if defined(CONFIG_CMD_EXT4_WRITE)
-static uint64_t part_size;
-static uint16_t cur_part = 1;
-#endif
-
-#define DOS_PART_MAGIC_OFFSET 0x1fe
-#define DOS_FS_TYPE_OFFSET 0x36
-#define DOS_FS32_TYPE_OFFSET 0x52
-
int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc,
char *const argv[])
{
@@ -89,77 +74,24 @@ int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
}
#if defined(CONFIG_CMD_EXT4_WRITE)
-static int ext4_register_device(block_dev_desc_t *dev_desc, int part_no)
-{
- unsigned char buffer[SECTOR_SIZE];
- disk_partition_t info;
-
- if (!dev_desc->block_read)
- return -1;
-
- /* check if we have a MBR (on floppies we have only a PBR) */
- if (dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1) {
- printf("** Can't read from device %d **\n", dev_desc->dev);
- return -1;
- }
- if (buffer[DOS_PART_MAGIC_OFFSET] != 0x55 ||
- buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) {
- /* no signature found */
- return -1;
- }
-
- /* First we assume there is a MBR */
- if (!get_partition_info(dev_desc, part_no, &info)) {
- part_offset = info.start;
- cur_part = part_no;
- part_size = info.size;
- } else if ((strncmp((char *)&buffer[DOS_FS_TYPE_OFFSET],
- "FAT", 3) == 0) || (strncmp((char *)&buffer
- [DOS_FS32_TYPE_OFFSET],
- "FAT32", 5) == 0)) {
- /* ok, we assume we are on a PBR only */
- cur_part = 1;
- part_offset = 0;
- } else {
- printf("** Partition %d not valid on device %d **\n",
- part_no, dev_desc->dev);
- return -1;
- }
-
- return 0;
-}
-
int do_ext4_write(cmd_tbl_t *cmdtp, int flag, int argc,
char *const argv[])
{
const char *filename = "/";
- int part_length;
- unsigned long part = 1;
- int dev;
- char *ep;
+ int dev, part;
unsigned long ram_address;
unsigned long file_size;
disk_partition_t info;
- struct ext_filesystem *fs;
+ block_dev_desc_t *dev_desc;
if (argc < 6)
return cmd_usage(cmdtp);
- dev = (int)simple_strtoul(argv[2], &ep, 16);
- ext4_dev_desc = get_dev(argv[1], dev);
- if (ext4_dev_desc == NULL) {
- printf("Block device %s %d not supported\n", argv[1], dev);
+ part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info);
+ if (part < 0)
return 1;
- }
- fs = get_fs();
- if (*ep) {
- if (*ep != ':') {
- puts("Invalid boot device, use `dev[:part]'\n");
- goto fail;
- }
- part = simple_strtoul(++ep, NULL, 16);
- }
+ dev = dev_desc->dev;
/* get the filename */
filename = argv[3];
@@ -171,30 +103,10 @@ int do_ext4_write(cmd_tbl_t *cmdtp, int flag, int argc,
file_size = simple_strtoul(argv[5], NULL, 10);
/* set the device as block device */
- part_length = ext4fs_set_blk_dev(ext4_dev_desc, part);
- if (part_length == 0) {
- printf("Bad partition - %s %d:%lu\n", argv[1], dev, part);
- goto fail;
- }
-
- /* register the device and partition */
- if (ext4_register_device(ext4_dev_desc, part) != 0) {
- printf("Unable to use %s %d:%lu for fattable\n",
- argv[1], dev, part);
- goto fail;
- }
-
- /* get the partition information */
- if (!get_partition_info(ext4_dev_desc, part, &info)) {
- total_sector = (info.size * info.blksz) / SECTOR_SIZE;
- fs->total_sect = total_sector;
- } else {
- printf("error : get partition info\n");
- goto fail;
- }
+ ext4fs_set_blk_dev(dev_desc, &info);
/* mount the filesystem */
- if (!ext4fs_mount(part_length)) {
+ if (!ext4fs_mount(info.size)) {
printf("Bad ext4 partition %s %d:%lu\n", argv[1], dev, part);
goto fail;
}
diff --git a/common/cmd_ext_common.c b/common/cmd_ext_common.c
index 8972ccc..7d26944 100644
--- a/common/cmd_ext_common.c
+++ b/common/cmd_ext_common.c
@@ -68,13 +68,11 @@ int do_ext_load(cmd_tbl_t *cmdtp, int flag, int argc,
char *const argv[])
{
char *filename = NULL;
- char *ep;
- int dev;
- unsigned long part = 1;
+ int dev, part;
ulong addr = 0;
- ulong part_length;
int filelen;
disk_partition_t info;
+ block_dev_desc_t *dev_desc;
char buf[12];
unsigned long count;
const char *addr_str;
@@ -110,50 +108,19 @@ int do_ext_load(cmd_tbl_t *cmdtp, int flag, int argc,
return 1;
}
- dev = (int)simple_strtoul(argv[2], &ep, 16);
- ext4_dev_desc = get_dev(argv[1], dev);
- if (ext4_dev_desc == NULL) {
- printf("** Block device %s %d not supported\n", argv[1], dev);
+ part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info);
+ if (part < 0)
return 1;
- }
- if (*ep) {
- if (*ep != ':') {
- puts("** Invalid boot device, use `dev[:part]' **\n");
- goto fail;
- }
- part = simple_strtoul(++ep, NULL, 16);
- }
+ dev = dev_desc->dev;
+ printf("Loading file \"%s\" from %s device %d%c%c\n",
+ filename, argv[1], dev,
+ part ? ':' : ' ', part ? part + '0' : ' ');
- if (part != 0) {
- if (get_partition_info(ext4_dev_desc, part, &info)) {
- printf("** Bad partition %lu **\n", part);
- goto fail;
- }
-
- if (strncmp((char *)info.type, BOOT_PART_TYPE,
- strlen(BOOT_PART_TYPE)) != 0) {
- printf("** Invalid partition type \"%s\""
- " (expect \"" BOOT_PART_TYPE "\")\n", info.type);
- goto fail;
- }
- printf("Loading file \"%s\" "
- "from %s device %d:%lu %s\n",
- filename, argv[1], dev, part, info.name);
- } else {
- printf("Loading file \"%s\" from %s device %d\n",
- filename, argv[1], dev);
- }
+ ext4fs_set_blk_dev(dev_desc, &info);
- part_length = ext4fs_set_blk_dev(ext4_dev_desc, part);
- if (part_length == 0) {
- printf("**Bad partition - %s %d:%lu **\n", argv[1], dev, part);
- ext4fs_close();
- goto fail;
- }
-
- if (!ext4fs_mount(part_length)) {
- printf("** Bad ext2 partition or disk - %s %d:%lu **\n",
+ if (!ext4fs_mount(info.size)) {
+ printf("** Bad ext2 partition or disk - %s %d:%d **\n",
argv[1], dev, part);
ext4fs_close();
goto fail;
@@ -169,7 +136,7 @@ int do_ext_load(cmd_tbl_t *cmdtp, int flag, int argc,
filelen = count;
if (ext4fs_read((char *)addr, filelen) != filelen) {
- printf("** Unable to read \"%s\" from %s %d:%lu **\n",
+ printf("** Unable to read \"%s\" from %s %d:%d **\n",
filename, argv[1], dev, part);
ext4fs_close();
goto fail;
@@ -192,41 +159,25 @@ int do_ext_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
const char *filename = "/";
int dev;
- unsigned long part = 1;
- char *ep;
- int part_length;
- if (argc < 3)
- return cmd_usage(cmdtp);
-
- dev = (int)simple_strtoul(argv[2], &ep, 16);
+ int part;
+ block_dev_desc_t *dev_desc;
+ disk_partition_t info;
- ext4_dev_desc = get_dev(argv[1], dev);
+ if (argc < 2)
+ return cmd_usage(cmdtp);
- if (ext4_dev_desc == NULL) {
- printf("\n** Block device %s %d not supported\n", argv[1], dev);
+ part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info);
+ if (part < 0)
return 1;
- }
-
- if (*ep) {
- if (*ep != ':') {
- puts("\n** Invalid boot device, use `dev[:part]' **\n");
- goto fail;
- }
- part = simple_strtoul(++ep, NULL, 16);
- }
if (argc == 4)
filename = argv[3];
- part_length = ext4fs_set_blk_dev(ext4_dev_desc, part);
- if (part_length == 0) {
- printf("** Bad partition - %s %d:%lu **\n", argv[1], dev, part);
- ext4fs_close();
- goto fail;
- }
+ dev = dev_desc->dev;
+ ext4fs_set_blk_dev(dev_desc, &info);
- if (!ext4fs_mount(part_length)) {
- printf("** Bad ext2 partition or disk - %s %d:%lu **\n",
+ if (!ext4fs_mount(info.size)) {
+ printf("** Bad ext2 partition or disk - %s %d:%d **\n",
argv[1], dev, part);
ext4fs_close();
goto fail;
diff --git a/fs/ext4/dev.c b/fs/ext4/dev.c
index fb62f24..5a3fbef 100644
--- a/fs/ext4/dev.c
+++ b/fs/ext4/dev.c
@@ -38,26 +38,20 @@
#include <common.h>
#include <config.h>
+#include <ext4fs.h>
#include <ext_common.h>
+unsigned long part_offset;
+
static block_dev_desc_t *ext4fs_block_dev_desc;
-static disk_partition_t part_info;
+static disk_partition_t *part_info;
-int ext4fs_set_blk_dev(block_dev_desc_t *rbdd, int part)
+void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)
{
ext4fs_block_dev_desc = rbdd;
-
- if (part == 0) {
- /* disk doesn't use partition table */
- part_info.start = 0;
- part_info.size = rbdd->lba;
- part_info.blksz = rbdd->blksz;
- } else {
- if (get_partition_info(ext4fs_block_dev_desc,
- part, &part_info))
- return 0;
- }
- return part_info.size;
+ part_info = info;
+ part_offset = info->start;
+ get_fs()->total_sect = (info->size * info->blksz) / SECTOR_SIZE;
}
int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
@@ -68,7 +62,7 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
/* Check partition boundaries */
if ((sector < 0)
|| ((sector + ((byte_offset + byte_len - 1) >> SECTOR_BITS)) >=
- part_info.size)) {
+ part_info->size)) {
printf("%s read outside partition %d\n", __func__, sector);
return 0;
}
@@ -88,7 +82,7 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
/* read first part which isn't aligned with start of sector */
if (ext4fs_block_dev_desc->
block_read(ext4fs_block_dev_desc->dev,
- part_info.start + sector, 1,
+ part_info->start + sector, 1,
(unsigned long *) sec_buf) != 1) {
printf(" ** ext2fs_devread() read error **\n");
return 0;
@@ -111,14 +105,14 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
block_len = SECTOR_SIZE;
ext4fs_block_dev_desc->block_read(ext4fs_block_dev_desc->dev,
- part_info.start + sector,
+ part_info->start + sector,
1, (unsigned long *)p);
memcpy(buf, p, byte_len);
return 1;
}
if (ext4fs_block_dev_desc->block_read(ext4fs_block_dev_desc->dev,
- part_info.start + sector,
+ part_info->start + sector,
block_len / SECTOR_SIZE,
(unsigned long *) buf) !=
block_len / SECTOR_SIZE) {
@@ -134,7 +128,7 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
/* read rest of data which are not in whole sector */
if (ext4fs_block_dev_desc->
block_read(ext4fs_block_dev_desc->dev,
- part_info.start + sector, 1,
+ part_info->start + sector, 1,
(unsigned long *) sec_buf) != 1) {
printf("* %s read error - last part\n", __func__);
return 0;
diff --git a/fs/ext4/ext4_common.h b/fs/ext4/ext4_common.h
index 801b8b8..7489397 100644
--- a/fs/ext4/ext4_common.h
+++ b/fs/ext4/ext4_common.h
@@ -57,7 +57,6 @@
#define zalloc(size) calloc(1, size)
-extern unsigned long part_offset;
int ext4fs_read_inode(struct ext2_data *data, int ino,
struct ext2_inode *inode);
int ext4fs_read_file(struct ext2fs_node *node, int pos,
diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
index c366e6f..93dcb7e 100644
--- a/fs/ext4/ext4fs.c
+++ b/fs/ext4/ext4fs.c
@@ -43,7 +43,6 @@
#include "ext4_common.h"
int ext4fs_symlinknest;
-block_dev_desc_t *ext4_dev_desc;
struct ext_filesystem ext_fs;
struct ext_filesystem *get_fs(void)
diff --git a/include/ext4fs.h b/include/ext4fs.h
index 6ad008c..b6eedde 100644
--- a/include/ext4fs.h
+++ b/include/ext4fs.h
@@ -113,7 +113,6 @@ struct ext_filesystem {
block_dev_desc_t *dev_desc;
};
-extern block_dev_desc_t *ext4_dev_desc;
extern struct ext2_data *ext4fs_root;
extern struct ext2fs_node *ext4fs_file;
@@ -137,6 +136,6 @@ void ext4fs_close(void);
int ext4fs_ls(const char *dirname);
void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot);
int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf);
-int ext4fs_set_blk_dev(block_dev_desc_t *rbdd, int part);
+void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
long int read_allocated_block(struct ext2_inode *inode, int fileblock);
#endif
diff --git a/include/ext_common.h b/include/ext_common.h
index 9b97522..ce73857 100644
--- a/include/ext_common.h
+++ b/include/ext_common.h
@@ -186,6 +186,8 @@ struct ext2_data {
struct ext2fs_node diropen;
};
+extern unsigned long part_offset;
+
int do_ext2ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ext2load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc,
--
1.7.9.5
next prev parent reply other threads:[~2012-08-23 21:31 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-23 21:31 [U-Boot] [PATCH 0/9] Auto partition selection and fs partition consolidation Rob Herring
2012-08-23 21:31 ` [U-Boot] [PATCH 1/9] combine block device load commands into common function Rob Herring
2012-09-05 23:36 ` Tom Rini
2012-09-05 23:47 ` Rob Herring
2012-09-05 23:50 ` Tom Rini
2012-09-21 14:02 ` [U-Boot] [PATCH v2 " Rob Herring
2012-09-25 23:17 ` Tom Rini
2012-08-23 21:31 ` [U-Boot] [PATCH 2/9] disk/part: check bootable flag for DOS partitions Rob Herring
2012-08-23 21:31 ` [U-Boot] [PATCH 3/9] disk/part: introduce get_device_and_partition Rob Herring
2012-08-23 22:36 ` Stephen Warren
2012-08-24 1:57 ` Rob Herring
2012-08-24 2:51 ` Stephen Warren
2012-09-05 23:53 ` Tom Rini
2012-09-21 14:08 ` [U-Boot] [PATCH v2 " Rob Herring
2012-08-23 21:31 ` [U-Boot] [PATCH 4/9] ext4: remove init_fs/deinit_fs Rob Herring
2012-08-23 21:31 ` Rob Herring [this message]
2012-08-23 21:31 ` [U-Boot] [PATCH 6/9] cmd_fat: use common get_device_and_partition function Rob Herring
2012-08-23 21:31 ` [U-Boot] [PATCH 7/9] cmd_disk: " Rob Herring
2012-08-23 21:31 ` [U-Boot] [PATCH 8/9] cmd_zfs: " Rob Herring
2012-08-23 21:31 ` [U-Boot] [PATCH 9/9] cmd_reiser: " Rob Herring
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1345757510-6756-6-git-send-email-robherring2@gmail.com \
--to=robherring2@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.