
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,