X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=cmds-send.c;h=07070ad82e220ef6aca33aeafc41a09354e7ef1a;hb=bd2cc320aff5789fe4034736fa6da8b4ebae475f;hp=20bba18e262cf89995a774d1b99a96e23220a099;hpb=d304cf1a2d96705eb9fad051cb0db75cd88b93a5;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-send.c b/cmds-send.c index 20bba18..07070ad 100644 --- a/cmds-send.c +++ b/cmds-send.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "ctree.h" #include "ioctl.h" @@ -173,11 +174,16 @@ out: static int add_clone_source(struct btrfs_send *s, u64 root_id) { + void *tmp; + + tmp = s->clone_sources; s->clone_sources = realloc(s->clone_sources, sizeof(*s->clone_sources) * (s->clone_sources_count + 1)); - if (!s->clone_sources) + if (!s->clone_sources) { + free(tmp); return -ENOMEM; + } s->clone_sources[s->clone_sources_count++] = root_id; return 0; @@ -192,14 +198,12 @@ static int write_buf(int fd, const void *buf, int size) ret = write(fd, (char*)buf + pos, size - pos); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to dump stream. %s", - strerror(-ret)); + error("failed to dump stream: %s", strerror(-ret)); goto out; } if (!ret) { ret = -EIO; - fprintf(stderr, "ERROR: failed to dump stream. %s", - strerror(-ret)); + error("failed to dump stream: %s", strerror(-ret)); goto out; } pos += ret; @@ -221,8 +225,8 @@ static void *dump_thread(void *arg_) readed = read(s->send_fd, buf, sizeof(buf)); if (readed < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to read stream from " - "kernel. %s\n", strerror(-ret)); + error("failed to read stream from kernel: %s\n", + strerror(-ret)); goto out; } if (!readed) { @@ -256,15 +260,14 @@ static int do_send(struct btrfs_send *send, u64 parent_root_id, subvol_fd = openat(send->mnt_fd, subvol, O_RDONLY | O_NOATIME); if (subvol_fd < 0) { ret = -errno; - fprintf(stderr, "ERROR: open %s failed. %s\n", subvol, - strerror(-ret)); + error("cannot open %s: %s", subvol, strerror(-ret)); goto out; } ret = pipe(pipefd); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: pipe failed. %s\n", strerror(-ret)); + error("pipe failed: %s", strerror(-ret)); goto out; } @@ -277,8 +280,7 @@ static int do_send(struct btrfs_send *send, u64 parent_root_id, send); if (ret) { ret = -ret; - fprintf(stderr, "ERROR: thread setup failed: %s\n", - strerror(-ret)); + error("thread setup failed: %s", strerror(-ret)); goto out; } @@ -291,10 +293,9 @@ static int do_send(struct btrfs_send *send, u64 parent_root_id, if (!is_last_subvol) io_send.flags |= BTRFS_SEND_FLAG_OMIT_END_CMD; ret = ioctl(subvol_fd, BTRFS_IOC_SEND, &io_send); - if (ret) { + if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: send ioctl failed with %d: %s\n", ret, - strerror(-ret)); + error("send ioctl failed with %d: %s", ret, strerror(-ret)); if (ret == -EINVAL && (!is_first_subvol || !is_last_subvol)) fprintf(stderr, "Try upgrading your kernel or don't use -e.\n"); @@ -312,14 +313,13 @@ static int do_send(struct btrfs_send *send, u64 parent_root_id, ret = pthread_join(t_read, &t_err); if (ret) { ret = -ret; - fprintf(stderr, "ERROR: pthread_join failed: %s\n", - strerror(-ret)); + error("pthread_join failed: %s", strerror(-ret)); goto out; } if (t_err) { ret = (long int)t_err; - fprintf(stderr, "ERROR: failed to process send stream, ret=%ld " - "(%s)\n", (long int)t_err, strerror(-ret)); + error("failed to process send stream, ret=%ld (%s)", + (long int)t_err, strerror(-ret)); goto out; } @@ -335,17 +335,6 @@ out: return ret; } -char *get_subvol_name(char *mnt, char *full_path) -{ - int len = strlen(mnt); - if (!len) - return full_path; - if (mnt[len - 1] != '/') - len += 1; - - return full_path + len; -} - static int init_root_path(struct btrfs_send *s, const char *subvol) { int ret = 0; @@ -355,16 +344,13 @@ static int init_root_path(struct btrfs_send *s, const char *subvol) ret = find_mount_root(subvol, &s->root_path); if (ret < 0) { - fprintf(stderr, - "ERROR: failed to determine mount point for %s: %s\n", + error("failed to determine mount point for %s: %s", subvol, strerror(-ret)); ret = -EINVAL; goto out; } if (ret > 0) { - fprintf(stderr, - "ERROR: %s doesn't belong to btrfs mount point\n", - subvol); + error("%s doesn't belong to btrfs mount point", subvol); ret = -EINVAL; goto out; } @@ -372,15 +358,14 @@ static int init_root_path(struct btrfs_send *s, const char *subvol) s->mnt_fd = open(s->root_path, O_RDONLY | O_NOATIME); if (s->mnt_fd < 0) { ret = -errno; - fprintf(stderr, "ERROR: can't open '%s': %s\n", s->root_path, - strerror(-ret)); + error("cannot open '%s': %s", s->root_path, strerror(-ret)); goto out; } ret = subvol_uuid_search_init(s->mnt_fd, &s->sus); if (ret < 0) { - fprintf(stderr, "ERROR: failed to initialize subvol search. " - "%s\n", strerror(-ret)); + error("failed to initialize subvol search: %s", + strerror(-ret)); goto out; } @@ -398,16 +383,15 @@ static int is_subvol_ro(struct btrfs_send *s, char *subvol) fd = openat(s->mnt_fd, subvol, O_RDONLY | O_NOATIME); if (fd < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to open %s. %s\n", - subvol, strerror(-ret)); + error("cannot open %s: %s", subvol, strerror(-ret)); goto out; } ret = ioctl(fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to get flags for subvolume. " - "%s\n", strerror(-ret)); + error("failed to get flags for subvolume %s: %s", + subvol, strerror(-ret)); goto out; } @@ -463,8 +447,7 @@ int cmd_send(int argc, char **argv) subvol = realpath(optarg, NULL); if (!subvol) { ret = -errno; - fprintf(stderr, "ERROR: realpath %s failed. " - "%s\n", optarg, strerror(-ret)); + error("realpath %s failed: %s\n", optarg, strerror(-ret)); goto out; } @@ -472,11 +455,11 @@ int cmd_send(int argc, char **argv) if (ret < 0) goto out; - ret = get_root_id(&send, get_subvol_name(send.root_path, subvol), - &root_id); + ret = get_root_id(&send, + subvol_strip_mountpoint(send.root_path, subvol), + &root_id); if (ret < 0) { - fprintf(stderr, "ERROR: could not resolve " - "root_id for %s\n", subvol); + error("cannot resolve rootid for %s", subvol); goto out; } @@ -485,15 +468,13 @@ int cmd_send(int argc, char **argv) goto out; if (!ret) { ret = -EINVAL; - fprintf(stderr, - "ERROR: cloned subvol %s is not read-only.\n", - subvol); + error("cloned subvolume %s is not read-only", subvol); goto out; } ret = add_clone_source(&send, root_id); if (ret < 0) { - fprintf(stderr, "ERROR: not enough memory\n"); + error("cannot add clone source: %s", strerror(-ret)); goto out; } subvol_uuid_search_finit(&send.sus); @@ -509,24 +490,21 @@ int cmd_send(int argc, char **argv) break; case 'f': if (arg_copy_path(outname, optarg, sizeof(outname))) { - fprintf(stderr, - "ERROR: output file path too long (%zu)\n", - strlen(optarg)); + error("output file path too long (%zu)", strlen(optarg)); ret = 1; goto out; } break; case 'p': if (snapshot_parent) { - fprintf(stderr, "ERROR: you cannot have more than one parent (-p)\n"); + error("you cannot have more than one parent (-p)"); ret = 1; goto out; } snapshot_parent = realpath(optarg, NULL); if (!snapshot_parent) { ret = -errno; - fprintf(stderr, "ERROR: realpath %s failed. " - "%s\n", optarg, strerror(-ret)); + error("realpath %s failed: %s", optarg, strerror(-ret)); goto out; } @@ -535,8 +513,7 @@ int cmd_send(int argc, char **argv) goto out; if (!ret) { ret = -EINVAL; - fprintf(stderr, - "ERROR: parent %s is not read-only.\n", + error("parent subvolume %s is not read-only", snapshot_parent); goto out; } @@ -544,8 +521,7 @@ int cmd_send(int argc, char **argv) full_send = 0; break; case 'i': - fprintf(stderr, - "ERROR: -i was removed, use -c instead\n"); + error("option -i was removed, use -c instead"); ret = 1; goto out; case GETOPT_VAL_SEND_NO_DATA: @@ -553,7 +529,7 @@ int cmd_send(int argc, char **argv) break; case '?': default: - fprintf(stderr, "ERROR: send args invalid.\n"); + error("send arguments invalid"); ret = 1; goto out; } @@ -566,16 +542,14 @@ int cmd_send(int argc, char **argv) send.dump_fd = creat(outname, 0600); if (send.dump_fd == -1) { ret = -errno; - fprintf(stderr, "ERROR: can't create '%s': %s\n", - outname, strerror(-ret)); + error("cannot create '%s': %s", outname, strerror(-ret)); goto out; } } if (isatty(send.dump_fd)) { - fprintf(stderr, - "ERROR: not dumping send stream into a terminal, " - "redirect it into a file\n"); + error( + "not dumping send stream into a terminal, redirect it into a file"); ret = 1; goto out; } @@ -586,7 +560,7 @@ int cmd_send(int argc, char **argv) subvol = realpath(argv[optind], NULL); if (!subvol) { ret = -errno; - fprintf(stderr, "ERROR: unable to resolve %s\n", argv[optind]); + error("unable to resolve %s", argv[optind]); goto out; } @@ -596,17 +570,16 @@ int cmd_send(int argc, char **argv) if (snapshot_parent != NULL) { ret = get_root_id(&send, - get_subvol_name(send.root_path, snapshot_parent), - &parent_root_id); + subvol_strip_mountpoint(send.root_path, snapshot_parent), + &parent_root_id); if (ret < 0) { - fprintf(stderr, "ERROR: could not resolve root_id " - "for %s\n", snapshot_parent); + error("could not resolve rootid for %s", snapshot_parent); goto out; } ret = add_clone_source(&send, parent_root_id); if (ret < 0) { - fprintf(stderr, "ERROR: not enough memory\n"); + error("cannot add clone source: %s", strerror(-ret)); goto out; } } @@ -616,28 +589,25 @@ int cmd_send(int argc, char **argv) subvol = realpath(argv[i], NULL); if (!subvol) { ret = -errno; - fprintf(stderr, "ERROR: unable to resolve %s\n", argv[i]); + error("unable to resolve %s", argv[i]); goto out; } ret = find_mount_root(subvol, &mount_root); if (ret < 0) { - fprintf(stderr, "ERROR: find_mount_root failed on %s: " - "%s\n", subvol, + error("find_mount_root failed on %s: %s", subvol, strerror(-ret)); goto out; } if (ret > 0) { - fprintf(stderr, - "ERROR: %s doesn't belong to btrfs mount point\n", + error("%s does not belong to btrfs mount point", subvol); ret = -EINVAL; goto out; } if (strcmp(send.root_path, mount_root) != 0) { ret = -EINVAL; - fprintf(stderr, "ERROR: all subvols must be from the " - "same fs.\n"); + error("all subvolumes must be from the same filesystem"); goto out; } free(mount_root); @@ -647,8 +617,7 @@ int cmd_send(int argc, char **argv) goto out; if (!ret) { ret = -EINVAL; - fprintf(stderr, "ERROR: %s is not read-only.\n", - subvol); + error("subvolume %s is not read-only", subvol); goto out; } } @@ -668,15 +637,14 @@ int cmd_send(int argc, char **argv) subvol = realpath(subvol, NULL); if (!subvol) { ret = -errno; - fprintf(stderr, "ERROR: realpath %s failed. " - "%s\n", argv[i], strerror(-ret)); + error("realpath %s failed: %s", argv[i], strerror(-ret)); goto out; } if (!full_send && !parent_root_id) { ret = find_good_parent(&send, root_id, &parent_root_id); if (ret < 0) { - fprintf(stderr, "ERROR: parent determination failed for %lld\n", + error("parent determination failed for %lld", root_id); goto out; } @@ -687,8 +655,7 @@ int cmd_send(int argc, char **argv) goto out; if (!ret) { ret = -EINVAL; - fprintf(stderr, "ERROR: %s is not read-only.\n", - subvol); + error("subvolume %s is not read-only", subvol); goto out; } @@ -706,15 +673,16 @@ int cmd_send(int argc, char **argv) if (ret < 0) goto out; - /* done with this subvol, so add it to the clone sources */ - ret = add_clone_source(&send, root_id); - if (ret < 0) { - fprintf(stderr, "ERROR: not enough memory\n"); - goto out; + if (!full_send) { + /* done with this subvol, so add it to the clone sources */ + ret = add_clone_source(&send, root_id); + if (ret < 0) { + error("cannot add clone source: %s", strerror(-ret)); + goto out; + } } parent_root_id = 0; - full_send = 0; } ret = 0; @@ -734,6 +702,7 @@ const char * const cmd_send_usage[] = { "btrfs send [-ve] [-p ] [-c ] [-f ] [...]", "Send the subvolume(s) to stdout.", "Sends the subvolume(s) specified by to stdout.", + " should be read-only here.", "By default, this will send the whole subvolume. To do an incremental", "send, use '-p '. If you want to allow btrfs to clone from", "any additional local snapshots, use '-c ' (multiple times",