diff mbox

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

Message ID 1345757510-6756-6-git-send-email-robherring2@gmail.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Rob Herring Aug. 23, 2012, 9:31 p.m. UTC
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 mbox

Patch

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,