[U-Boot] [PATCH 5/9] cmd_extX: use common get_device_and_partition function

Rob Herring
2012-08-23T21:31:46Z

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