summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds-receive.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/cmds-receive.c b/cmds-receive.c
index 6e02efdb..8dcdd290 100644
--- a/cmds-receive.c
+++ b/cmds-receive.c
@@ -64,7 +64,7 @@ struct btrfs_receive
char *full_root_path;
int dest_dir_chroot;
- struct subvol_info *cur_subvol;
+ struct subvol_info cur_subvol;
struct subvol_uuid_search sus;
@@ -87,21 +87,21 @@ static int finish_subvol(struct btrfs_receive *r)
char uuid_str[BTRFS_UUID_UNPARSED_SIZE];
u64 flags;
- if (r->cur_subvol == NULL)
+ if (r->cur_subvol.path == NULL)
return 0;
- subvol_fd = openat(r->mnt_fd, r->cur_subvol->path,
+ subvol_fd = openat(r->mnt_fd, r->cur_subvol.path,
O_RDONLY | O_NOATIME);
if (subvol_fd < 0) {
ret = -errno;
fprintf(stderr, "ERROR: open %s failed. %s\n",
- r->cur_subvol->path, strerror(-ret));
+ r->cur_subvol.path, strerror(-ret));
goto out;
}
memset(&rs_args, 0, sizeof(rs_args));
- memcpy(rs_args.uuid, r->cur_subvol->received_uuid, BTRFS_UUID_SIZE);
- rs_args.stransid = r->cur_subvol->stransid;
+ memcpy(rs_args.uuid, r->cur_subvol.received_uuid, BTRFS_UUID_SIZE);
+ rs_args.stransid = r->cur_subvol.stransid;
if (g_verbose >= 1) {
uuid_unparse((u8*)rs_args.uuid, uuid_str);
@@ -116,7 +116,7 @@ static int finish_subvol(struct btrfs_receive *r)
strerror(-ret));
goto out;
}
- r->cur_subvol->rtransid = rs_args.rtransid;
+ r->cur_subvol.rtransid = rs_args.rtransid;
ret = ioctl(subvol_fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags);
if (ret < 0) {
@@ -139,10 +139,9 @@ static int finish_subvol(struct btrfs_receive *r)
ret = 0;
out:
- if (r->cur_subvol) {
- free(r->cur_subvol->path);
- free(r->cur_subvol);
- r->cur_subvol = NULL;
+ if (r->cur_subvol.path) {
+ free(r->cur_subvol.path);
+ r->cur_subvol.path = NULL;
}
if (subvol_fd != -1)
close(subvol_fd);
@@ -161,25 +160,25 @@ static int process_subvol(const char *path, const u8 *uuid, u64 ctransid,
if (ret < 0)
goto out;
- r->cur_subvol = calloc(1, sizeof(*r->cur_subvol));
+ BUG_ON(r->cur_subvol.path);
if (strlen(r->dest_dir_path) == 0)
- r->cur_subvol->path = strdup(path);
+ r->cur_subvol.path = strdup(path);
else
- r->cur_subvol->path = path_cat(r->dest_dir_path, path);
+ r->cur_subvol.path = path_cat(r->dest_dir_path, path);
free(r->full_subvol_path);
r->full_subvol_path = path_cat3(r->root_path, r->dest_dir_path, path);
fprintf(stderr, "At subvol %s\n", path);
- memcpy(r->cur_subvol->received_uuid, uuid, BTRFS_UUID_SIZE);
- r->cur_subvol->stransid = ctransid;
+ memcpy(r->cur_subvol.received_uuid, uuid, BTRFS_UUID_SIZE);
+ r->cur_subvol.stransid = ctransid;
if (g_verbose) {
- uuid_unparse((u8*)r->cur_subvol->received_uuid, uuid_str);
+ uuid_unparse((u8*)r->cur_subvol.received_uuid, uuid_str);
fprintf(stderr, "receiving subvol %s uuid=%s, stransid=%llu\n",
path, uuid_str,
- r->cur_subvol->stransid);
+ r->cur_subvol.stransid);
}
memset(&args_v1, 0, sizeof(args_v1));
@@ -210,25 +209,25 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid,
if (ret < 0)
goto out;
- r->cur_subvol = calloc(1, sizeof(*r->cur_subvol));
+ BUG_ON(r->cur_subvol.path);
if (strlen(r->dest_dir_path) == 0)
- r->cur_subvol->path = strdup(path);
+ r->cur_subvol.path = strdup(path);
else
- r->cur_subvol->path = path_cat(r->dest_dir_path, path);
+ r->cur_subvol.path = path_cat(r->dest_dir_path, path);
free(r->full_subvol_path);
r->full_subvol_path = path_cat3(r->root_path, r->dest_dir_path, path);
fprintf(stdout, "At snapshot %s\n", path);
- memcpy(r->cur_subvol->received_uuid, uuid, BTRFS_UUID_SIZE);
- r->cur_subvol->stransid = ctransid;
+ memcpy(r->cur_subvol.received_uuid, uuid, BTRFS_UUID_SIZE);
+ r->cur_subvol.stransid = ctransid;
if (g_verbose) {
- uuid_unparse((u8*)r->cur_subvol->received_uuid, uuid_str);
+ uuid_unparse((u8*)r->cur_subvol.received_uuid, uuid_str);
fprintf(stderr, "receiving snapshot %s uuid=%s, "
"ctransid=%llu ", path, uuid_str,
- r->cur_subvol->stransid);
+ r->cur_subvol.stransid);
uuid_unparse(parent_uuid, uuid_str);
fprintf(stderr, "parent_uuid=%s, parent_ctransid=%llu\n",
uuid_str, parent_ctransid);
@@ -633,10 +632,10 @@ static int process_clone(const char *path, u64 offset, u64 len,
si = subvol_uuid_search(&r->sus, 0, clone_uuid, clone_ctransid, NULL,
subvol_search_by_received_uuid);
if (!si) {
- if (memcmp(clone_uuid, r->cur_subvol->received_uuid,
+ if (memcmp(clone_uuid, r->cur_subvol.received_uuid,
BTRFS_UUID_SIZE) == 0) {
/* TODO check generation of extent */
- subvol_path = strdup(r->cur_subvol->path);
+ subvol_path = strdup(r->cur_subvol.path);
} else {
ret = -ENOENT;
fprintf(stderr, "ERROR: did not find source subvol.\n");
@@ -1074,10 +1073,9 @@ out:
r->full_subvol_path = NULL;
r->dest_dir_path = NULL;
free(dest_dir_full_path);
- if (r->cur_subvol) {
- free(r->cur_subvol->path);
- free(r->cur_subvol);
- r->cur_subvol = NULL;
+ if (r->cur_subvol.path) {
+ free(r->cur_subvol.path);
+ r->cur_subvol.path = NULL;
}
subvol_uuid_search_finit(&r->sus);
if (r->mnt_fd != -1) {