X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libbtrfsutil%2Fbtrfsutil.h;h=6d655f498b8b5a761ea5b87a8bdd5dd1e582e12e;hb=43dea2af140fe21111e7ce8491cad2724d73b2d4;hp=1cedc8dec76c19a70d15a5a9f611377b22fa2cf5;hpb=8b87811f945bec2a0681334030ed51af1e4828f6;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/libbtrfsutil/btrfsutil.h b/libbtrfsutil/btrfsutil.h index 1cedc8d..6d655f4 100644 --- a/libbtrfsutil/btrfsutil.h +++ b/libbtrfsutil/btrfsutil.h @@ -20,8 +20,10 @@ #ifndef BTRFS_UTIL_H #define BTRFS_UTIL_H +#include #include #include +#include #define BTRFS_UTIL_VERSION_MAJOR 1 #define BTRFS_UTIL_VERSION_MINOR 0 @@ -168,6 +170,191 @@ enum btrfs_util_error btrfs_util_subvolume_path(const char *path, uint64_t id, enum btrfs_util_error btrfs_util_subvolume_path_fd(int fd, uint64_t id, char **path_ret); +/** + * struct btrfs_util_subvolume_info - Information about a Btrfs subvolume. + */ +struct btrfs_util_subvolume_info { + /** @id: ID of this subvolume, unique across the filesystem. */ + uint64_t id; + + /** + * @parent_id: ID of the subvolume which contains this subvolume, or + * zero for the root subvolume (BTRFS_FS_TREE_OBJECTID) or orphaned + * subvolumes (i.e., subvolumes which have been deleted but not yet + * cleaned up). + */ + uint64_t parent_id; + + /** + * @dir_id: Inode number of the directory containing this subvolume in + * the parent subvolume, or zero for the root subvolume + * (BTRFS_FS_TREE_OBJECTID) or orphaned subvolumes. + */ + uint64_t dir_id; + + /** @flags: On-disk root item flags. */ + uint64_t flags; + + /** @uuid: UUID of this subvolume. */ + uint8_t uuid[16]; + + /** + * @parent_uuid: UUID of the subvolume this subvolume is a snapshot of, + * or all zeroes if this subvolume is not a snapshot. + */ + uint8_t parent_uuid[16]; + + /** + * @received_uuid: UUID of the subvolume this subvolume was received + * from, or all zeroes if this subvolume was not received. Note that + * this field, @stransid, @rtransid, @stime, and @rtime are set manually + * by userspace after a subvolume is received. + */ + uint8_t received_uuid[16]; + + /** @generation: Transaction ID of the subvolume root. */ + uint64_t generation; + + /** + * @ctransid: Transaction ID when an inode in this subvolume was last + * changed. + */ + uint64_t ctransid; + + /** @otransid: Transaction ID when this subvolume was created. */ + uint64_t otransid; + + /** + * @stransid: Transaction ID of the sent subvolume this subvolume was + * received from, or zero if this subvolume was not received. See the + * note on @received_uuid. + */ + uint64_t stransid; + + /** + * @rtransid: Transaction ID when this subvolume was received, or zero + * if this subvolume was not received. See the note on @received_uuid. + */ + uint64_t rtransid; + + /** @ctime: Time when an inode in this subvolume was last changed. */ + struct timespec ctime; + + /** @otime: Time when this subvolume was created. */ + struct timespec otime; + + /** + * @stime: Not well-defined, usually zero unless it was set otherwise. + * See the note on @received_uuid. + */ + struct timespec stime; + + /** + * @rtime: Time when this subvolume was received, or zero if this + * subvolume was not received. See the note on @received_uuid. + */ + struct timespec rtime; +}; + +/** + * btrfs_util_subvolume_info() - Get information about a subvolume. + * @path: Path in a Btrfs filesystem. This may be any path in the filesystem; it + * does not have to refer to a subvolume unless @id is zero. + * @id: ID of subvolume to get information about. If zero is given, the + * subvolume ID of @path is used. + * @subvol: Returned subvolume information. This can be %NULL if you just want + * to check whether the subvolume exists; %BTRFS_UTIL_ERROR_SUBVOLUME_NOT_FOUND + * will be returned if it does not. + * + * This requires appropriate privilege (CAP_SYS_ADMIN). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_subvolume_info(const char *path, uint64_t id, + struct btrfs_util_subvolume_info *subvol); + +/** + * btrfs_util_subvolume_info_fd() - See btrfs_util_subvolume_info(). + */ +enum btrfs_util_error btrfs_util_subvolume_info_fd(int fd, uint64_t id, + struct btrfs_util_subvolume_info *subvol); + +/** + * btrfs_util_get_subvolume_read_only() - Get whether a subvolume is read-only. + * @path: Subvolume path. + * @ret: Returned read-only flag. + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_get_subvolume_read_only(const char *path, + bool *ret); + +/** + * btrfs_util_get_subvolume_read_only_fd() - See + * btrfs_util_get_subvolume_read_only(). + */ +enum btrfs_util_error btrfs_util_get_subvolume_read_only_fd(int fd, bool *ret); + +/** + * btrfs_util_set_subvolume_read_only() - Set whether a subvolume is read-only. + * @path: Subvolume path. + * @read_only: New value of read-only flag. + * + * This requires appropriate privilege (CAP_SYS_ADMIN). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_set_subvolume_read_only(const char *path, + bool read_only); + +/** + * btrfs_util_set_subvolume_read_only_fd() - See + * btrfs_util_set_subvolume_read_only(). + */ +enum btrfs_util_error btrfs_util_set_subvolume_read_only_fd(int fd, + bool read_only); + +/** + * btrfs_util_get_default_subvolume() - Get the default subvolume for a + * filesystem. + * @path: Path on a Btrfs filesystem. + * @id_ret: Returned subvolume ID. + * + * This requires appropriate privilege (CAP_SYS_ADMIN). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_get_default_subvolume(const char *path, + uint64_t *id_ret); + +/** + * btrfs_util_get_default_subvolume_fd() - See + * btrfs_util_get_default_subvolume(). + */ +enum btrfs_util_error btrfs_util_get_default_subvolume_fd(int fd, + uint64_t *id_ret); + +/** + * btrfs_util_set_default_subvolume() - Set the default subvolume for a + * filesystem. + * @path: Path in a Btrfs filesystem. This may be any path in the filesystem; it + * does not have to refer to a subvolume unless @id is zero. + * @id: ID of subvolume to set as the default. If zero is given, the subvolume + * ID of @path is used. + * + * This requires appropriate privilege (CAP_SYS_ADMIN). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_set_default_subvolume(const char *path, + uint64_t id); + +/** + * btrfs_util_set_default_subvolume_fd() - See + * btrfs_util_set_default_subvolume(). + */ +enum btrfs_util_error btrfs_util_set_default_subvolume_fd(int fd, uint64_t id); + struct btrfs_util_qgroup_inherit; /** @@ -205,6 +392,216 @@ enum btrfs_util_error btrfs_util_create_subvolume_fd(int parent_fd, struct btrfs_util_qgroup_inherit *qgroup_inherit); /** + * BTRFS_UTIL_CREATE_SNAPSHOT_RECURSIVE - Also snapshot subvolumes beneath the + * source subvolume onto the same location on the new snapshot. + * + * Note that this is currently implemented in userspace non-atomically. Because + * it modifies the newly-created snapshot, it cannot be combined with + * %BTRFS_UTIL_CREATE_SNAPSHOT_READ_ONLY. It requires appropriate privilege + * (CAP_SYS_ADMIN). + */ +#define BTRFS_UTIL_CREATE_SNAPSHOT_RECURSIVE (1 << 0) +/** + * BTRFS_UTIL_CREATE_SNAPSHOT_READ_ONLY - Create a read-only snapshot. + */ +#define BTRFS_UTIL_CREATE_SNAPSHOT_READ_ONLY (1 << 1) +#define BTRFS_UTIL_CREATE_SNAPSHOT_MASK ((1 << 2) - 1) + +/** + * btrfs_util_create_snapshot() - Create a new snapshot from a source subvolume + * path. + * @source: Path of the existing subvolume to snapshot. + * @path: Where to create the snapshot. + * @flags: Bitmask of BTRFS_UTIL_CREATE_SNAPSHOT_* flags. + * @async_transid: See btrfs_util_create_subvolume(). If + * %BTRFS_UTIL_CREATE_SNAPSHOT_RECURSIVE was in @flags, then this will contain + * the largest transaction ID of all created subvolumes. + * @qgroup_inherit: See btrfs_util_create_subvolume(). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_create_snapshot(const char *source, + const char *path, int flags, + uint64_t *async_transid, + struct btrfs_util_qgroup_inherit *qgroup_inherit); + +/** + * btrfs_util_create_snapshot_fd() - See btrfs_util_create_snapshot(). + */ +enum btrfs_util_error btrfs_util_create_snapshot_fd(int fd, const char *path, + int flags, + uint64_t *async_transid, + struct btrfs_util_qgroup_inherit *qgroup_inherit); + +/** + * btrfs_util_create_snapshot_fd2() - Create a new snapshot from a source + * subvolume file descriptor and a target parent file descriptor and name. + * @fd: File descriptor of the existing subvolume to snapshot. + * @parent_fd: File descriptor of the parent directory where the snapshot should + * be created. + * @name: Name of the snapshot to create. + * @flags: See btrfs_util_create_snapshot(). + * @async_transid: See btrfs_util_create_snapshot(). + * @qgroup_inherit: See btrfs_util_create_snapshot(). + */ +enum btrfs_util_error btrfs_util_create_snapshot_fd2(int fd, int parent_fd, + const char *name, + int flags, + uint64_t *async_transid, + struct btrfs_util_qgroup_inherit *qgroup_inherit); + +/** + * BTRFS_UTIL_DELETE_SUBVOLUME_RECURSIVE - Delete subvolumes beneath the given + * subvolume before attempting to delete the given subvolume. + * + * If this flag is not used, deleting a subvolume with child subvolumes is an + * error. Note that this is currently implemented in userspace non-atomically. + * It requires appropriate privilege (CAP_SYS_ADMIN). + */ +#define BTRFS_UTIL_DELETE_SUBVOLUME_RECURSIVE (1 << 0) +#define BTRFS_UTIL_DELETE_SUBVOLUME_MASK ((1 << 1) - 1) + +/** + * btrfs_util_delete_subvolume() - Delete a subvolume or snapshot. + * @path: Path of the subvolume to delete. + * @flags: Bitmask of BTRFS_UTIL_DELETE_SUBVOLUME_* flags. + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_delete_subvolume(const char *path, int flags); + +/** + * btrfs_util_delete_subvolume_fd() - Delete a subvolume or snapshot given its + * parent and name. + * @parent_fd: File descriptor of the subvolume's parent directory. + * @name: Name of the subvolume. + * @flags: See btrfs_util_delete_subvolume(). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_delete_subvolume_fd(int parent_fd, + const char *name, + int flags); + +struct btrfs_util_subvolume_iterator; + +/** + * BTRFS_UTIL_SUBVOLUME_ITERATOR_POST_ORDER - Iterate post-order. The default + * behavior is pre-order, e.g., foo will be yielded before foo/bar. If this flag + * is specified, foo/bar will be yielded before foo. + */ +#define BTRFS_UTIL_SUBVOLUME_ITERATOR_POST_ORDER (1 << 0) +#define BTRFS_UTIL_SUBVOLUME_ITERATOR_MASK ((1 << 1) - 1) + +/** + * btrfs_util_create_subvolume_iterator() - Create an iterator over subvolumes + * in a Btrfs filesystem. + * @path: Path in a Btrfs filesystem. This may be any path in the filesystem; it + * does not have to refer to a subvolume unless @top is zero. + * @top: List subvolumes beneath (but not including) the subvolume with this ID. + * If zero is given, the subvolume ID of @path is used. To list all subvolumes, + * pass %BTRFS_FS_TREE_OBJECTID (i.e., 5). The returned paths are relative to + * the subvolume with this ID. + * @flags: Bitmask of BTRFS_UTIL_SUBVOLUME_ITERATOR_* flags. + * @ret: Returned iterator. + * + * The returned iterator must be freed with + * btrfs_util_destroy_subvolume_iterator(). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_create_subvolume_iterator(const char *path, + uint64_t top, + int flags, + struct btrfs_util_subvolume_iterator **ret); + +/** + * btrfs_util_create_subvolume_iterator_fd() - See + * btrfs_util_create_subvolume_iterator(). + */ +enum btrfs_util_error btrfs_util_create_subvolume_iterator_fd(int fd, + uint64_t top, + int flags, + struct btrfs_util_subvolume_iterator **ret); + +/** + * btrfs_util_destroy_subvolume_iterator() - Destroy a subvolume iterator + * previously created by btrfs_util_create_subvolume_iterator(). + * @iter: Iterator to destroy. + */ +void btrfs_util_destroy_subvolume_iterator(struct btrfs_util_subvolume_iterator *iter); + +/** + * btrfs_util_subvolume_iterator_fd() - Get the file descriptor associated with + * a subvolume iterator. + * @iter: Iterator to get. + * + * This can be used to get the file descriptor opened by + * btrfs_util_create_subvolume_iterator() in order to use it for other + * functions. + * + * Return: File descriptor. + */ +int btrfs_util_subvolume_iterator_fd(const struct btrfs_util_subvolume_iterator *iter); + +/** + * btrfs_util_subvolume_iterator_next() - Get the next subvolume from a + * subvolume iterator. + * @iter: Subvolume iterator. + * @path_ret: Returned subvolume path, relative to the subvolume ID used to + * create the iterator. May be %NULL. + * Must be freed with free(). + * @id_ret: Returned subvolume ID. May be %NULL. + * + * This requires appropriate privilege (CAP_SYS_ADMIN). + * + * Return: %BTRFS_UTIL_OK on success, %BTRFS_UTIL_ERROR_STOP_ITERATION if there + * are no more subvolumes, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_subvolume_iterator_next(struct btrfs_util_subvolume_iterator *iter, + char **path_ret, + uint64_t *id_ret); + +/** + * btrfs_util_subvolume_iterator_next_info() - Get information about the next + * subvolume for a subvolume iterator. + * @iter: Subvolume iterator. + * @path_ret: See btrfs_util_subvolume_iterator_next(). + * @subvol: Returned subvolume information. + * + * This convenience function basically combines + * btrfs_util_subvolume_iterator_next() and btrfs_util_subvolume_info(). + * + * This requires appropriate privilege (CAP_SYS_ADMIN). + * + * Return: See btrfs_util_subvolume_iterator_next(). + */ +enum btrfs_util_error btrfs_util_subvolume_iterator_next_info(struct btrfs_util_subvolume_iterator *iter, + char **path_ret, + struct btrfs_util_subvolume_info *subvol); + +/** + * btrfs_util_deleted_subvolumes() - Get a list of subvolume which have been + * deleted but not yet cleaned up. + * @path: Path on a Btrfs filesystem. + * @ids: Returned array of subvolume IDs. + * @n: Returned number of IDs in the @ids array. + * + * This requires appropriate privilege (CAP_SYS_ADMIN). + * + * Return: %BTRFS_UTIL_OK on success, non-zero error code on failure. + */ +enum btrfs_util_error btrfs_util_deleted_subvolumes(const char *path, + uint64_t **ids, + size_t *n); + +/** + * btrfs_util_deleted_subvolumes_fd() - See btrfs_util_deleted_subvolumes(). + */ +enum btrfs_util_error btrfs_util_deleted_subvolumes_fd(int fd, uint64_t **ids, + size_t *n); + +/** * btrfs_util_create_qgroup_inherit() - Create a qgroup inheritance specifier * for btrfs_util_create_subvolume() or btrfs_util_create_snapshot(). * @flags: Must be zero.