X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=send-utils.h;h=5f5e096f7cd7b5f7c82e630a7fe24606128646af;hb=refs%2Fchanges%2F82%2F236382%2F1;hp=fea576c00023fcae17096a9fed2bc38457621b96;hpb=0c38ff3ca4f481bbae74283fd00a56fbd938e4b2;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/send-utils.h b/send-utils.h index fea576c..5f5e096 100644 --- a/send-utils.h +++ b/send-utils.h @@ -15,16 +15,30 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 021110-1307, USA. */ -#ifndef SEND_UTILS_H_ -#define SEND_UTILS_H_ +#ifndef __BTRFS_SEND_UTILS_H__ +#define __BTRFS_SEND_UTILS_H__ + +#if BTRFS_FLAT_INCLUDES +#include "kerncompat.h" #include "ctree.h" #include "rbtree.h" +#else +#include +#include +#include +#endif /* BTRFS_FLAT_INCLUDES */ #ifdef __cplusplus extern "C" { #endif +/* + * Compatibility code for kernels < 3.12; the UUID tree is not available there + * and we have to do the slow search. This should be deprecated someday. + */ +#define BTRFS_COMPAT_SEND_NO_UUID_TREE 1 + enum subvol_search_type { subvol_search_by_root_id, subvol_search_by_uuid, @@ -33,10 +47,13 @@ enum subvol_search_type { }; struct subvol_info { +#ifdef BTRFS_COMPAT_SEND_NO_UUID_TREE struct rb_node rb_root_id_node; struct rb_node rb_local_node; struct rb_node rb_received_node; struct rb_node rb_path_node; +#endif + u64 root_id; u8 uuid[BTRFS_UUID_SIZE]; u8 parent_uuid[BTRFS_UUID_SIZE]; @@ -50,27 +67,48 @@ struct subvol_info { }; struct subvol_uuid_search { + int mnt_fd; +#ifdef BTRFS_COMPAT_SEND_NO_UUID_TREE + int uuid_tree_existed; + struct rb_root root_id_subvols; struct rb_root local_subvols; struct rb_root received_subvols; struct rb_root path_subvols; +#endif }; int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s); +void subvol_uuid_search_finit(struct subvol_uuid_search *s); +/* + * Search for a subvolume by given type (received uuid, root id, path), returns + * pointer to newly allocated struct subvol_info or NULL in case it's not found + * or there was another error. This ambiguity of error value is fixed by + * subvol_uuid_search2 that returns a negative errno in case of an error, of a + * valid pointer otherwise. + * + * This function will be deprecated in the future, please consider using v2 in + * new code unless you need to keep backward compatibility with older + * btrfs-progs. + */ struct subvol_info *subvol_uuid_search(struct subvol_uuid_search *s, u64 root_id, const u8 *uuid, u64 transid, const char *path, enum subvol_search_type type); +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); void subvol_uuid_search_add(struct subvol_uuid_search *s, struct subvol_info *si); +int btrfs_subvolid_resolve(int fd, char *path, size_t path_len, u64 subvol_id); - -char *path_cat(const char *p1, const char *p2); -char *path_cat3(const char *p1, const char *p2, const char *p3); +int path_cat_out(char *out, const char *p1, const char *p2); +int path_cat3_out(char *out, const char *p1, const char *p2, const char *p3); #ifdef __cplusplus } #endif -#endif /* SEND_UTILS_H_ */ +#endif