summaryrefslogtreecommitdiff
path: root/src/basic/copy.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-04-29 20:06:20 +0200
committerLennart Poettering <lennart@poettering.net>2016-05-02 11:15:30 +0200
commit9a50e3caab82f8406ecfac6048ac8e2ce98b0ab8 (patch)
tree5e7f5458a2911a7cb13a7e708fa0384b10e27cec /src/basic/copy.c
parenta67d68b84801dccbbc03010c679138bb9e4f91ac (diff)
machined: support non-btrfs file systems with "machinectl clone"
Fall back to a normal copy operation when the backing file system isn't btrfs, and hence doesn't support cheap snapshotting. Of course, this will be slow, but given that the execution is asynchronous now, this should be OK. Fixes: #1308
Diffstat (limited to 'src/basic/copy.c')
-rw-r--r--src/basic/copy.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/basic/copy.c b/src/basic/copy.c
index 79b9a0e1a0..c3586728d0 100644
--- a/src/basic/copy.c
+++ b/src/basic/copy.c
@@ -423,6 +423,21 @@ int copy_directory_fd(int dirfd, const char *to, bool merge) {
return fd_copy_directory(dirfd, NULL, &st, AT_FDCWD, to, st.st_dev, merge);
}
+int copy_directory(const char *from, const char *to, bool merge) {
+ struct stat st;
+
+ assert(from);
+ assert(to);
+
+ if (lstat(from, &st) < 0)
+ return -errno;
+
+ if (!S_ISDIR(st.st_mode))
+ return -ENOTDIR;
+
+ return fd_copy_directory(AT_FDCWD, from, &st, AT_FDCWD, to, st.st_dev, merge);
+}
+
int copy_file_fd(const char *from, int fdt, bool try_reflink) {
_cleanup_close_ int fdf = -1;
int r;