mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-27 12:28:27 +00:00
Split bdev into modules: lxcdir
The functions - dir_clonepaths(); - dir_create(); - dir_destroy(); - dir_detect(); - dir_mount(); - dir_umount(); move from bdev.c to lxcdir.{c,h}. All functions which previously were static become extern. Adapt Makefile.am to include lxcdir.{c,h}. The structs - struct bdev; /* defined in bdev.h */ - struct bdev_specs; /* defined in lxccontainer.h */ - struct lxc_conf; /* defined conf.h */ are forward declared/put as incomplete types into lxcdir.h as the functions associated with dir need access to it. Signed-off-by: Christian Brauner <christian.brauner@mailbox.org>
This commit is contained in:
parent
00f0a1f896
commit
9d983015ff
@ -9,6 +9,7 @@ noinst_HEADERS = \
|
||||
bdev/bdev.h \
|
||||
bdev/lxcaufs.h \
|
||||
bdev/lxcbtrfs.h \
|
||||
bdev/lxcdir.h \
|
||||
bdev/lxclvm.h \
|
||||
bdev/lxcoverlay.h \
|
||||
bdev/lxcrsync.h \
|
||||
@ -68,6 +69,7 @@ liblxc_so_SOURCES = \
|
||||
bdev/bdev.c bdev/bdev.h \
|
||||
bdev/lxcaufs.c bdev/lxcaufs.h \
|
||||
bdev/lxcbtrfs.c bdev/lxcbtrfs.h \
|
||||
bdev/lxcdir.c bdev/lxcdir.h \
|
||||
bdev/lxclvm.c bdev/lxclvm.h \
|
||||
bdev/lxcoverlay.c bdev/lxcoverlay.h \
|
||||
bdev/lxcrsync.c bdev/lxcrsync.h \
|
||||
|
@ -55,6 +55,7 @@
|
||||
#include "lxc.h"
|
||||
#include "lxcaufs.h"
|
||||
#include "lxcbtrfs.h"
|
||||
#include "lxcdir.h"
|
||||
#include "lxclock.h"
|
||||
#include "lxclvm.h"
|
||||
#include "lxcoverlay.h"
|
||||
@ -102,6 +103,17 @@ static const struct bdev_ops btrfs_ops = {
|
||||
.can_backup = true,
|
||||
};
|
||||
|
||||
static const struct bdev_ops dir_ops = {
|
||||
.detect = &dir_detect,
|
||||
.mount = &dir_mount,
|
||||
.umount = &dir_umount,
|
||||
.clone_paths = &dir_clonepaths,
|
||||
.destroy = &dir_destroy,
|
||||
.create = &dir_create,
|
||||
.can_snapshot = false,
|
||||
.can_backup = true,
|
||||
};
|
||||
|
||||
/* lvm */
|
||||
static const struct bdev_ops lvm_ops = {
|
||||
.detect = &lvm_detect,
|
||||
@ -138,18 +150,6 @@ static const struct bdev_ops zfs_ops = {
|
||||
.can_backup = true,
|
||||
};
|
||||
|
||||
/* functions associated with a dir bdev struct */
|
||||
static int dir_clonepaths(struct bdev *orig, struct bdev *new,
|
||||
const char *oldname, const char *cname,
|
||||
const char *oldpath, const char *lxcpath, int snap,
|
||||
uint64_t newsize, struct lxc_conf *conf);
|
||||
static int dir_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
struct bdev_specs *specs);
|
||||
static int dir_destroy(struct bdev *orig);
|
||||
static int dir_detect(const char *path);
|
||||
static int dir_mount(struct bdev *bdev);
|
||||
static int dir_umount(struct bdev *bdev);
|
||||
|
||||
/* functions associated with a loop bdev struct */
|
||||
static int do_loop_create(const char *path, uint64_t size, const char *fstype);
|
||||
static int loop_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
@ -504,123 +504,6 @@ struct bdev_type {
|
||||
const struct bdev_ops *ops;
|
||||
};
|
||||
|
||||
static int dir_detect(const char *path)
|
||||
{
|
||||
if (strncmp(path, "dir:", 4) == 0)
|
||||
return 1; // take their word for it
|
||||
if (is_dir(path))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// XXXXXXX plain directory bind mount ops
|
||||
//
|
||||
static int dir_mount(struct bdev *bdev)
|
||||
{
|
||||
unsigned long mntflags;
|
||||
char *mntdata;
|
||||
int ret;
|
||||
|
||||
if (strcmp(bdev->type, "dir"))
|
||||
return -22;
|
||||
if (!bdev->src || !bdev->dest)
|
||||
return -22;
|
||||
|
||||
if (parse_mntopts(bdev->mntopts, &mntflags, &mntdata) < 0) {
|
||||
free(mntdata);
|
||||
return -22;
|
||||
}
|
||||
|
||||
ret = mount(bdev->src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata);
|
||||
free(mntdata);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dir_umount(struct bdev *bdev)
|
||||
{
|
||||
if (strcmp(bdev->type, "dir"))
|
||||
return -22;
|
||||
if (!bdev->src || !bdev->dest)
|
||||
return -22;
|
||||
return umount(bdev->dest);
|
||||
}
|
||||
|
||||
/*
|
||||
* for a simple directory bind mount, we substitute the old container
|
||||
* name and paths for the new
|
||||
*/
|
||||
static int dir_clonepaths(struct bdev *orig, struct bdev *new,
|
||||
const char *oldname, const char *cname,
|
||||
const char *oldpath, const char *lxcpath, int snap,
|
||||
uint64_t newsize, struct lxc_conf *conf)
|
||||
{
|
||||
int len, ret;
|
||||
|
||||
if (snap) {
|
||||
ERROR("directories cannot be snapshotted. Try aufs or overlayfs.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!orig->dest || !orig->src)
|
||||
return -1;
|
||||
|
||||
len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 3;
|
||||
new->src = malloc(len);
|
||||
if (!new->src)
|
||||
return -1;
|
||||
ret = snprintf(new->src, len, "%s/%s/rootfs", lxcpath, cname);
|
||||
if (ret < 0 || ret >= len)
|
||||
return -1;
|
||||
if ((new->dest = strdup(new->src)) == NULL)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dir_destroy(struct bdev *orig)
|
||||
{
|
||||
if (lxc_rmdir_onedev(orig->src, NULL) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dir_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
struct bdev_specs *specs)
|
||||
{
|
||||
if (specs && specs->dir)
|
||||
bdev->src = strdup(specs->dir);
|
||||
else
|
||||
bdev->src = strdup(dest);
|
||||
bdev->dest = strdup(dest);
|
||||
if (!bdev->src || !bdev->dest) {
|
||||
ERROR("Out of memory");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (mkdir_p(bdev->src, 0755) < 0) {
|
||||
ERROR("Error creating %s", bdev->src);
|
||||
return -1;
|
||||
}
|
||||
if (mkdir_p(bdev->dest, 0755) < 0) {
|
||||
ERROR("Error creating %s", bdev->dest);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct bdev_ops dir_ops = {
|
||||
.detect = &dir_detect,
|
||||
.mount = &dir_mount,
|
||||
.umount = &dir_umount,
|
||||
.clone_paths = &dir_clonepaths,
|
||||
.destroy = &dir_destroy,
|
||||
.create = &dir_create,
|
||||
.can_snapshot = false,
|
||||
.can_backup = true,
|
||||
};
|
||||
|
||||
// this will return 1 for physical disks, qemu-nbd, loop, etc
|
||||
// right now only lvm is a block device
|
||||
int is_blktype(struct bdev *b)
|
||||
|
134
src/lxc/bdev/lxcdir.c
Normal file
134
src/lxc/bdev/lxcdir.c
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* lxc: linux Container library
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2007, 2008
|
||||
*
|
||||
* Authors:
|
||||
* Daniel Lezcano <daniel.lezcano at free.fr>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "bdev.h"
|
||||
#include "log.h"
|
||||
#include "utils.h"
|
||||
|
||||
lxc_log_define(lxcdir, lxc);
|
||||
|
||||
/*
|
||||
* for a simple directory bind mount, we substitute the old container
|
||||
* name and paths for the new
|
||||
*/
|
||||
int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
|
||||
const char *cname, const char *oldpath, const char *lxcpath,
|
||||
int snap, uint64_t newsize, struct lxc_conf *conf)
|
||||
{
|
||||
int len, ret;
|
||||
|
||||
if (snap) {
|
||||
ERROR("directories cannot be snapshotted. Try aufs or overlayfs.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!orig->dest || !orig->src)
|
||||
return -1;
|
||||
|
||||
len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 3;
|
||||
new->src = malloc(len);
|
||||
if (!new->src)
|
||||
return -1;
|
||||
ret = snprintf(new->src, len, "%s/%s/rootfs", lxcpath, cname);
|
||||
if (ret < 0 || ret >= len)
|
||||
return -1;
|
||||
if ((new->dest = strdup(new->src)) == NULL)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dir_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
struct bdev_specs *specs)
|
||||
{
|
||||
if (specs && specs->dir)
|
||||
bdev->src = strdup(specs->dir);
|
||||
else
|
||||
bdev->src = strdup(dest);
|
||||
bdev->dest = strdup(dest);
|
||||
if (!bdev->src || !bdev->dest) {
|
||||
ERROR("Out of memory");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (mkdir_p(bdev->src, 0755) < 0) {
|
||||
ERROR("Error creating %s", bdev->src);
|
||||
return -1;
|
||||
}
|
||||
if (mkdir_p(bdev->dest, 0755) < 0) {
|
||||
ERROR("Error creating %s", bdev->dest);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dir_destroy(struct bdev *orig)
|
||||
{
|
||||
if (lxc_rmdir_onedev(orig->src, NULL) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dir_detect(const char *path)
|
||||
{
|
||||
if (strncmp(path, "dir:", 4) == 0)
|
||||
return 1; // take their word for it
|
||||
if (is_dir(path))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dir_mount(struct bdev *bdev)
|
||||
{
|
||||
unsigned long mntflags;
|
||||
char *mntdata;
|
||||
int ret;
|
||||
|
||||
if (strcmp(bdev->type, "dir"))
|
||||
return -22;
|
||||
if (!bdev->src || !bdev->dest)
|
||||
return -22;
|
||||
|
||||
if (parse_mntopts(bdev->mntopts, &mntflags, &mntdata) < 0) {
|
||||
free(mntdata);
|
||||
return -22;
|
||||
}
|
||||
|
||||
ret = mount(bdev->src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata);
|
||||
free(mntdata);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int dir_umount(struct bdev *bdev)
|
||||
{
|
||||
if (strcmp(bdev->type, "dir"))
|
||||
return -22;
|
||||
if (!bdev->src || !bdev->dest)
|
||||
return -22;
|
||||
return umount(bdev->dest);
|
||||
}
|
52
src/lxc/bdev/lxcdir.h
Normal file
52
src/lxc/bdev/lxcdir.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* lxc: linux Container library
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2007, 2008
|
||||
*
|
||||
* Authors:
|
||||
* Daniel Lezcano <daniel.lezcano at free.fr>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __LXC_DIR_H
|
||||
#define __LXC_DIR_H
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdint.h>
|
||||
|
||||
/* defined in bdev.h */
|
||||
struct bdev;
|
||||
|
||||
/* defined in lxccontainer.h */
|
||||
struct bdev_specs;
|
||||
|
||||
/* defined conf.h */
|
||||
struct lxc_conf;
|
||||
|
||||
/*
|
||||
* Functions associated with a dir bdev struct.
|
||||
*/
|
||||
int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
|
||||
const char *cname, const char *oldpath, const char *lxcpath,
|
||||
int snap, uint64_t newsize, struct lxc_conf *conf);
|
||||
int dir_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
struct bdev_specs *specs);
|
||||
int dir_destroy(struct bdev *orig);
|
||||
int dir_detect(const char *path);
|
||||
int dir_mount(struct bdev *bdev);
|
||||
int dir_umount(struct bdev *bdev);
|
||||
|
||||
#endif /* __LXC_DIR_H */
|
Loading…
Reference in New Issue
Block a user