Do not generate security_model when fs driver is anything but 'path'

QEMU does not support security_model for anything but 'path' fs driver type.
Currently in libvirt, when security_model ( accessmode attribute) is not
specified it auto-generates it irrespective of the fs driver type, which
can result in a qemu error for drivers other than path. This patch ensures
that the qemu cmdline is correctly generated by taking into account the
fs driver type.

Signed-off-by: Deepak C Shetty <deepakcs@linux.vnet.ibm.com>
This commit is contained in:
Deepak C Shetty 2012-01-10 18:23:31 +05:30 committed by Eric Blake
parent 52d064f42d
commit 99fbb3866c
4 changed files with 30 additions and 10 deletions

View File

@ -214,6 +214,7 @@ Patches have also been contributed by:
Michael Ellerman <michael@ellerman.id.au> Michael Ellerman <michael@ellerman.id.au>
Rommer <rommer@active.by> Rommer <rommer@active.by>
Yuri Chornoivan <yurchor@ukr.net> Yuri Chornoivan <yurchor@ukr.net>
Deepak C Shetty <deepakcs@linux.vnet.ibm.com>
[....send patches to get your name here....] [....send patches to get your name here....]

View File

@ -1,7 +1,7 @@
/* /*
* qemu_command.c: QEMU command generation * qemu_command.c: QEMU command generation
* *
* Copyright (C) 2006-2011 Red Hat, Inc. * Copyright (C) 2006-2012 Red Hat, Inc.
* Copyright (C) 2006 Daniel P. Berrange * Copyright (C) 2006 Daniel P. Berrange
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@ -2132,12 +2132,23 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
} }
virBufferAdd(&opt, driver, -1); virBufferAdd(&opt, driver, -1);
if (fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_MAPPED) { if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_PATH ||
virBufferAddLit(&opt, ",security_model=mapped"); fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_DEFAULT) {
} else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { if (fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_MAPPED) {
virBufferAddLit(&opt, ",security_model=passthrough"); virBufferAddLit(&opt, ",security_model=mapped");
} else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_SQUASH) { } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) {
virBufferAddLit(&opt, ",security_model=none"); virBufferAddLit(&opt, ",security_model=passthrough");
} else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_SQUASH) {
virBufferAddLit(&opt, ",security_model=none");
}
} else {
/* For other fs drivers, default(passthru) should always
* be supported */
if (fs->accessmode != VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) {
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("only supports passthrough accessmode"));
goto error;
}
} }
virBufferAsprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias); virBufferAsprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
virBufferAsprintf(&opt, ",path=%s", fs->src); virBufferAsprintf(&opt, ",path=%s", fs->src);

View File

@ -4,7 +4,10 @@ unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \
/dev/HostVG/QEMUGuest1 -fsdev local,security_model=passthrough,id=fsdev-fs0,\ /dev/HostVG/QEMUGuest1 -fsdev local,security_model=passthrough,id=fsdev-fs0,\
path=/export/to/guest -device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,\ path=/export/to/guest -device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,\
mount_tag=/import/from/host,bus=pci.0,addr=0x3 \ mount_tag=/import/from/host,bus=pci.0,addr=0x3 \
-fsdev handle,security_model=mapped,id=fsdev-fs1,\ -fsdev local,security_model=mapped,id=fsdev-fs1,\
path=/export/to/guest2 -device virtio-9p-pci,id=fs1,fsdev=fsdev-fs1,\ path=/export/to/guest2 -device virtio-9p-pci,id=fs1,fsdev=fsdev-fs1,\
mount_tag=/import/from/host2,bus=pci.0,addr=0x4 \ mount_tag=/import/from/host2,bus=pci.0,addr=0x4 \
-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -fsdev handle,id=fsdev-fs2,\
path=/export/to/guest3 -device virtio-9p-pci,id=fs2,fsdev=fsdev-fs2,\
mount_tag=/import/from/host3,bus=pci.0,addr=0x5 \
-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6

View File

@ -25,9 +25,14 @@
<target dir='/import/from/host'/> <target dir='/import/from/host'/>
</filesystem> </filesystem>
<filesystem accessmode='mapped'> <filesystem accessmode='mapped'>
<driver type='handle'/> <driver type='path'/>
<source dir='/export/to/guest2'/> <source dir='/export/to/guest2'/>
<target dir='/import/from/host2'/> <target dir='/import/from/host2'/>
</filesystem> </filesystem>
<filesystem>
<driver type='handle'/>
<source dir='/export/to/guest3'/>
<target dir='/import/from/host3'/>
</filesystem>
</devices> </devices>
</domain> </domain>