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:
Gao feng 2013-07-09 11:16:20 +01:00 committed by Daniel P. Berrange
parent 726229ef33
commit 43af7332c0
2 changed files with 42 additions and 14 deletions

View File

@ -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;
} }

View File

@ -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)",