Blame view
cmd/zfs.c
3.64 KB
83d290c56 SPDX: Convert all... |
1 |
// SPDX-License-Identifier: GPL-2.0+ |
4d3c95f5e zfs: Add ZFS file... |
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. |
4d3c95f5e zfs: Add ZFS file... |
9 10 11 12 13 14 |
*/ #include <common.h> #include <part.h> #include <config.h> #include <command.h> |
c7694dd48 env: Move env_set... |
15 |
#include <env.h> |
4d3c95f5e zfs: Add ZFS file... |
16 17 18 19 20 21 22 23 24 25 |
#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 |
bd42a9426 disk: convert CON... |
26 |
#if !CONFIG_IS_ENABLED(DOS_PARTITION) && !CONFIG_IS_ENABLED(EFI_PARTITION) |
4d3c95f5e zfs: Add ZFS file... |
27 28 29 30 31 32 |
#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 ... |
33 |
static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
4d3c95f5e zfs: Add ZFS file... |
34 35 |
{ char *filename = NULL; |
4d3c95f5e zfs: Add ZFS file... |
36 |
int dev; |
412045704 cmd_zfs: use comm... |
37 |
int part; |
4d3c95f5e zfs: Add ZFS file... |
38 |
ulong addr = 0; |
4d3c95f5e zfs: Add ZFS file... |
39 |
disk_partition_t info; |
4101f6879 dm: Drop the bloc... |
40 |
struct blk_desc *dev_desc; |
4d3c95f5e zfs: Add ZFS file... |
41 42 43 44 45 46 47 48 49 50 |
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); |
00caae6d4 env: Rename geten... |
51 |
filename = env_get("bootfile"); |
4d3c95f5e zfs: Add ZFS file... |
52 53 |
switch (argc) { case 3: |
00caae6d4 env: Rename geten... |
54 |
addr_str = env_get("loadaddr"); |
4d3c95f5e zfs: Add ZFS file... |
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 |
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; } |
e35929e4a dm: blk: Rename g... |
80 |
part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1); |
412045704 cmd_zfs: use comm... |
81 |
if (part < 0) |
4d3c95f5e zfs: Add ZFS file... |
82 |
return 1; |
4d3c95f5e zfs: Add ZFS file... |
83 |
|
bcce53d04 dm: block: Rename... |
84 |
dev = dev_desc->devnum; |
412045704 cmd_zfs: use comm... |
85 86 87 88 |
printf("Loading file \"%s\" from %s device %d%c%c ", filename, argv[1], dev, part ? ':' : ' ', part ? part + '0' : ' '); |
4d3c95f5e zfs: Add ZFS file... |
89 |
|
412045704 cmd_zfs: use comm... |
90 91 |
zfs_set_blk_dev(dev_desc, &info); vdev.part_length = info.size; |
4d3c95f5e zfs: Add ZFS file... |
92 93 94 95 |
memset(&zfile, 0, sizeof(zfile)); zfile.device = &vdev; if (zfs_open(&zfile, filename)) { |
01adbce2a cmd_zfs: normaliz... |
96 97 |
printf("** File not found %s ** ", filename); |
4d3c95f5e zfs: Add ZFS file... |
98 99 100 101 102 103 104 |
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... |
105 106 |
printf("** Unable to read \"%s\" from %s %d:%d ** ", |
4d3c95f5e zfs: Add ZFS file... |
107 108 109 110 111 112 113 114 |
filename, argv[1], dev, part); zfs_close(&zfile); return 1; } zfs_close(&zfile); /* Loading ok, update default load address */ |
bb872dd93 image: Rename loa... |
115 |
image_load_addr = addr; |
4d3c95f5e zfs: Add ZFS file... |
116 117 118 |
printf("%llu bytes read ", zfile.size); |
018f53032 env: Rename commo... |
119 |
env_set_hex("filesize", zfile.size); |
4d3c95f5e zfs: Add ZFS file... |
120 121 122 123 124 125 126 127 128 129 130 131 132 |
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 ... |
133 |
static int do_zfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
4d3c95f5e zfs: Add ZFS file... |
134 135 |
{ const char *filename = "/"; |
412045704 cmd_zfs: use comm... |
136 |
int part; |
4101f6879 dm: Drop the bloc... |
137 |
struct blk_desc *dev_desc; |
412045704 cmd_zfs: use comm... |
138 |
disk_partition_t info; |
4d3c95f5e zfs: Add ZFS file... |
139 |
struct device_s vdev; |
412045704 cmd_zfs: use comm... |
140 |
if (argc < 2) |
4d3c95f5e zfs: Add ZFS file... |
141 |
return cmd_usage(cmdtp); |
4d3c95f5e zfs: Add ZFS file... |
142 143 |
if (argc == 4) filename = argv[3]; |
e35929e4a dm: blk: Rename g... |
144 |
part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1); |
412045704 cmd_zfs: use comm... |
145 |
if (part < 0) |
4d3c95f5e zfs: Add ZFS file... |
146 |
return 1; |
4d3c95f5e zfs: Add ZFS file... |
147 |
|
412045704 cmd_zfs: use comm... |
148 149 |
zfs_set_blk_dev(dev_desc, &info); vdev.part_length = info.size; |
4d3c95f5e zfs: Add ZFS file... |
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
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"); |