diff options
Diffstat (limited to 'c_src/posix_to_bcachefs.h')
-rw-r--r-- | c_src/posix_to_bcachefs.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/c_src/posix_to_bcachefs.h b/c_src/posix_to_bcachefs.h new file mode 100644 index 00000000..facb75ed --- /dev/null +++ b/c_src/posix_to_bcachefs.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _POSIX_TO_BCACHEFS_H +#define _POSIX_TO_BCACHEFS_H + +/* + * This header exports the functionality needed for copying data from existing + * posix compliant filesystems to bcachefs. There are two use cases: + * 1. Creating a new bcachefs filesystem using `bcachefs format`, we can + * specify a source directory tree which will be copied over the new + * bcachefs filesytem. + * 2. Migrating an existing filesystem in place, with `bcachefs migrate`. + * This will allocate space for the bcachefs metadata, but the actual data + * represented by the extents will not be duplicated. The bcachefs metadata + * will simply point to the existing extents. + * + * To avoid code duplication, `copy_fs` deals with both cases. See the function + * documentation for more details. + */ + +#include "libbcachefs.h" + +enum bch_migrate_type { + BCH_MIGRATE_copy, + BCH_MIGRATE_migrate +}; + +/* + * The migrate action uses all the fields in this struct. + * The copy action only uses the `hardlinks` field. Since `hardlinks` is + * initialized with zeroes, an empty `copy_fs_state` struct can be passed. + */ +struct copy_fs_state { + u64 bcachefs_inum; + dev_t dev; + + GENRADIX(u64) hardlinks; + ranges extents; + enum bch_migrate_type type; +}; + +/* + * The `copy_fs` function is used for both copying a directory tree to a new + * bcachefs filesystem and migrating an existing one, depending on the value + * from the `type` field in `copy_fs_state` struct. + * + * In case of copy, an empty `copy_fs_state` structure is passed to `copy_fs` + * (only the `hardlinks` field is used, and that is initialized with zeroes). + * + * In the migrate case, all the fields from `copy_fs_state` need to be + * initialized (`hardlinks` is initialized with zeroes). + */ +void copy_fs(struct bch_fs *c, int src_fd, const char *src_path, + struct copy_fs_state *s); +#endif /* _LIBBCACHE_H */ |