mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-10 23:07:44 +00:00
LXC: hostdev: create parent directory for hostdev
Create parent directroy for hostdev automatically when we
start a lxc domain or attach a hostdev to a lxc domain.
Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
(cherry picked from commit 468ee0bc4d
)
This commit is contained in:
parent
726229ef33
commit
43af7332c0
@ -1577,14 +1577,15 @@ static int lxcContainerSetupHostdevCapsStorage(virDomainDefPtr vmDef ATTRIBUTE_U
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
mode_t mode;
|
mode_t mode;
|
||||||
|
char *dev = def->source.caps.u.storage.block;
|
||||||
|
|
||||||
if (def->source.caps.u.storage.block == NULL) {
|
if (dev == NULL) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("Missing storage host block path"));
|
_("Missing storage host block path"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virAsprintf(&src, "/.oldroot/%s", def->source.caps.u.storage.block) < 0) {
|
if (virAsprintf(&src, "/.oldroot/%s", dev) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1599,19 +1600,25 @@ static int lxcContainerSetupHostdevCapsStorage(virDomainDefPtr vmDef ATTRIBUTE_U
|
|||||||
if (!S_ISBLK(sb.st_mode)) {
|
if (!S_ISBLK(sb.st_mode)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("Storage source %s must be a block device"),
|
_("Storage source %s must be a block device"),
|
||||||
def->source.caps.u.storage.block);
|
dev);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lxcContainerSetupHostdevCapsMakePath(dev) < 0) {
|
||||||
|
virReportError(errno,
|
||||||
|
_("Failed to create directory for device %s"),
|
||||||
|
dev);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
mode = 0700 | S_IFBLK;
|
mode = 0700 | S_IFBLK;
|
||||||
|
|
||||||
VIR_DEBUG("Creating dev %s (%d,%d)",
|
VIR_DEBUG("Creating dev %s (%d,%d)", dev,
|
||||||
def->source.caps.u.storage.block,
|
|
||||||
major(sb.st_rdev), minor(sb.st_rdev));
|
major(sb.st_rdev), minor(sb.st_rdev));
|
||||||
if (mknod(def->source.caps.u.storage.block, mode, sb.st_rdev) < 0) {
|
if (mknod(dev, mode, sb.st_rdev) < 0) {
|
||||||
virReportSystemError(errno,
|
virReportSystemError(errno,
|
||||||
_("Unable to create device %s"),
|
_("Unable to create device %s"),
|
||||||
def->source.caps.u.storage.block);
|
dev);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1634,14 +1641,15 @@ static int lxcContainerSetupHostdevCapsMisc(virDomainDefPtr vmDef ATTRIBUTE_UNUS
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
mode_t mode;
|
mode_t mode;
|
||||||
|
char *dev = def->source.caps.u.misc.chardev;
|
||||||
|
|
||||||
if (def->source.caps.u.misc.chardev == NULL) {
|
if (dev == NULL) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("Missing storage host block path"));
|
_("Missing storage host block path"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virAsprintf(&src, "/.oldroot/%s", def->source.caps.u.misc.chardev) < 0) {
|
if (virAsprintf(&src, "/.oldroot/%s", dev) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1656,19 +1664,25 @@ static int lxcContainerSetupHostdevCapsMisc(virDomainDefPtr vmDef ATTRIBUTE_UNUS
|
|||||||
if (!S_ISCHR(sb.st_mode)) {
|
if (!S_ISCHR(sb.st_mode)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("Storage source %s must be a character device"),
|
_("Storage source %s must be a character device"),
|
||||||
def->source.caps.u.misc.chardev);
|
dev);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lxcContainerSetupHostdevCapsMakePath(dev) < 0) {
|
||||||
|
virReportError(errno,
|
||||||
|
_("Failed to create directory for device %s"),
|
||||||
|
dev);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
mode = 0700 | S_IFCHR;
|
mode = 0700 | S_IFCHR;
|
||||||
|
|
||||||
VIR_DEBUG("Creating dev %s (%d,%d)",
|
VIR_DEBUG("Creating dev %s (%d,%d)", dev,
|
||||||
def->source.caps.u.misc.chardev,
|
|
||||||
major(sb.st_rdev), minor(sb.st_rdev));
|
major(sb.st_rdev), minor(sb.st_rdev));
|
||||||
if (mknod(def->source.caps.u.misc.chardev, mode, sb.st_rdev) < 0) {
|
if (mknod(dev, mode, sb.st_rdev) < 0) {
|
||||||
virReportSystemError(errno,
|
virReportSystemError(errno,
|
||||||
_("Unable to create device %s"),
|
_("Unable to create device %s"),
|
||||||
def->source.caps.u.misc.chardev);
|
dev);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3544,6 +3544,13 @@ lxcDomainAttachDeviceHostdevStorageLive(virLXCDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lxcContainerSetupHostdevCapsMakePath(dst) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Unable to create directroy for device %s"),
|
||||||
|
dst);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
mode = 0700 | S_IFBLK;
|
mode = 0700 | S_IFBLK;
|
||||||
|
|
||||||
VIR_DEBUG("Creating dev %s (%d,%d)",
|
VIR_DEBUG("Creating dev %s (%d,%d)",
|
||||||
@ -3648,6 +3655,13 @@ lxcDomainAttachDeviceHostdevMiscLive(virLXCDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lxcContainerSetupHostdevCapsMakePath(dst) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Unable to create directroy for device %s"),
|
||||||
|
dst);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
mode = 0700 | S_IFCHR;
|
mode = 0700 | S_IFCHR;
|
||||||
|
|
||||||
VIR_DEBUG("Creating dev %s (%d,%d)",
|
VIR_DEBUG("Creating dev %s (%d,%d)",
|
||||||
|
Loading…
Reference in New Issue
Block a user