summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-04-29 20:06:20 +0200
committerSven Eden <yamakuzure@gmx.net>2017-06-16 10:12:58 +0200
commitad81cbe3f0c0c9f1e0d3c71210778e4005fe0259 (patch)
tree5d947ace41d2f2f90bd98134d8069470d916b9bf /src
parent2ed028df72f5995acfbeca89db3f056d0e83cac1 (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')
-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 24d109f48..c2c0579c8 100644
--- a/src/basic/copy.c
+++ b/src/basic/copy.c
@@ -385,6 +385,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;