Blame view
common/cmd_zfs.c
3.63 KB
4d3c95f5e zfs: Add ZFS file... |
1 2 3 4 5 6 7 8 |
/* * * ZFS filesystem porting to Uboot by * Jorgen Lundman <lundman at lundman.net> * * zfsfs support * made from existing GRUB Sources by Sun, GNU and others. * |
1a4596601 Add GPL-2.0+ SPDX... |
9 |
* SPDX-License-Identifier: GPL-2.0+ |
4d3c95f5e zfs: Add ZFS file... |
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
*/ #include <common.h> #include <part.h> #include <config.h> #include <command.h> #include <image.h> #include <linux/ctype.h> #include <asm/byteorder.h> #include <zfs_common.h> #include <linux/stat.h> #include <malloc.h> #if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE) #include <usb.h> #endif #if !defined(CONFIG_DOS_PARTITION) && !defined(CONFIG_EFI_PARTITION) #error DOS or EFI partition support must be selected #endif #define DOS_PART_MAGIC_OFFSET 0x1fe #define DOS_FS_TYPE_OFFSET 0x36 #define DOS_FS32_TYPE_OFFSET 0x52 |
af8d1d3f7 ZFS: Fix compile ... |
34 |
static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
4d3c95f5e zfs: Add ZFS file... |
35 36 |
{ char *filename = NULL; |
4d3c95f5e zfs: Add ZFS file... |
37 |
int dev; |
412045704 cmd_zfs: use comm... |
38 |
int part; |
4d3c95f5e zfs: Add ZFS file... |
39 |
ulong addr = 0; |
4d3c95f5e zfs: Add ZFS file... |
40 |
disk_partition_t info; |
412045704 cmd_zfs: use comm... |
41 |
block_dev_desc_t *dev_desc; |
4d3c95f5e zfs: Add ZFS file... |
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
char buf[12]; unsigned long count; const char *addr_str; struct zfs_file zfile; struct device_s vdev; if (argc < 3) return CMD_RET_USAGE; count = 0; addr = simple_strtoul(argv[3], NULL, 16); filename = getenv("bootfile"); switch (argc) { case 3: addr_str = getenv("loadaddr"); if (addr_str != NULL) addr = simple_strtoul(addr_str, NULL, 16); else addr = CONFIG_SYS_LOAD_ADDR; break; case 4: break; case 5: filename = argv[4]; break; case 6: filename = argv[4]; count = simple_strtoul(argv[5], NULL, 16); break; default: return cmd_usage(cmdtp); } if (!filename) { puts("** No boot file defined ** "); return 1; } |
10a37fd7a disk: get_device_... |
82 |
part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); |
412045704 cmd_zfs: use comm... |
83 |
if (part < 0) |
4d3c95f5e zfs: Add ZFS file... |
84 |
return 1; |
4d3c95f5e zfs: Add ZFS file... |
85 |
|
412045704 cmd_zfs: use comm... |
86 87 88 89 90 |
dev = dev_desc->dev; printf("Loading file \"%s\" from %s device %d%c%c ", filename, argv[1], dev, part ? ':' : ' ', part ? part + '0' : ' '); |
4d3c95f5e zfs: Add ZFS file... |
91 |
|
412045704 cmd_zfs: use comm... |
92 93 |
zfs_set_blk_dev(dev_desc, &info); vdev.part_length = info.size; |
4d3c95f5e zfs: Add ZFS file... |
94 95 96 97 |
memset(&zfile, 0, sizeof(zfile)); zfile.device = &vdev; if (zfs_open(&zfile, filename)) { |
01adbce2a cmd_zfs: normaliz... |
98 99 |
printf("** File not found %s ** ", filename); |
4d3c95f5e zfs: Add ZFS file... |
100 101 102 103 104 105 106 |
return 1; } if ((count < zfile.size) && (count != 0)) zfile.size = (uint64_t)count; if (zfs_read(&zfile, (char *)addr, zfile.size) != zfile.size) { |
412045704 cmd_zfs: use comm... |
107 108 |
printf("** Unable to read \"%s\" from %s %d:%d ** ", |
4d3c95f5e zfs: Add ZFS file... |
109 110 111 112 113 114 115 116 117 118 119 120 |
filename, argv[1], dev, part); zfs_close(&zfile); return 1; } zfs_close(&zfile); /* Loading ok, update default load address */ load_addr = addr; printf("%llu bytes read ", zfile.size); |
41ef372c1 common: Use new n... |
121 |
setenv_hex("filesize", zfile.size); |
4d3c95f5e zfs: Add ZFS file... |
122 123 124 125 126 127 128 129 130 131 132 133 134 |
return 0; } int zfs_print(const char *entry, const struct zfs_dirhook_info *data) { printf("%s %s ", data->dir ? "<DIR> " : " ", entry); return 0; /* 0 continue, 1 stop */ } |
af8d1d3f7 ZFS: Fix compile ... |
135 |
static int do_zfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
4d3c95f5e zfs: Add ZFS file... |
136 137 |
{ const char *filename = "/"; |
412045704 cmd_zfs: use comm... |
138 139 140 |
int part; block_dev_desc_t *dev_desc; disk_partition_t info; |
4d3c95f5e zfs: Add ZFS file... |
141 |
struct device_s vdev; |
412045704 cmd_zfs: use comm... |
142 |
if (argc < 2) |
4d3c95f5e zfs: Add ZFS file... |
143 |
return cmd_usage(cmdtp); |
4d3c95f5e zfs: Add ZFS file... |
144 145 |
if (argc == 4) filename = argv[3]; |
10a37fd7a disk: get_device_... |
146 |
part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); |
412045704 cmd_zfs: use comm... |
147 |
if (part < 0) |
4d3c95f5e zfs: Add ZFS file... |
148 |
return 1; |
4d3c95f5e zfs: Add ZFS file... |
149 |
|
412045704 cmd_zfs: use comm... |
150 151 |
zfs_set_blk_dev(dev_desc, &info); vdev.part_length = info.size; |
4d3c95f5e zfs: Add ZFS file... |
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
zfs_ls(&vdev, filename, zfs_print); return 0; } U_BOOT_CMD(zfsls, 4, 1, do_zfs_ls, "list files in a directory (default /)", "<interface> <dev[:part]> [directory] " " - list files from 'dev' on 'interface' in a '/DATASET/@/$dir/'"); U_BOOT_CMD(zfsload, 6, 0, do_zfs_load, "load binary file from a ZFS filesystem", "<interface> <dev[:part]> [addr] [filename] [bytes] " " - load binary file '/DATASET/@/$dir/$file' from 'dev' on 'interface' " " to address 'addr' from ZFS filesystem"); |