diff options
| author | Rob Herring <rob.herring@calxeda.com> | 2012-08-23 11:31:49 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2012-09-25 14:49:17 -0700 | 
| commit | 412045704477a9b4d46b7e1fddbd53ec5dcde155 (patch) | |
| tree | 2be3c498fd374bbef140f8359d439fd18dffc3a4 | |
| parent | 475c7970c18526adb406f8bc648c44255b300225 (diff) | |
| download | olio-uboot-2014.01-412045704477a9b4d46b7e1fddbd53ec5dcde155.tar.xz olio-uboot-2014.01-412045704477a9b4d46b7e1fddbd53ec5dcde155.zip | |
cmd_zfs: use common get_device_and_partition function
Convert zfsload and zfsls 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>
| -rw-r--r-- | common/cmd_zfs.c | 88 | ||||
| -rw-r--r-- | fs/zfs/dev.c | 35 | ||||
| -rw-r--r-- | include/zfs_common.h | 5 | 
3 files changed, 31 insertions, 97 deletions
| diff --git a/common/cmd_zfs.c b/common/cmd_zfs.c index a6ea2c07c..27f88563d 100644 --- a/common/cmd_zfs.c +++ b/common/cmd_zfs.c @@ -49,12 +49,11 @@  static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  {  	char *filename = NULL; -	char *ep;  	int dev; -	unsigned long part = 1; +	int part;  	ulong addr = 0; -	ulong part_length;  	disk_partition_t info; +	block_dev_desc_t *dev_desc;  	char buf[12];  	unsigned long count;  	const char *addr_str; @@ -95,48 +94,17 @@ static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		return 1;  	} -	dev = (int)simple_strtoul(argv[2], &ep, 16); -	zfs_dev_desc = get_dev(argv[1], dev); -	if (zfs_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"); -			return 1; -		} -		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(zfs_dev_desc, part, &info)) { -			printf("** Bad partition %lu **\n", part); -			return 1; -		} - -		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); -			return 1; -		} -		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); -	} - -	part_length = zfs_set_blk_dev(zfs_dev_desc, part); -	if (part_length == 0) { -		printf("**Bad partition - %s %d:%lu **\n", argv[1], dev, part); -		return 1; -	} - -	vdev.part_length = part_length; +	zfs_set_blk_dev(dev_desc, &info); +	vdev.part_length = info.size;  	memset(&zfile, 0, sizeof(zfile));  	zfile.device = &vdev; @@ -149,7 +117,7 @@ static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		zfile.size = (uint64_t)count;  	if (zfs_read(&zfile, (char *)addr, zfile.size) != zfile.size) { -		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);  		zfs_close(&zfile);  		return 1; @@ -181,41 +149,23 @@ int zfs_print(const char *entry, const struct zfs_dirhook_info *data)  static int do_zfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  {  	const char *filename = "/"; -	int dev; -	unsigned long part = 1; -	char *ep; -	int part_length; +	int part; +	block_dev_desc_t *dev_desc; +	disk_partition_t info;  	struct device_s vdev; -	if (argc < 3) +	if (argc < 2)  		return cmd_usage(cmdtp); -	dev = (int)simple_strtoul(argv[2], &ep, 16); -	zfs_dev_desc = get_dev(argv[1], dev); - -	if (zfs_dev_desc == NULL) { -		printf("\n** Block device %s %d not supported\n", argv[1], dev); -		return 1; -	} - -	if (*ep) { -		if (*ep != ':') { -			puts("\n** Invalid boot device, use `dev[:part]' **\n"); -			return 1; -		} -		part = simple_strtoul(++ep, NULL, 16); -	} -  	if (argc == 4)  		filename = argv[3]; -	part_length = zfs_set_blk_dev(zfs_dev_desc, part); -	if (part_length == 0) { -		printf("** Bad partition - %s %d:%lu **\n", argv[1], dev, part); +	part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info); +	if (part < 0)  		return 1; -	} -	vdev.part_length = part_length; +	zfs_set_blk_dev(dev_desc, &info); +	vdev.part_length = info.size;  	zfs_ls(&vdev, filename,  		   zfs_print); diff --git a/fs/zfs/dev.c b/fs/zfs/dev.c index d68372c80..36be8f5c8 100644 --- a/fs/zfs/dev.c +++ b/fs/zfs/dev.c @@ -26,23 +26,12 @@  #include <zfs_common.h>  static block_dev_desc_t *zfs_block_dev_desc; -static disk_partition_t part_info; +static disk_partition_t *part_info; -int zfs_set_blk_dev(block_dev_desc_t *rbdd, int part) +void zfs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)  {  	zfs_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(zfs_block_dev_desc, part, &part_info)) -			return 0; -	} - -	return part_info.size; +	part_info = info;  }  /* err */ @@ -57,7 +46,7 @@ int zfs_devread(int sector, int byte_offset, int byte_len, char *buf)  	 */  	if ((sector < 0) ||  		((sector + ((byte_offset + byte_len - 1) >> SECTOR_BITS)) >= -		 part_info.size)) { +		 part_info->size)) {  		/*		errnum = ERR_OUTSIDE_PART; */  		printf(" ** zfs_devread() read outside partition sector %d\n", sector);  		return 1; @@ -79,8 +68,8 @@ int zfs_devread(int sector, int byte_offset, int byte_len, char *buf)  	if (byte_offset != 0) {  		/* read first part which isn't aligned with start of sector */  		if (zfs_block_dev_desc->block_read(zfs_block_dev_desc->dev, -										   part_info.start + sector, 1, -										   (unsigned long *) sec_buf) != 1) { +			part_info->start + sector, 1, +			(unsigned long *)sec_buf) != 1) {  			printf(" ** zfs_devread() read error **\n");  			return 1;  		} @@ -102,17 +91,15 @@ int zfs_devread(int sector, int byte_offset, int byte_len, char *buf)  		block_len = SECTOR_SIZE;  		zfs_block_dev_desc->block_read(zfs_block_dev_desc->dev, -									   part_info.start + sector, -									   1, (unsigned long *)p); +			part_info->start + sector, +			1, (unsigned long *)p);  		memcpy(buf, p, byte_len);  		return 0;  	}  	if (zfs_block_dev_desc->block_read(zfs_block_dev_desc->dev, -									   part_info.start + sector, -									   block_len / SECTOR_SIZE, -									   (unsigned long *) buf) != -		block_len / SECTOR_SIZE) { +		part_info->start + sector, block_len / SECTOR_SIZE, +		(unsigned long *) buf) != block_len / SECTOR_SIZE) {  		printf(" ** zfs_devread() read error - block\n");  		return 1;  	} @@ -126,7 +113,7 @@ int zfs_devread(int sector, int byte_offset, int byte_len, char *buf)  		/* read rest of data which are not in whole sector */  		if (zfs_block_dev_desc->  			block_read(zfs_block_dev_desc->dev, -					   part_info.start + sector, 1, +					   part_info->start + sector, 1,  					   (unsigned long *) sec_buf) != 1) {  			printf(" ** zfs_devread() read error - last part\n");  			return 1; diff --git a/include/zfs_common.h b/include/zfs_common.h index 628231efd..3bd575ef5 100644 --- a/include/zfs_common.h +++ b/include/zfs_common.h @@ -66,9 +66,6 @@ struct zfs_filesystem {  	block_dev_desc_t *dev_desc;  }; - -extern block_dev_desc_t *zfs_dev_desc; -  struct device_s {  	uint64_t part_length;  }; @@ -101,7 +98,7 @@ int zfs_close(zfs_file_t);  int zfs_ls(device_t dev, const char *path,  		   int (*hook) (const char *, const struct zfs_dirhook_info *));  int zfs_devread(int sector, int byte_offset, int byte_len, char *buf); -int zfs_set_blk_dev(block_dev_desc_t *rbdd, int part); +void zfs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);  void zfs_unmount(struct zfs_data *data);  int lzjb_decompress(void *, void *, uint32_t, uint32_t);  #endif |