]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
cmd_zfs: use common get_device_and_partition function
authorRob Herring <rob.herring@calxeda.com>
Thu, 23 Aug 2012 11:31:49 +0000 (11:31 +0000)
committerTom Rini <trini@ti.com>
Tue, 25 Sep 2012 21:49:17 +0000 (14:49 -0700)
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>
common/cmd_zfs.c
fs/zfs/dev.c
include/zfs_common.h

index a6ea2c07cdd06de193eb8f3edb1bcc0e4f4a6a10..27f88563d7239c4eab563768b68ac09408ba6546 100644 (file)
 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);
index d68372c8089e0a60e95b8f0da489a2896f3bb6bd..36be8f5c807b61f88e588a68bbb856f5ac8b4481 100644 (file)
 #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;
index 628231efd3f8786b7830f3f4b5e9c5118e44c999..3bd575ef5f956efa5274d09911f7978ba6b26d22 100644 (file)
@@ -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