After this patch, I'd like to only re-introduce the original lxc-clone
bash script's command line options in the new c program, then push to
staging.

Subject: [PATCH 2/3] on copy-clone of btrfs, create a subvolume

so that it can be snapshotted.

Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>
---
 src/lxc/bdev.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 58 insertions(+), 10 deletions(-)

diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c
index 25d2650..68e8d3d 100644
--- a/src/lxc/bdev.c
+++ b/src/lxc/bdev.c
@@ -681,14 +681,23 @@ int btrfs_umount(struct bdev *bdev)
        return umount(bdev->dest);
 }
 
+#define BTRFS_SUBVOL_NAME_MAX 4039
+#define BTRFS_PATH_NAME_MAX 4087
+
+struct btrfs_ioctl_vol_args {
+       signed long long fd;
+       char name[BTRFS_PATH_NAME_MAX + 1];
+};
+
 #define BTRFS_IOCTL_MAGIC 0x94
 #define BTRFS_IOC_SUBVOL_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 24, \
                                    struct btrfs_ioctl_vol_args_v2)
 #define BTRFS_IOC_SNAP_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 23, \
                                    struct btrfs_ioctl_vol_args_v2)
+#define BTRFS_IOC_SUBVOL_CREATE _IOW(BTRFS_IOCTL_MAGIC, 14, \
+                                   struct btrfs_ioctl_vol_args)
 
 #define BTRFS_QGROUP_INHERIT_SET_LIMITS (1ULL << 0)
-#define BTRFS_SUBVOL_NAME_MAX 4039
 
 struct btrfs_ioctl_vol_args_v2 {
        signed long long fd;
@@ -705,6 +714,42 @@ struct btrfs_ioctl_vol_args_v2 {
        char name[BTRFS_SUBVOL_NAME_MAX + 1];
 };
 
+static int btrfs_subvolume_create(const char *path)
+{
+       int ret, fd = -1;
+       struct btrfs_ioctl_vol_args  args;
+       char *p, *newfull = strdup(path);
+
+       if (!newfull) {
+               ERROR("Error: out of memory");
+               return -1;
+       }
+
+       p = rindex(newfull, '/');
+       if (!p) {
+               free(newfull);
+               ERROR("bad path: %s", path);
+               return -1;
+       }
+       *p = '\0';
+
+       if ((fd = open(newfull, O_RDONLY)) < 0) {
+               ERROR("Error opening %s", newfull);
+               free(newfull);
+               return -1;
+       }
+
+       memset(&args, 0, sizeof(args));
+       strncpy(args.name, p+1, BTRFS_SUBVOL_NAME_MAX);
+       args.name[BTRFS_SUBVOL_NAME_MAX-1] = 0;
+       ret = ioctl(fd, BTRFS_IOC_SUBVOL_CREATE, &args);
+       INFO("btrfs: snapshot create ioctl returned %d", ret);
+
+       free(newfull);
+       close(fd);
+       return ret;
+}
+
 static int btrfs_snapshot(const char *orig, const char *new)
 {
        int fd = -1, fddst = -1, ret = -1;
@@ -755,24 +800,27 @@ static int btrfs_clonepaths(struct bdev *orig, struct 
bdev *new, const char *old
                const char *cname, const char *oldpath, const char *lxcpath, 
int snap,
                unsigned long newsize)
 {
-       if (!snap)
-               return dir_clonepaths(orig, new, oldname, cname, oldpath, 
lxcpath,
-                               snap, newsize);
-
-       if (!orig->src || !orig->dest)
+       if (!orig->dest || !orig->src)
                return -1;
 
-       new->dest = dir_new_path(orig->dest, oldname, cname, oldpath, lxcpath);
-       if (!new->dest)
+       if ((new->dest = dir_new_path(orig->dest, oldname, cname, oldpath, 
lxcpath)) == NULL)
                return -1;
 
        if ((new->src = strdup(new->dest)) == NULL)
                return -1;
 
-       if (btrfs_snapshot(orig->dest, new->dest) < 0)
+       if (orig->data && (new->data = strdup(orig->data)) == NULL)
                return -1;
 
-       return 0;
+       if (snap)
+               return btrfs_snapshot(orig->dest, new->dest);
+
+       if (rmdir(new->dest) < 0 && errno != -ENOENT) {
+               SYSERROR("removing %s\n", new->dest);
+               return -1;
+       }
+
+       return btrfs_subvolume_create(new->dest);
 }
 
 struct bdev_ops btrfs_ops = {
-- 
1.8.1.2


------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to