virfile: Handle directories in virFileBindMountDevice()

The @src is not always a file. It may also be a directory (for
instance qemuDomainCreateDeviceRecursive() assumes that) - even
though it doesn't happen usually. Anyway, mount() can mount only
a dir onto a dir and a file onto a file.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Pavel Mores <pmores@redhat.com>
This commit is contained in:
Michal Privoznik 2019-10-04 21:01:49 +02:00
parent 140036237e
commit ed8c503ae8

View File

@ -3743,8 +3743,17 @@ int
virFileBindMountDevice(const char *src, virFileBindMountDevice(const char *src,
const char *dst) const char *dst)
{ {
if (!virFileExists(dst)) {
if (virFileIsDir(src)) {
if (virFileMakePath(dst) < 0) {
virReportSystemError(errno, _("Unable to make dir %s"), dst);
return -1;
}
} else {
if (virFileTouch(dst, 0666) < 0) if (virFileTouch(dst, 0666) < 0)
return -1; return -1;
}
}
if (mount(src, dst, "none", MS_BIND, NULL) < 0) { if (mount(src, dst, "none", MS_BIND, NULL) < 0) {
virReportSystemError(errno, _("Failed to bind %s on to %s"), src, virReportSystemError(errno, _("Failed to bind %s on to %s"), src,