1. 22 9月, 2011 6 次提交
    • E
      snapshot: remove snapshot metadata on transient exit · e485dcc9
      Eric Blake 提交于
      Commit 282fe1f0 documented that transient domains will auto-delete
      any snapshot metadata when the last reference to the domain is
      removed, and that management apps are in charge of grabbing any
      snapshot metadata prior to that point.  However, this was not
      actually implemented for qemu until now.
      
      * src/qemu/qemu_driver.c (qemudDomainCreate)
      (qemuDomainDestroyFlags, qemuDomainSaveInternal)
      (qemudDomainCoreDump, qemuDomainRestoreFlags, qemudDomainDefine)
      (qemuDomainUndefineFlags, qemuDomainMigrateConfirm3)
      (qemuDomainRevertToSnapshot): Clean up snapshot metadata.
      * src/qemu/qemu_migration.c (qemuMigrationPrepareAny)
      (qemuMigrationPerformJob, qemuMigrationPerformPhase)
      (qemuMigrationFinish): Likewise.
      * src/qemu/qemu_process.c (qemuProcessHandleMonitorEOF)
      (qemuProcessReconnect, qemuProcessReconnectHelper)
      (qemuProcessAutoDestroyDom): Likewise.
      e485dcc9
    • E
      snapshot: prepare to remove transient snapshot metadata · bcf974b9
      Eric Blake 提交于
      This patch is mostly code motion - moving some functions out
      of qemu_driver and into qemu_domain so they can be reused by
      multiple qemu_* files (since qemu_driver.h must not grow).
      It also adds a new helper function, qemuDomainRemoveInactive,
      which will be used in the next patch.
      
      * src/qemu/qemu_domain.h (qemuFindQemuImgBinary)
      (qemuDomainSnapshotWriteMetadata, qemuDomainSnapshotForEachQcow2)
      (qemuDomainSnapshotDiscard, qemuDomainSnapshotDiscardAll)
      (qemuDomainRemoveInactive): New prototypes.
      (struct qemu_snap_remove): New struct.
      * src/qemu/qemu_domain.c (qemuDomainRemoveInactive)
      (qemuDomainSnapshotDiscardAllMetadata): New functions.
      (qemuFindQemuImgBinary, qemuDomainSnapshotWriteMetadata)
      (qemuDomainSnapshotForEachQcow2, qemuDomainSnapshotDiscard)
      (qemuDomainSnapshotDiscardAll): Move here...
      * src/qemu/qemu_driver.c (qemuFindQemuImgBinary)
      (qemuDomainSnapshotWriteMetadata, qemuDomainSnapshotForEachQcow2)
      (qemuDomainSnapshotDiscard, qemuDomainSnapshotDiscardAll): ...from
      here.
      (qemuDomainUndefineFlags): Update caller.
      * src/conf/domain_conf.c (virDomainRemoveInactive): Doc fixes.
      bcf974b9
    • E
      snapshot: fix logic bug in qemu undefine · e6966fa7
      Eric Blake 提交于
      Commit 19f8c980 introduced VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA,
      with the intent that omitting the flag makes undefine fail, and
      including the flag deletes metadata.  But it used the wrong logic.
      Also, hoist the transient domain sooner, so that we don't
      accidentally remove metadata of a transient domain.
      
      * src/qemu/qemu_driver.c (qemuDomainUndefineFlags): Check correct
      flag value.
      e6966fa7
    • E
      sanlock: fix memory leak · a55f1892
      Eric Blake 提交于
      Detected by Coverity.  The only way to get to error_unlink is if
      path was successfully assigned, so the if was useless.  Meanwhile,
      there was a return statement that did not free path.
      
      * src/locking/lock_driver_sanlock.c
      (virLockManagerSanlockSetupLockspace): Fix mem-leak, and drop
      useless if.
      a55f1892
    • O
      storage: Wait udev events are handled before removing lvm vol · bc4e5b43
      Osier Yang 提交于
      Related #BZ: https://bugzilla.redhat.com/show_bug.cgi?id=702260.
      
      There are two problems described in the BZ:
      1) "Can't remove open logical volume".
      2) "Unable to deactivate logical volume "foo""
      
      This patch just intends to fix 2), as 1) is expected if the vol
      is still used by something, and you never known if "lvchange -an"
      will fail or not either (sometime, it will succeed, sometimes not).
      We'd better not look for trouble, :-)
      
      For 2), that's caused by race between lvremove and udev event handling,
      the only workable way now is to wait the events handling are finished,
      though it might introduce latencies, as "udevadmin settle" exits
      after *all* events are handled, it's the only way we can fix
      the racing in libvirt layer.
      
      See https://bugzilla.redhat.com/show_bug.cgi?id=570359 for more
      details.
      bc4e5b43
    • A
      qemu: avoid dereferencing a NULL pointer · d93a08eb
      Alex Jia 提交于
      * src/qemu/qemu_process.c: Taking if (qemuDomainObjEndJob(driver, obj) == 0)
        true branch then 'obj' is NULL, virDomainObjIsActive(obj) and
        virDomainObjUnref(obj) will dereference NULL pointer.
      Signed-off-by: NAlex Jia <ajia@redhat.com>
      d93a08eb
  2. 21 9月, 2011 5 次提交
    • J
      qemu: Avoid loop of fake reboots · 3abadf82
      Jiri Denemark 提交于
      Once virDomainReboot is called for a domain, guest OS initiated shutdown
      would always result in reboot instead of shutdown. Only
      virDomainShutdown would actually shutd such domain down. That's because
      we forgot to reset fakeReboot flag once we asked the domain to reboot.
      3abadf82
    • J
      qemu: Fix shutdown regression with buggy qemu · f84aedad
      Jiri Denemark 提交于
      The commit that prevents disk corruption on domain shutdown
      (96fc4784) causes regression with QEMU
      0.14.* and 0.15.* because of a regression bug in QEMU that was fixed
      only recently in QEMU git. The affected versions of QEMU do not quit on
      SIGTERM if started with -no-shutdown, which we use to implement fake
      reboot. Since -no-shutdown tells QEMU not to quit automatically on guest
      shutdown, domains started using the affected QEMU cannot be shutdown
      properly and stay in a paused state.
      
      This patch disables fake reboot feature on such QEMU by not using
      -no-shutdown, which makes shutdown work as expected. However,
      virDomainReboot will not work in this case and it will report "Requested
      operation is not valid: Reboot is not supported with this QEMU binary".
      f84aedad
    • O
      API: prefer to use NULLSTR macro · e531f9a9
      Osier Yang 提交于
      e531f9a9
    • E
      xen: use typical allocations · 7d7a7e29
      Eric Blake 提交于
      The next patch will add a syntax check that flags this usage in xen
      as awkward - while it was valid memory management, it was very hard
      to maintain.  Swapping to a more traditional allocation may be a bit
      slower, but easier to understand.
      
      * src/xen/xend_internal.c (xenDaemonListDomainsOld): Use two-level
      allocation, rather than abusing allocation function.
      (xenDaemonLookupByUUID): Update caller.
      7d7a7e29
    • E
      build: silence warning on 32-bit build · ad4036c3
      Eric Blake 提交于
      gcc warns when building libvirt 0.9.5 on a 32-bit machine:
      
      qemu/qemu_migration.c: In function 'qemuMigrationToFile':
      qemu/qemu_migration.c:2727:38: error: large integer implicitly truncated to unsigned type [-Woverflow]
      
      * src/qemu/qemu_domain.h (QEMU_DOMAIN_FILE_MIG_BANDWIDTH_MAX): Cap
      to long when building for 32-bit platform.
      ad4036c3
  3. 20 9月, 2011 9 次提交
    • D
      Update to require sanlock 1.8 for license compliance · 19ff0ddf
      Daniel P. Berrange 提交于
      Inexplicably the sanlock code all got placed under the GPLv2-only,
      so libvirt's use of sanlock introduces a license incompatibility.
      The sanlock developers have now rearranged the code such that there
      is a 'sanlock_client.so' which is LGPLv2+ while their daemon remains
      GPLv2-only. To use the new client library we need to call the new
      sanlock_init and sanlock_align APIs instead of sanlock_direct_init
      and sanlock_direct_align. These APIs calls are now routed via the
      sanlock daemon, instead of doing direct I/O calls to disk.
      
      For all this we require sanlock >= 1.8
      
      * configure.ac: Check for sanlock_client.so instead of sanlock.so
        and fix various comments
      * libvirt.spec.in: Mandate sanlock >= 1.8
      * src/Makefile.am: Link to -lsanlock_client
      * src/locking/lock_driver_sanlock.c: Use sanlock_init and
        sanlock_align
      19ff0ddf
    • O
      conf: Assign newDef of active domain as persistent conf if it is NULL · b4c3be59
      Osier Yang 提交于
      Libvirt loads the domain conf from status XML if it's running when
      starting up. The problem is there is no record of the original conf.
      (dom->newDef is NULL here).
      
      So libvirt won't be able to restore the domain conf to original one
      when destroying/shutdown. E.g.
      
      1) attach a device without "--persistent"
      2) restart libvirtd
      3) destroy domain
      4) start domain
      
      One will see the the disk still exists.
      
      This patch is to fix the peoblem by assigning persistent domain conf
      to dom->newDef if it's NULL and the domain is running.
      b4c3be59
    • O
      storage: Ensure the device path exists before refreshing disk pool · 891c6fd7
      Osier Yang 提交于
      Doing libvirt_parthelper on an not existed device path will get
      an unfriendly error message. This patch is to prohibit it.
      891c6fd7
    • P
      Remove devname identifier from autogenerated RPC code · 21b5daa1
      Peter Krempa 提交于
      Patch 79cf07af missed one instance of "devname" in source for RPC code
      generator.
      21b5daa1
    • P
      virsh: doc: Fix supported driver types for attach-disk command · 2ad83bf4
      Peter Krempa 提交于
      Virsh man page lists driver types to be used with attach-device
      command, but does not specify that those are usable only with the XEN
      Hypervisor.
      
      This patch adds statement, that those options specified are applicable
      only on the Xen hypervisor and adds option usable with qemu emulator.
      
      This patch also changes type of error returned by QEMU driver if the
      user specifies incompatible driver type from VIR_ERR_INTERNAL_ERROR to
      VIR_ERR_CONFIG_UNSUPPORTED.
      2ad83bf4
    • A
      vmx: avoid memory leak · 6196fd1c
      ajia@redhat.com 提交于
      * src/vmx/vmx.c: fix memory leak, 'def' has a initial value 'NULL', so
        'goto cleanup' is perfected instead of adding a virConfFree before
        'return NULL'.
      Signed-off-by: NAlex Jia <ajia@redhat.com>
      6196fd1c
    • A
      util: avoid memory leak · d02c4a18
      ajia@redhat.com 提交于
      Leak in pciGetVirtualFunctionIndex present since commit 17d64cab.
      
      * src/util/pci.c: fix memory leak.
      Signed-off-by: NAlex Jia <ajia@redhat.com>
      d02c4a18
    • A
      remote: avoid memory leak · 809999b5
      ajia@redhat.com 提交于
      Leak present since introduction of remoteDomainBuildEventGraphics
      in commit 987e31ed.
      
      * src/remote/remote_driver.c: fix memory leak.
      Signed-off-by: NAlex Jia <ajia@redhat.com>
      809999b5
    • A
      qemu: avoid memory leak · db3b32c4
      ajia@redhat.com 提交于
      Leak introduced in commit 036ad505, affects only error case.
      
      * src/qemu/qemu_command.c: fix memory leak.
      Signed-off-by: NAlex Jia <ajia@redhat.com>
      db3b32c4
  4. 17 9月, 2011 4 次提交
    • E
      snapshot: allow disk snapshots of qcow2 disks · 43c2641c
      Eric Blake 提交于
      For all types of disks other than qcow2, we were requesting that
      SELinux labeling visit the new file as if it were qcow2, which
      means labeling would try to find the backing files of an empty file.
      And for a pre-existing qcow2 disk, we were passing NULL, which meant
      that labelling tried to probe the file type (and if probing is
      disabled, per the default qemu.conf, this made snapshots fail).
      What we really want is to make SELinux labeling visit the new
      file as raw; it will later be converted to qcow2 if qemu successfully
      made the snapshot.
      
      * src/qemu/qemu_driver.c
      (qemuDomainSnapshotCreateSingleDiskActive): Force SELinux labeling
      to avoid probe of new file.
      43c2641c
    • E
      snapshot: affect persistent xml after disk snapshot · 2895905a
      Eric Blake 提交于
      For external snapshots to be useful on persistent domains, we must
      alter the persistent definition alongside the running definition.
      Thanks to the possibility of disk hotplug as well as of edits that
      only affect the persistent xml, we can't assume that vm->def and
      vm->newDef have the same disk at the same index, so we can only
      update the persistent copy if the device destination matches up.
      
      * src/qemu/qemu_driver.c (qemuDomainSnapshotCreateDiskActive)
      (qemuDomainSnapshotCreateSingleDiskActive): Also affect newDef, if
      present.
      2895905a
    • D
      Prevent crash from dlclose() of libvirt.so · 8e44e559
      Daniel P. Berrange 提交于
      When libvirt calls virInitialize it creates a thread local
      for the virErrorPtr storage, and registers a callback to
      cleanup memory when a thread exits. When libvirt is dlclose()d
      or otherwise made non-resident, the callback function is
      removed from memory, but the thread local may still exist
      and if a thread later exists, it will invoke the callback
      and SEGV. There may also be other thread locals with callbacks
      pointing to libvirt code, so it is in general never safe to
      unload libvirt.so from memory once initialized.
      
      To allow dlclose() to succeed, but keep libvirt.so resident
      in memory, link with '-z nodelete'. This issue was first
      found with the libvirt CIM provider, but can potentially
      hit many of the dynamic language bindings which all ultimately
      involve dlopen() in some way, either on libvirt.so itself,
      or on the glue code for the binding which in turns links
      to libvirt
      
      * configure.ac, src/Makefile.am: Ensure libvirt.so is linked
        with -z nodelete
      * cfg.mk, .gitignore, tests/Makefile.am, tests/shunloadhelper.c,
        tests/shunloadtest.c: A test case to unload libvirt while
        a thread is still running.
      8e44e559
    • A
      qemu: add return value check · 14c22b3b
      Alex Jia 提交于
      * src/qemu/qemu_command.c: missing return value check.
      Signed-off-by: NAlex Jia <ajia@redhat.com>
      14c22b3b
  5. 16 9月, 2011 12 次提交
    • J
      qemu: Introduce shutdown reason for paused state · d2d67763
      Jiri Denemark 提交于
      Qemu sends STOP event as part of the shutdown process. Detect such STOP
      event and consider shutdown to be reason of emitting such event. That's
      the best we can do until qemu provides us the reason directly in STOP
      event. This allows us to report shutdown reason for paused state so that
      apps can detect domains that failed to finish the shutdown process
      (e.g., because qemu is buggy and doesn't exit on SIGTERM or it is
      blocked in flushing disk buffers).
      d2d67763
    • J
      qemu: Prevent disk corruption on domain shutdown · 96fc4784
      Jiri Denemark 提交于
      Ever since we introduced fake reboot, we call qemuProcessKill as a
      reaction to SHUTDOWN event. Unfortunately, qemu doesn't guarantee it
      flushed all internal buffers before sending SHUTDOWN, in which case
      killing the process forcibly may result in (virtual) disk corruption.
      
      By sending just SIGTERM without SIGKILL we give qemu time to to flush
      all buffers and exit. Once qemu exits, we will see an EOF on monitor
      connection and tear down the domain. In case qemu ignores SIGTERM or
      just hangs there, the process stays running but that's not any different
      from a possible hang anytime during the shutdown process so I think it's
      just fine.
      
      Also qemu (since 0.14 until it's fixed) has a bug in SIGTERM processing
      which causes it not to exit but instead send new SHUTDOWN event and keep
      waiting. I think the best we can do is to ignore duplicate SHUTDOWN
      events to avoid a SHUTDOWN-SIGTERM loop and leave the domain in paused
      state.
      96fc4784
    • J
      qemu: Properly detect crash of a rebooted domain · c2e9fab2
      Jiri Denemark 提交于
      When a domain is rebooted using libvirt API, we use fake reboot
      consisting of shutting down and resetting the domain. Thus we see a
      SHUTDOWN event and set gotShutdown flag. But we never reset it back and
      if the domain crashes after it was rebooted this way, we consider it was
      a normal shutdown and not a crash.
      c2e9fab2
    • J
      qemu: Fix shutoff reason when domain crashes · 3acb664c
      Jiri Denemark 提交于
      Commit 4454a9ef changed shutoff reason
      from VIR_DOMAIN_SHUTOFF_CRASHED to VIR_DOMAIN_SHUTOFF_FAILED in case we
      see an unexpected EOF on monitor connection. But FAILED reason is
      dedicated for domains that fail to start. CRASHED reason is the right
      one to use in this situation.
      3acb664c
    • E
      rpc: convert unknown procedures to VIR_ERR_NO_SUPPORT · 4a075f7e
      Eric Blake 提交于
      Libvirt special-cases a specific VIR_ERR_RPC from the remote driver
      back into VIR_ERR_NO_SUPPORT on the client, so that clients can
      handle missing rpc functions the same whether the hypervisor driver
      is local or remote.  However, commit c1b22644 introduced a regression:
      VIR_FROM_THIS changed from VIR_FROM_REMOTE to VIR_FROM_RPC, so the
      special casing no longer works if the server uses the newer error
      domain.
      
      * src/rpc/virnetclientprogram.c
      (virNetClientProgramDispatchError): Also cater to 0.9.3 and newer.
      4a075f7e
    • S
      Fix buzzilla 738778 · 3f2cb3ab
      Stefan Berger 提交于
      This patch fixes the bug shown in bugzilla 738778. It's not an nwfilter problem but a connection sharing / closure issue.
      
      https://bugzilla.redhat.com/show_bug.cgi?id=738778
      
      Depending on the speed / #CPUs of the machine you are using you may not see this bug all the time.
      3f2cb3ab
    • A
      conf: avoid memory leak on virDomainDefParseXML · b9961102
      Alex Jia 提交于
      * conf/domain_conf.c: allocate memory to def->redirdevs in
        virDomainDefParseXML such as VIR_ALLOC_N(def->redirdevs, n),
        however, virDomainDefFree(def) hasn't released these memory.
      
      * Detected in valgrind run:
      
      ==19820== 209 (16 direct, 193 indirect) bytes in 1 blocks are definitely lost in loss record 25 of 26
      ==19820==    at 0x4A04A28: calloc (vg_replace_malloc.c:467)
      ==19820==    by 0x4A13AF: virAllocN (memory.c:129)
      ==19820==    by 0x4D4A0E: virDomainDefParseXML (domain_conf.c:7258)
      ==19820==    by 0x4D4C93: virDomainDefParseNode (domain_conf.c:7512)
      ==19820==    by 0x4D562F: virDomainDefParse (domain_conf.c:7465)
      ==19820==    by 0x415863: testCompareXMLToXMLFiles (qemuxml2xmltest.c:35)
      ==19820==    by 0x415982: testCompareXMLToXMLHelper (qemuxml2xmltest.c:80)
      ==19820==    by 0x416D31: virtTestRun (testutils.c:140)
      ==19820==    by 0x415604: mymain (qemuxml2xmltest.c:192)
      ==19820==    by 0x416437: virtTestMain (testutils.c:689)
      ==19820==    by 0x3CA7A1ECDC: (below main) (in /lib64/libc-2.12.so)
      ==19820==
      ==19820== LEAK SUMMARY:
      ==19820==    definitely lost: 16 bytes in 1 blocks
      ==19820==    indirectly lost: 193 bytes in 5 blocks
      ==19820==      possibly lost: 0 bytes in 0 blocks
      ==19820==    still reachable: 1,054 bytes in 21 blocks
      
      * How to reproduce?
      % valgrind -v --leak-check=full ./tests/qemuxml2xmltest
      Signed-off-by: NAlex Jia <ajia@redhat.com>
      b9961102
    • P
      build: storage: Macro 'MKFS' is undefined on some platforms. · bc35f12a
      Peter Krempa 提交于
      Mac OS X 10.6. Snow Leopard and probably other do not provide a mkfs
      command to create filesystems. Macro MKFS then remained undefined and
      did not provide any substitute, so that build failed on a missing
      argument.
      bc35f12a
    • P
      build: storage: Conditionaly compiled structure caused build fail on OSX · 1ce3b61f
      Peter Krempa 提交于
      Struct virStoragePoolProbeResult was compiled in conditionaly, but
      virStorageBackendFileSystemProbe used it unconditionaly. This patch
      exempts the struct from conditional include.
      1ce3b61f
    • P
      Avoid using "devname" as an identifier. · 79cf07af
      Peter Krempa 提交于
      /usr/lib/stdlib.h in Mac OS X and probably also in BSD's
      exports this symbol :(
      79cf07af
    • P
      doc: Add statment about permissions needed to do a core dump · 4d4430e1
      Peter Krempa 提交于
      Documentation did not specify, that some permissions are required on
      target path for coredump for the user running the hypervisor.
      
      Diff to v1:
      - reword statements
      4d4430e1
    • E
      qemu_api: doc improvements · 69d8c753
      Eric Blake 提交于
      The new doc text had a few readability issues.  Also, the
      monitor command text copied a bit too much from the attach case.
      
      * src/libvirt-qemu.c (virDomainQemuMonitorCommand)
      (virDomainQemuAttach): Fix typos and grammar.
      69d8c753
  6. 15 9月, 2011 4 次提交
    • J
      Fix build after commit 829bce17 · 1c90642f
      Jim Fehlig 提交于
      Pushing under build-breaker rule.
      1c90642f
    • J
      Use max bandwidth from qemuDomainObjPrivate struct when migrating · 0257ba8f
      Jim Fehlig 提交于
      Adjust qemuMigrationRun() to use migMaxBandwidth in qemuDomainObjPrivate
      structure when setting qemu migration speed.  Caller-specified 'resource'
      parameter overrides migMaxBandwidth.
      0257ba8f
    • J
      Set qemu migration speed unlimited when migrating to file · ef1065cf
      Jim Fehlig 提交于
      The qemu migration speed default is 32MiB/s as defined in migration.c
      
      /* Migration speed throttling */
      static int64_t max_throttle = (32 << 20);
      
      There's no need to throttle migration when targeting a file, so set migration
      speed to unlimited prior to migration, and restore to libvirt default value
      after migration.
      
      Default units is MB for migrate_set_speed monitor command, so
      (INT64_MAX / (1024 * 1024)) is used for unlimited migration speed.
      
      Tested with both json and text monitors.
      ef1065cf
    • J
      Save migration speed in qemuDomainMigrateSetMaxSpeed · 8fc40c51
      Jim Fehlig 提交于
      Now that migration speed is stored in qemuDomainObjPrivate structure,
      save the new value when invoking qemuDomainMigrateSetMaxSpeed().
      
      Allow setting migration speed on inactive domain too.
      8fc40c51