summaryrefslogtreecommitdiffstats
path: root/commands/partition.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2009-04-22 23:39:27 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2009-07-21 16:41:44 +0200
commita2b7cd183bad9c9e0888ce62f5ae0f83c070cc2a (patch)
tree556535cae729eac244edff816476cab281c6be7b /commands/partition.c
parent6411c3b2be40bb295520db2e9f6f891873a48b1a (diff)
downloadbarebox-a2b7cd183bad9c9e0888ce62f5ae0f83c070cc2a.tar.gz
barebox-a2b7cd183bad9c9e0888ce62f5ae0f83c070cc2a.tar.xz
introduce cdev
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands/partition.c')
-rwxr-xr-xcommands/partition.c195
1 files changed, 50 insertions, 145 deletions
diff --git a/commands/partition.c b/commands/partition.c
index 9303987f2a..30f7407175 100755
--- a/commands/partition.c
+++ b/commands/partition.c
@@ -37,99 +37,29 @@
#include <partition.h>
#include <errno.h>
#include <xfuncs.h>
+#include <fs.h>
+#include <linux/stat.h>
+#include <libgen.h>
-static int dev_del_partitions(struct device_d *physdev)
-{
- struct device_d *child, *tmp;
- struct partition *part;
- int ret;
-
- device_for_each_child_safe(physdev, tmp, child) {
- if (child->type != DEVICE_TYPE_PARTITION) {
- printf("not a partition: %s\n", child->id);
- continue;
- }
-
- part = child->type_data;
-
- if (part->flags & PARTITION_FIXED) {
- debug("Skip fixed partition: %s\n", child->id);
- continue;
- }
-
- ret = unregister_device(child);
- if (ret) {
- printf("delete partition `%s' failed: %s\n", child->id, errno_str());
- return errno;
- }
-
- debug("deleted partition: %s\n", child->id);
-
- free(part);
- }
-
- return 0;
-}
-
-static int dev_check_fixed(struct device_d *physdev, struct partition *new_part)
-{
- struct device_d *child;
-
- device_for_each_child(physdev, child) {
- struct partition *part = child->type_data;
-
- debug("check aginst partition: %s -", child->id);
-
- if (!(part->flags & PARTITION_FIXED)) {
- debug(" not fixed, ok\n");
- continue;
- }
-
- if (new_part->offset == part->offset && /* new_part is exactly part */
- ((new_part->device.size==0) || (new_part->device.size == part->device.size)) ) {
- debug(" fixed, but same size, ok\n");
- continue;
- }
-
- if ((new_part->offset >= part->offset &&
- new_part->offset < part->offset + part->device.size) ||
- (new_part->offset + new_part->device.size > part->offset &&
- new_part->offset + new_part->device.size <= part->offset + part->device.size)) {
- printf(
- " failed\n"
- " partition spec %s \n"
- " violates fixed partition %s\n", new_part->name, child->id);
- errno = -EINVAL;
- return errno;
- }
- else
- debug(" fixed and within limit?, ok\n");
- }
-
- return 0;
-}
-
-static int mtd_part_do_parse_one(struct partition *part, const char *partstr,
- char **endp)
+static int mtd_part_do_parse_one(char *devname, const char *partstr,
+ char **endp, unsigned long offset,
+ off_t devsize, size_t *retsize)
{
ulong size;
char *end;
- char buf[MAX_DRIVER_NAME];
+ char buf[PATH_MAX];
+ unsigned long flags = 0;
+ int ret;
- memset(buf, 0, MAX_DRIVER_NAME);
+ memset(buf, 0, PATH_MAX);
if (*partstr == '-') {
- size = part->physdev->size - part->offset;
+ size = devsize - offset;
end = (char *)partstr + 1;
} else {
size = strtoul_suffix(partstr, &end, 0);
}
- if (size + part->offset > part->physdev->size) {
- printf("partition %s end is beyond device\n", part->name);
- return -EINVAL;
- }
-
partstr = end;
if (*partstr == '(') {
@@ -139,98 +69,78 @@ static int mtd_part_do_parse_one(struct partition *part, const char *partstr,
printf("could not find matching ')'\n");
return -EINVAL;
}
- if (end - partstr >= MAX_DRIVER_NAME) {
- printf("device name too long\n");
- return -EINVAL;
- }
- memcpy(part->name, partstr, end - partstr);
+ sprintf(buf, "%s.", devname);
+ memcpy(buf + strlen(buf), partstr, end - partstr);
+
end++;
}
+ if (size + offset > devsize) {
+ printf("%s: partition end is beyond device\n", buf);
+ return -EINVAL;
+ }
+
partstr = end;
if (*partstr == 'r' && *(partstr + 1) == 'o') {
- part->flags |= PARTITION_READONLY;
+ flags |= PARTITION_READONLY;
end = (char *)(partstr + 2);
}
if (endp)
*endp = end;
- strcpy(part->device.name, "partition");
- part->device.size = size;
+ *retsize = size;
- return 0;
+ ret = devfs_add_partition(devname, offset, size, flags, buf);
+ if (ret)
+ printf("cannot create %s: %s\n", buf, strerror(-ret));
+ return ret;
}
static int do_addpart(cmd_tbl_t * cmdtp, int argc, char *argv[])
{
- struct partition *part;
- struct device_d *dev;
+ char *devname;
char *endp;
- int num = 0;
- unsigned long offset;
+ unsigned long offset = 0;
+ off_t devsize;
+ struct stat s;
if (argc != 3) {
printf("Usage:\n %s\n", cmdtp->usage);
return 1;
}
- dev = get_device_by_path(argv[1]);
- if (!dev) {
- printf("no such device: %s\n", argv[1]);
+ if (stat(argv[1], &s)) {
+ perror("addpart");
return 1;
}
+ devsize = s.st_size;
- dev_del_partitions(dev);
-
- offset = 0;
+ devname = basename(argv[1]);
endp = argv[2];
while (1) {
- part = xzalloc(sizeof(struct partition));
-
- part->offset = offset;
- part->physdev = dev;
- part->num = num;
- part->device.map_base = dev->map_base + offset;
- part->device.type_data = part;
- part->device.type = DEVICE_TYPE_PARTITION;
+ size_t size = 0;
- if (mtd_part_do_parse_one(part, endp, &endp))
- goto free_out;
+ if (mtd_part_do_parse_one(devname, endp, &endp, offset, devsize, &size))
+ return 1;
- if (dev_check_fixed(dev, part))
- goto free_out;
-
- sprintf(part->device.id, "%s.%s", dev->id, part->name);
- if (register_device(&part->device))
- goto free_out;
-
- dev_add_child(dev, &part->device);
-
- offset += part->device.size;
- num++;
+ offset += size;
if (!*endp)
break;
if (*endp != ',') {
printf("parse error\n");
- goto err_out;
+ return 1;
}
endp++;
}
return 0;
-
-free_out:
- free(part);
-err_out:
- dev_del_partitions(dev);
- return 1;
}
static const __maybe_unused char cmd_addpart_help[] =
@@ -275,38 +185,33 @@ U_BOOT_CMD_END
static int do_delpart(cmd_tbl_t * cmdtp, int argc, char *argv[])
{
- struct device_d *dev;
-
- if (argc != 2) {
- printf("Usage:\n%s\n", cmdtp->usage);
- return 1;
- }
+ int i, err;
- dev = get_device_by_path(argv[1]);
- if (!dev) {
- printf("no such device: %s\n", argv[1]);
- return 1;
+ for (i = 1; i < argc; i++) {
+ err = devfs_del_partition(basename(argv[i]));
+ if (err) {
+ printf("cannot delete %s: %s\n", argv[i], strerror(-err));
+ break;
+ }
}
- dev_del_partitions(dev);
-
- return 0;
+ return 1;
}
static const __maybe_unused char cmd_delpart_help[] =
-"Usage: delpart <device>\n"
+"Usage: delpart FILE...\n"
"Delete partitions previously added to a device with addpart.\n";
U_BOOT_CMD_START(delpart)
- .maxargs = 2,
+ .maxargs = CONFIG_MAXARGS,
.cmd = do_delpart,
- .usage = "delete a partition table from a device",
+ .usage = "delete partition(s)",
U_BOOT_CMD_HELP(cmd_delpart_help)
U_BOOT_CMD_END
/** @page delpart_command delpart Delete a partition
*
- * Usage is: delpart \<device>
+ * Usage is: delpart \<partions>
*
* Delete a partition previously added to a device with addpart.
*/