mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 11:31:16 +00:00
virfile: Introduce virFileSetupDev
This part of code that LXC currently uses will be reused so move to a generic function. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
48a12d3b25
commit
1a7c9a5d50
@ -1556,6 +1556,7 @@ virDirRead;
|
|||||||
virFileAbsPath;
|
virFileAbsPath;
|
||||||
virFileAccessibleAs;
|
virFileAccessibleAs;
|
||||||
virFileActivateDirOverride;
|
virFileActivateDirOverride;
|
||||||
|
virFileBindMountDevice;
|
||||||
virFileBuildPath;
|
virFileBuildPath;
|
||||||
virFileClose;
|
virFileClose;
|
||||||
virFileDeleteTree;
|
virFileDeleteTree;
|
||||||
@ -1603,6 +1604,7 @@ virFileResolveLink;
|
|||||||
virFileRewrite;
|
virFileRewrite;
|
||||||
virFileRewriteStr;
|
virFileRewriteStr;
|
||||||
virFileSanitizePath;
|
virFileSanitizePath;
|
||||||
|
virFileSetupDev;
|
||||||
virFileSkipRoot;
|
virFileSkipRoot;
|
||||||
virFileStripSuffix;
|
virFileStripSuffix;
|
||||||
virFileTouch;
|
virFileTouch;
|
||||||
|
@ -1112,20 +1112,6 @@ static int lxcContainerMountFSDevPTS(virDomainDefPtr def,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lxcContainerBindMountDevice(const char *src, const char *dst)
|
|
||||||
{
|
|
||||||
if (virFileTouch(dst, 0666) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (mount(src, dst, "none", MS_BIND, NULL) < 0) {
|
|
||||||
virReportSystemError(errno, _("Failed to bind %s on to %s"), src,
|
|
||||||
dst);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lxcContainerSetupDevices(char **ttyPaths, size_t nttyPaths)
|
static int lxcContainerSetupDevices(char **ttyPaths, size_t nttyPaths)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -1149,7 +1135,7 @@ static int lxcContainerSetupDevices(char **ttyPaths, size_t nttyPaths)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We have private devpts capability, so bind that */
|
/* We have private devpts capability, so bind that */
|
||||||
if (lxcContainerBindMountDevice("/dev/pts/ptmx", "/dev/ptmx") < 0)
|
if (virFileBindMountDevice("/dev/pts/ptmx", "/dev/ptmx") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < nttyPaths; i++) {
|
for (i = 0; i < nttyPaths; i++) {
|
||||||
@ -1157,7 +1143,7 @@ static int lxcContainerSetupDevices(char **ttyPaths, size_t nttyPaths)
|
|||||||
if (virAsprintf(&tty, "/dev/tty%zu", i+1) < 0)
|
if (virAsprintf(&tty, "/dev/tty%zu", i+1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (lxcContainerBindMountDevice(ttyPaths[i], tty) < 0) {
|
if (virFileBindMountDevice(ttyPaths[i], tty) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
VIR_FREE(tty);
|
VIR_FREE(tty);
|
||||||
}
|
}
|
||||||
@ -1165,7 +1151,7 @@ static int lxcContainerSetupDevices(char **ttyPaths, size_t nttyPaths)
|
|||||||
VIR_FREE(tty);
|
VIR_FREE(tty);
|
||||||
|
|
||||||
if (i == 0 &&
|
if (i == 0 &&
|
||||||
lxcContainerBindMountDevice(ttyPaths[i], "/dev/console") < 0)
|
virFileBindMountDevice(ttyPaths[i], "/dev/console") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1457,12 +1457,6 @@ static int virLXCControllerSetupDev(virLXCControllerPtr ctrl)
|
|||||||
LXC_STATE_DIR, ctrl->def->name) < 0)
|
LXC_STATE_DIR, ctrl->def->name) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virFileMakePath(dev) < 0) {
|
|
||||||
virReportSystemError(errno,
|
|
||||||
_("Failed to make path %s"), dev);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tmpfs is limited to 64kb, since we only have device nodes in there
|
* tmpfs is limited to 64kb, since we only have device nodes in there
|
||||||
* and don't want to DOS the entire OS RAM usage
|
* and don't want to DOS the entire OS RAM usage
|
||||||
@ -1472,14 +1466,8 @@ static int virLXCControllerSetupDev(virLXCControllerPtr ctrl)
|
|||||||
"mode=755,size=65536%s", mount_options) < 0)
|
"mode=755,size=65536%s", mount_options) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
VIR_DEBUG("Mount devfs on %s type=tmpfs flags=%x, opts=%s",
|
if (virFileSetupDev(dev, opts) < 0)
|
||||||
dev, MS_NOSUID, opts);
|
|
||||||
if (mount("devfs", dev, "tmpfs", MS_NOSUID, opts) < 0) {
|
|
||||||
virReportSystemError(errno,
|
|
||||||
_("Failed to mount devfs on %s type %s (%s)"),
|
|
||||||
dev, "tmpfs", opts);
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
if (lxcContainerChown(ctrl->def, dev) < 0)
|
if (lxcContainerChown(ctrl->def, dev) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -32,6 +32,9 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
#if defined(HAVE_SYS_MOUNT_H)
|
||||||
|
# include <sys/mount.h>
|
||||||
|
#endif
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <dirname.h>
|
#include <dirname.h>
|
||||||
@ -3557,3 +3560,72 @@ int virFileIsSharedFS(const char *path)
|
|||||||
VIR_FILE_SHFS_SMB |
|
VIR_FILE_SHFS_SMB |
|
||||||
VIR_FILE_SHFS_CIFS);
|
VIR_FILE_SHFS_CIFS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(HAVE_SYS_MOUNT_H)
|
||||||
|
int
|
||||||
|
virFileSetupDev(const char *path,
|
||||||
|
const char *mount_options)
|
||||||
|
{
|
||||||
|
const unsigned long mount_flags = MS_NOSUID;
|
||||||
|
const char *mount_fs = "tmpfs";
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (virFileMakePath(path) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Failed to make path %s"), path);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG("Mount devfs on %s type=tmpfs flags=%lx, opts=%s",
|
||||||
|
path, mount_flags, mount_options);
|
||||||
|
if (mount("devfs", path, mount_fs, mount_flags, mount_options) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Failed to mount devfs on %s type %s (%s)"),
|
||||||
|
path, mount_fs, mount_options);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virFileBindMountDevice(const char *src,
|
||||||
|
const char *dst)
|
||||||
|
{
|
||||||
|
if (virFileTouch(dst, 0666) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (mount(src, dst, "none", MS_BIND, NULL) < 0) {
|
||||||
|
virReportSystemError(errno, _("Failed to bind %s on to %s"), src,
|
||||||
|
dst);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !defined(HAVE_SYS_MOUNT_H) */
|
||||||
|
|
||||||
|
int
|
||||||
|
virFileSetupDev(const char *path ATTRIBUTE_UNUSED,
|
||||||
|
const char *mount_options ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virReportSystemError(ENOSYS, "%s",
|
||||||
|
_("mount is not supported on this platform."));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virFileBindMountDevice(const char *src ATTRIBUTE_UNUSED,
|
||||||
|
const char *dst ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virReportSystemError(ENOSYS, "%s",
|
||||||
|
_("mount is not supported on this platform."));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif /* !defined(HAVE_SYS_MOUNT_H) */
|
||||||
|
@ -311,4 +311,10 @@ int virFileGetHugepageSize(const char *path,
|
|||||||
unsigned long long *size);
|
unsigned long long *size);
|
||||||
int virFileFindHugeTLBFS(virHugeTLBFSPtr *ret_fs,
|
int virFileFindHugeTLBFS(virHugeTLBFSPtr *ret_fs,
|
||||||
size_t *ret_nfs);
|
size_t *ret_nfs);
|
||||||
|
|
||||||
|
int virFileSetupDev(const char *path,
|
||||||
|
const char *mount_options);
|
||||||
|
|
||||||
|
int virFileBindMountDevice(const char *src,
|
||||||
|
const char *dst);
|
||||||
#endif /* __VIR_FILE_H */
|
#endif /* __VIR_FILE_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user