X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=send-utils.c;h=384cc5b7dd32144e61bd9046d23b851a01662440;hb=c7bc72264aed05e00edcb4f0575abf841d621dc8;hp=c3d8c3e035047fa60f083fa10a42a0a4bf633833;hpb=b6a77a272b1a687f90999fe7aacf7a85523f0aa6;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/send-utils.c b/send-utils.c index c3d8c3e..384cc5b 100644 --- a/send-utils.c +++ b/send-utils.c @@ -99,25 +99,25 @@ static int btrfs_read_root_item_raw(int mnt_fd, u64 root_id, size_t buf_len, off += sizeof(*sh); item = (struct btrfs_root_item *)(args.buf + off); - off += sh->len; + off += btrfs_search_header_len(sh); - sk->min_objectid = sh->objectid; - sk->min_type = sh->type; - sk->min_offset = sh->offset; + sk->min_objectid = btrfs_search_header_objectid(sh); + sk->min_type = btrfs_search_header_type(sh); + sk->min_offset = btrfs_search_header_offset(sh); - if (sh->objectid > root_id) + if (btrfs_search_header_objectid(sh) > root_id) break; - if (sh->objectid == root_id && - sh->type == BTRFS_ROOT_ITEM_KEY) { - if (sh->len > buf_len) { + if (btrfs_search_header_objectid(sh) == root_id && + btrfs_search_header_type(sh) == BTRFS_ROOT_ITEM_KEY) { + if (btrfs_search_header_len(sh) > buf_len) { /* btrfs-progs is too old for kernel */ fprintf(stderr, "ERROR: buf for read_root_item_raw() is too small, get newer btrfs tools!\n"); return -EOVERFLOW; } - memcpy(buf, item, sh->len); - *read_len = sh->len; + memcpy(buf, item, btrfs_search_header_len(sh)); + *read_len = btrfs_search_header_len(sh); found = 1; } } @@ -265,7 +265,7 @@ static int btrfs_subvolid_resolve_sub(int fd, char *path, size_t *path_len, search_arg.key.max_transid = (u64)-1; search_arg.key.nr_items = 1; ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &search_arg); - if (ret) { + if (ret < 0) { fprintf(stderr, "ioctl(BTRFS_IOC_TREE_SEARCH, subvol_id %llu) ret=%d, error: %s\n", (unsigned long long)subvol_id, ret, strerror(errno)); @@ -280,11 +280,12 @@ static int btrfs_subvolid_resolve_sub(int fd, char *path, size_t *path_len, } search_header = (struct btrfs_ioctl_search_header *)search_arg.buf; backref_item = (struct btrfs_root_ref *)(search_header + 1); - if (search_header->offset != BTRFS_FS_TREE_OBJECTID) { + if (btrfs_search_header_offset(search_header) + != BTRFS_FS_TREE_OBJECTID) { int sub_ret; sub_ret = btrfs_subvolid_resolve_sub(fd, path, path_len, - search_header->offset); + btrfs_search_header_offset(search_header)); if (sub_ret) return sub_ret; if (*path_len < 1) @@ -298,11 +299,12 @@ static int btrfs_subvolid_resolve_sub(int fd, char *path, size_t *path_len, int len; memset(&ino_lookup_arg, 0, sizeof(ino_lookup_arg)); - ino_lookup_arg.treeid = search_header->offset; + ino_lookup_arg.treeid = + btrfs_search_header_offset(search_header); ino_lookup_arg.objectid = btrfs_stack_root_ref_dirid(backref_item); ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &ino_lookup_arg); - if (ret) { + if (ret < 0) { fprintf(stderr, "ioctl(BTRFS_IOC_INO_LOOKUP) ret=%d, error: %s\n", ret, strerror(errno)); @@ -401,7 +403,7 @@ static struct subvol_info *tree_search(struct rb_root *root, } /* - * this function will be only called if kernel dosen't support uuid tree. + * this function will be only called if kernel doesn't support uuid tree. */ static struct subvol_info *subvol_uuid_search_old(struct subvol_uuid_search *s, u64 root_id, const u8 *uuid, u64 transid, @@ -437,6 +439,19 @@ struct subvol_info *subvol_uuid_search(struct subvol_uuid_search *s, const char *path, enum subvol_search_type type) { + struct subvol_info *si; + + si = subvol_uuid_search2(s, root_id, uuid, transid, path, type); + if (IS_ERR(si)) + return NULL; + return si; +} + +struct subvol_info *subvol_uuid_search2(struct subvol_uuid_search *s, + u64 root_id, const u8 *uuid, u64 transid, + const char *path, + enum subvol_search_type type) +{ int ret = 0; struct btrfs_root_item root_item; struct subvol_info *info = NULL; @@ -472,6 +487,10 @@ struct subvol_info *subvol_uuid_search(struct subvol_uuid_search *s, goto out; info = calloc(1, sizeof(*info)); + if (!info) { + ret = -ENOMEM; + goto out; + } info->root_id = root_id; memcpy(info->uuid, root_item.uuid, BTRFS_UUID_SIZE); memcpy(info->received_uuid, root_item.received_uuid, BTRFS_UUID_SIZE); @@ -482,17 +501,27 @@ struct subvol_info *subvol_uuid_search(struct subvol_uuid_search *s, info->rtransid = btrfs_root_rtransid(&root_item); if (type == subvol_search_by_path) { info->path = strdup(path); + if (!info->path) { + ret = -ENOMEM; + goto out; + } } else { info->path = malloc(PATH_MAX); + if (!info->path) { + ret = -ENOMEM; + goto out; + } ret = btrfs_subvolid_resolve(s->mnt_fd, info->path, PATH_MAX, root_id); } out: - if (ret && info) { - free(info->path); - free(info); - info = NULL; + if (ret) { + if (info) { + free(info->path); + free(info); + } + return ERR_PTR(ret); } return info; @@ -545,7 +574,6 @@ int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s) int root_item_valid = 0; unsigned long off = 0; int i; - int e; char *path; s->mnt_fd = mnt_fd; @@ -579,10 +607,9 @@ int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s) while (1) { ret = ioctl(mnt_fd, BTRFS_IOC_TREE_SEARCH, &args); - e = errno; if (ret < 0) { fprintf(stderr, "ERROR: can't perform the search - %s\n", - strerror(e)); + strerror(errno)); return ret; } if (sk->nr_items == 0) @@ -595,14 +622,19 @@ int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s) off); off += sizeof(*sh); - if ((sh->objectid != 5 && - sh->objectid < BTRFS_FIRST_FREE_OBJECTID) || - sh->objectid > BTRFS_LAST_FREE_OBJECTID) + if ((btrfs_search_header_objectid(sh) != 5 && + btrfs_search_header_objectid(sh) + < BTRFS_FIRST_FREE_OBJECTID) || + btrfs_search_header_objectid(sh) + > BTRFS_LAST_FREE_OBJECTID) { goto skip; + } - if (sh->type == BTRFS_ROOT_ITEM_KEY) { + if (btrfs_search_header_type(sh) + == BTRFS_ROOT_ITEM_KEY) { /* older kernels don't have uuids+times */ - if (sh->len < sizeof(root_item)) { + if (btrfs_search_header_len(sh) + < sizeof(root_item)) { root_item_valid = 0; goto skip; } @@ -611,13 +643,14 @@ int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s) memcpy(&root_item, root_item_ptr, sizeof(root_item)); root_item_valid = 1; - } else if (sh->type == BTRFS_ROOT_BACKREF_KEY || + } else if (btrfs_search_header_type(sh) + == BTRFS_ROOT_BACKREF_KEY || root_item_valid) { if (!root_item_valid) goto skip; path = btrfs_list_path_for_root(mnt_fd, - sh->objectid); + btrfs_search_header_objectid(sh)); if (!path) path = strdup(""); if (IS_ERR(path)) { @@ -625,12 +658,12 @@ int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s) fprintf(stderr, "ERROR: unable to " "resolve path " "for root %llu\n", - sh->objectid); + btrfs_search_header_objectid(sh)); goto out; } si = calloc(1, sizeof(*si)); - si->root_id = sh->objectid; + si->root_id = btrfs_search_header_objectid(sh); memcpy(si->uuid, root_item.uuid, BTRFS_UUID_SIZE); memcpy(si->parent_uuid, root_item.parent_uuid, @@ -650,15 +683,15 @@ int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s) } skip: - off += sh->len; + off += btrfs_search_header_len(sh); /* * record the mins in sk so we can make sure the * next search doesn't repeat this root */ - sk->min_objectid = sh->objectid; - sk->min_offset = sh->offset; - sk->min_type = sh->type; + sk->min_objectid = btrfs_search_header_objectid(sh); + sk->min_offset = btrfs_search_header_offset(sh); + sk->min_type = btrfs_search_header_type(sh); } sk->nr_items = 4096; if (sk->min_offset < (u64)-1) @@ -727,6 +760,7 @@ int path_cat_out(char *out, const char *p1, const char *p2) return 0; } +__attribute__((deprecated)) char *path_cat(const char *p1, const char *p2) { int p1_len = strlen(p1); @@ -758,6 +792,7 @@ int path_cat3_out(char *out, const char *p1, const char *p2, const char *p3) return 0; } +__attribute__((deprecated)) char *path_cat3(const char *p1, const char *p2, const char *p3) { int p1_len = strlen(p1);