1. 26 6月, 2014 1 次提交
  2. 11 6月, 2014 1 次提交
    • E
      storage: fix memory leak with encrypted images · c9606d3d
      Eric Blake 提交于
      Jim Fehlig reported a regression found by libvirt-TCK tests:
      
      > ~ # perl /usr/share/libvirt-tck/tests/qemu/100-disk-encryption.t
      ...
      > ok 4 - defined persistent domain config
      > # Starting inactive domain config
      > libvirt error code: 1, message: internal error: unable to execute QEMU command
      > 'cont': 'drive-ide0-0-1'
      > (/var/cache/libvirt-tck/300-disk-encryption/demo.qcow2) is encrypted
      
      Commit 2279d560 converted a boolean into a pointer with the intent of
      transferring that pointer out of a temporary object into the caller's
      data structure.  The temporary structure meant that meta->encryption
      was always NULL on entry, so we could get away with blindly allocating
      the pointer when the header said so.  But later, commit 8823272d
      tweaked things to do backing chain detection in-place, rather than via
      a temporary object; this has the net result that meta->encryption can
      be non-NULL on entry.  Not only did this turn the latent behavior into
      a memory leak, it is also a behavior regression: blindly allocating a
      new pointer wipes out what secrets we already knew about the chain,
      making it impossible to restart the domain.
      
      Of course, no one in their right mind should be relying on qcow2
      encryption - it is fundamentally flawed.  And sadly, the TCK tests
      don't get run often enough, and this shows that our virstoragetest
      does not exercise encrypted images at all.  Otherwise, we could
      have avoided a release containing this regression.
      
      * src/util/virstoragefile.c (virStorageFileGetMetadataInternal):
      Don't nuke an already-existing encryption.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      (cherry picked from commit 1c7eb95c)
      c9606d3d
  3. 06 6月, 2014 1 次提交
  4. 02 6月, 2014 2 次提交
  5. 01 6月, 2014 1 次提交
    • L
      util: fix DST end date in virtimetest timezones · 83c41ceb
      Laine Stump 提交于
      Reported by: Roman Bogorodskiy <bogorodskiy@gmail.com>
      
      Some of the tests for virTimeLocalOffsetFromUTC set an imaginary
      timezone that attempts to force dyalight savings time active all the
      time by setting a start date of 0/00:00:00 and end date of
      366/23:59:59. Since the day is 0-based, 366 really means "day 367"
      which will never occur - this was an attempt to eliminate problems
      with DST not being active in some cases right around midnight on
      January 1. Even though it didn't completely solve the problem, it
      didn't seem to cause harm so it was left in the test timezones.
      
      Although Linux glibc doesn't mind having a DST end date of 366,
      FreeBSD refuses to use such timezones, so the tests fail. This patch
      changes the 366 to 365.
      
      This may or may not cause failure of the remaining DST tests around
      midnight Jan 1. If so, we will need to disable those tests at year's
      end too.
      83c41ceb
  6. 31 5月, 2014 1 次提交
    • E
      build: avoid compiler warning on 32-bit platform · c7ca02e6
      Eric Blake 提交于
      On a 32-bit platform:
      
      virstringtest.c: In function 'mymain':
      virstringtest.c:673: warning: this decimal constant is unsigned only in ISO C90
      
      I already had a comment in the file about the 64-bit counterpart;
      the easiest fix was to make both sites use the standardized macro
      that is guaranteed to work.
      
      * tests/virstringtest.c (mymain): Minimum signed integers are a pain.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      c7ca02e6
  7. 29 5月, 2014 13 次提交
    • P
      qemu: snapshot: Improve detection of mixed snapshots · 23f38f88
      Peter Krempa 提交于
      Currently we don't support mixed (external + internal) snapshots. The
      code detecting the snapshot type didn't make sure that the memory image
      was consistent with the snapshot type leading into strange error
      message:
      
       $ virsh snapshot-create-as --domain VM --diskspec vda,snapshot=internal --memspec snapshot=external,file=/tmp/blah
       error: internal error: unexpected code path
      
      Fix the mixed detection code to detect this kind of mistake:
      
       $ virsh snapshot-create-as --domain VM --diskspec vda,snapshot=internal --memspec snapshot=external,file=/tmp/blah
       error: unsupported configuration: mixing internal and external targets for a snapshot is not yet supported
      23f38f88
    • P
      qemu: snapshot: Reject internal active snapshot without memory state · d2e668e5
      Peter Krempa 提交于
      A internal snapshot of a active VM with the memory snapshot disabled
      explicitly would actually still take the memory snapshot. Reject it
      explicitly.
      
      Before:
       $ virsh snapshot-create-as --domain VM --diskspec vda,snapshot=internal --memspec snapshot=no
       Domain snapshot 1401353155 created
      
      After:
       $ virsh snapshot-create-as --domain VM --diskspec vda,snapshot=internal --memspec snapshot=no
       error: Operation not supported: internal snapshot of a running VM must include the memory state
      
      Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1083345
      d2e668e5
    • P
      util: storage: Fix crash of libvirtd on network backed guest block-pull · 4a051b80
      Peter Krempa 提交于
      For guests backed by gluster volumes (or other network storage) we don't
      fill the backing chain (see qemuDomainDetermineDiskChain). This leaves
      the "relPath" field of the top image NULL. This causes a crash in
      virStorageFileChainLookup() when looking up a backing element for such a
      disk.
      
      Since I'm working on adding support for network storage and one of the
      steps will make the "relPath" field optional let's use STREQ_NULLABLE
      instead of STREQ in virStorageFileChainLookup() to avoid the problem.
      4a051b80
    • L
      util: fix virTimeLocalOffsetFromUTC DST processing · 26d43113
      Laine Stump 提交于
      The original version of virTimeLocalOffsetFromUTC() would fail for
      certain times of the day if daylight savings time was active. This
      could most easily be seen by uncommenting the TEST_LOCALOFFSET() cases
      that include a DST setting.
      
      After a lot of experimenting, I found that the way to solve it in
      almost all test cases is to set tm_isdst = -1 in the struct tm prior
      to calling mktime(). Once this is done, the correct offset is returned
      for all test cases at all times except the two hours just after
      00:00:00 Jan 1 UTC - during that time, any timezone that is *behind*
      UTC, and that is supposed to always be in DST will not have DST
      accounted for in its offset.
      
      I believe that the code of virTimeLocalOffsetFromUTC() actually is
      correct for all cases, but the problem still encountered is due to our
      inability to come up with a TZ string that properly forces DST to
      *always* be active. Since a modfication of the (currently fixed)
      expected result data to account for this would necessarily use the
      same functions that we're trying to test, I've instead just made the
      test program conditionally bypass the problematic cases if the current
      date is either December 31 or January 1. This way we get maximum
      testing during 363 days of the year, but don't get false failures on
      Dec 31 and Jan 1.
      26d43113
    • E
      virsh: fix typos in virsh man page · be673413
      Eric Blake 提交于
      * tools/virsh.pod (attach-disk): Drop duplicate --config, fix typo
      in --sourcetype.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      be673413
    • E
      maint: fix typo in previous patch · 5fa10f32
      Eric Blake 提交于
      Use correct variable name.
      
      * m4/virt-selinux.m4: Fix one last variable name.
      5fa10f32
    • J
      maint: cleanup detection of const'ness of selinux ctx · b109c097
      Jim Fehlig 提交于
      Commit 292d3f2d fixed the build with libselinux 2.3, but missed
      some suggestions by eblake
      
      https://www.redhat.com/archives/libvir-list/2014-May/msg00977.html
      
      This patch changes the macro introduced in 292d3f2d to either be
      empty in the case of newer libselinux, or contain 'const' in the
      case of older libselinux.  The macro is then used directly in
      tests/securityselinuxhelper.c.
      b109c097
    • C
      build: fix build with libselinux 2.3 · 292d3f2d
      Cédric Bosdonnat 提交于
      Several function signatures changed in libselinux 2.3, now taking
      a 'const char *' instead of 'security_context_t'.  The latter is
      defined in selinux/selinux.h as
      
        typedef char *security_context_t;
      Signed-off-by: NEric Blake <eblake@redhat.com>
      292d3f2d
    • P
      qemu: managedsave: Don't spam logs with warnings about corrupted image · 0b317d61
      Peter Krempa 提交于
      Even successful start of a VM from a managed save image would spam the
      logs with the following message:
      
      Unable to restore from managed state [path]. Maybe the file is
      corrupted?
      
      Re-arrange the logic to output the warning only when the image is
      corrupted.
      
      The flaw was introduced in commit cfc28c66.
      0b317d61
    • P
      utils: storage: Canonicalize paths only for local filesystems · 92dc2dab
      Peter Krempa 提交于
      Now that virStorageFileGetMetadataFromBuf is used only for remote
      filesystems, don't canonicalize the path in it.
      92dc2dab
    • P
      storage: fs: Drop-in replace use of virStorageFileGetMetadataFromBuf · 34d86185
      Peter Krempa 提交于
      Use virStorageFileGetMetadataFromFD instead in
      virStorageBackendProbeTarget as it now returns all required data and the
      storage file is already open in a filedescriptor.
      
      Also fix improper error code being returned when virFileReadHeaderFD
      would fail as virStorageBackendUpdateVolTargetInfoFD would set the
      return code to 0.
      34d86185
    • P
      storage: Return backing format from virStorageFileGetMetadataFromFD · 5a1cf6bd
      Peter Krempa 提交于
      Add argument to return backing file format of a file probed by
      virStorageFileGetMetadataFromFD so that it can be used in place of
      virStorageFileGetMetadataFromBuf.
      5a1cf6bd
    • E
      qemu: reject rather than hang on blockcommit of active layer · e6bcbcd3
      Eric Blake 提交于
      qemu 2.0 added the ability to commit the active layer, but slightly
      differently than what libvirt had been anticipating in its
      implementation of the virDomainBlockCommit call.  As a result, if
      you attempt to do a 'virsh blockcommit $dom vda', qemu gets into a
      state where it is waiting on libvirt to end the job, while libvirt
      is waiting on qemu to end the job, and the guest is effectively
      hung with regards to further commands for that block device.
      
      I have patches coming down the pipeline that will add full support
      for blockcommit of the active layer when coupled with qemu 2.0 or
      later; but they depend on Peter's improvements to block job handling
      and form enough of a new feature that they are not ready for
      inclusion in the 1.2.5 release.  So for now, just reject the
      attempt, rather than letting the user get stuck.  This is no worse
      than the behavior of qemu 1.7 rejecting the job.
      
      * src/qemu/qemu_driver.c (qemuDomainBlockCommit): Reject active
      commit.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      e6bcbcd3
  8. 28 5月, 2014 1 次提交
  9. 27 5月, 2014 2 次提交
  10. 26 5月, 2014 6 次提交
    • D
      Fix an extra ' in a translated string · f07d24a6
      Daniel Veillard 提交于
      Raised by ukrainian translator Yuri Chornoivan
      https://fedora.transifex.com/projects/p/libvirt/translate/#uk/strings/25483059
      f07d24a6
    • J
      Clean up chardev sockets on QEMU shutdown · 205010c4
      Ján Tomko 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1088787
      
      Clean up unix socket files for chardevs using mode='bind',
      like we clean up the monitor socket.
      They are created by QEMU on startup and not really useful
      after shutting it down.
      205010c4
    • L
      qemu: fix <clock offset='variable' basis='localtime'/> · cde8ca2d
      Laine Stump 提交于
      For a clock element as above, libvirt simply converts current system
      time with localtime_r(), then starts qemu with a time string that
      doesn't contain any timezone information. So, from qemu's point of
      view, the -rtc string it gets for:
      
         <clock offset='variable' basis='utc' adjustment='10800'/>
      
      is identical to the -rtc string it gets for:
      
         <clock offset='variable' basis='localtime' adjustment='0'/>
      
      (assuming the host is in a timezone that is 10800 seconds ahead of
      UTC, as is the case on the machine where this message is being
      written).
      
      Since the commandlines are identical, qemu will behave identically
      after this point in either case.
      
      There are two problems in the case of basis='localtime' though:
      
      Problem 1) If the guest modifies its RTC, for example to add 20
      seconds, the RTC_CHANGE event from qemu will then contain offset:20 in
      both cases. But libvirt will have saved the original adjustment into
      adjustment0, and will add that value onto the offset in the
      event. This means that in the case of basis=;utc', it will properly
      emit an event with offset:10820, but in the case of basis='localtime'
      the event will contain offset:20, which is *not* the new offset of the
      RTC from UTC (as the event it documented to provide).
      
      Problem 2) If the guest is migrated to another host that is in a
      different timezone, or if it is migrated or saved/restored after the
      DST status has changed from what it was when the guest was originally
      started, the newly restarted guest will have a different RTC (since it
      will be based on the new localtime, which could have shifted by
      several hours).
      
      The solution to both of these problems is simple - rather than
      maintaining the original adjustment value along with
      "basis='localtime'" in the domain status, when the domain is started
      we convert the adjustment offset to one relative to UTC, and set the
      status to "basis='utc'". Thus, whatever the RTC offset was from UTC
      when it was initially started, that offset will be maintained when
      migrating across timezones and DST settings, and the RTC_CHANGE events
      will automatically contain the proper offset (which should by
      definition always be relative to UTC).
      
      This fixes a problem that was implied but not openly stated in:
      
        https://bugzilla.redhat.com/show_bug.cgi?id=964177
      cde8ca2d
    • L
      qemu: fix RTC_CHANGE event for <clock offset='variable' basis='utc'/> · b62d67da
      Laine Stump 提交于
      commit e31b5cf3 attempted to fix libvirt's
      VIR_DOMAIN_EVENT_ID_RTC_CHANGE, which is documentated to always
      provide the new offset of the domain's real time clock from UTC. The
      problem was that, in the case that qemu is provided with an "-rtc
      base=x" where x is an absolute time (rather than "utc" or
      "localtime"), the offset sent by qemu's RTC_CHANGE event is *not* the
      new offset from UTC, but rather is the sum of all changes to the
      domain's RTC since it was started with base=x.
      
      So, despite what was said in commit e31b5cf3, if we assume that
      the original value stored in "adjustment" was the offset from UTC at
      the time the domain was started, we can always determine the current
      offset from UTC by simply adding the most recent (i.e. current) offset
      from qemu to that original adjustment.
      
      This patch accomplishes that by storing the initial adjustment in the
      domain's status as "adjustment0". Each time a new RTC_CHANGE event is
      received from qemu, we simply add adjustment0 to the value sent by
      qemu, store that as the new adjustment, and forward that value on to
      any event handler.
      
      This patch (*not* e31b5cf3, which should be reverted prior to
      applying this patch) fixes:
      
      https://bugzilla.redhat.com/show_bug.cgi?id=964177
      
      (for the case where basis='utc'. It does not fix basis='localtime')
      b62d67da
    • L
      Revert "qemu: Report the offset from host UTC for RTC_CHANGE event" · b8efa6f2
      Laine Stump 提交于
      This reverts commit e31b5cf3.
      
      This commit attempted to work around a bug in the offset value
      reported by qemu's RTC_CHANGE event in the case that a variable base
      date was given on the qemu commandline. The patch mixed up the math
      involved in arriving at the corrected offset to report, and in the
      process added an unnecessary private attribute to the clock
      element. Since that element is private/internal and not used by anyone
      else, it makes sense to simplify things by removing it.
      b8efa6f2
    • L
      util: new function virTimeLocalOffsetFromUTC · 1cddaea7
      Laine Stump 提交于
      Since there isn't a single libc API to get this value, this patch
      supplies one which gets the value by grabbing current time, then
      converting that into a struct tm with gmtime_r(), then back to a
      time_t using mktime.
      
      The returned value is the difference between UTC and localtime in
      seconds. If localtime is ahead of UTC (east) the offset will be a
      positive number, and if localtime is behind UTC (west) the offset will
      be negative.
      
      This function should be POSIX-compliant, and is threadsafe, but not
      async signal safe. If it was ever necessary to know this value in a
      child process, we could cache it with a one-time init function when
      libvirtd starts, then just supply the cached value, but that
      complexity isn't needed for current usage; that would also have the
      problem that it might not be accurate after a local daylight savings
      boundary.
      
      (If it weren't for DST, we could simply replace this entire function
      with "-timezone"; timezone contains the offset of the current timezone
      (negated from what we want) but doesn't account for DST. And in spite
      of being guaranteed by POSIX, it isn't available on older versions of
      mingw.)
      Signed-off-by: NEric Blake <eblake@redhat.com>
      1cddaea7
  11. 23 5月, 2014 11 次提交
    • P
      storage: Add storage file API to read file headers · 81271a92
      Peter Krempa 提交于
      Add storage driver based functions to access headers of storage files
      for metadata extraction. Along with this patch a local filesystem and
      gluster via libgfapi implementation is provided. The gluster
      implementation is based on code of the saferead_lim function.
      81271a92
    • P
      storage: Add support for access to files using provided uid/gid · ae26731e
      Peter Krempa 提交于
      To allow using the storage driver APIs to access files on various
      storage sources in a universal fashion possibly on storage such as nfs
      with root squash we'll need to store the desired uid/gid in the
      metadata.
      
      Add new initialisation API that will store the desired uid/gid and a
      wrapper for the current use. Additionally add docs for the two APIs.
      ae26731e
    • P
      storage: Add NONE protocol type for network disks · a01d9357
      Peter Krempa 提交于
      Currently the protocol type with index 0 was NBD which made it hard to
      distinguish whether the protocol type was actually assigned. Add a new
      protocol type with index 0 to distinguish it explicitly.
      a01d9357
    • P
      conf: Fix domain disk path iterator to work with networked storage · b52e1ad9
      Peter Krempa 提交于
      Skip networked storage but continue iteration through backing chain to
      iterate through all the local paths in the backing chain.
      b52e1ad9
    • P
      storage: Rework debugging of storage file access through storage driver · 0620bd42
      Peter Krempa 提交于
      Print the debug statements of individual file access functions from the
      main API functions instead of the individual backend functions.
      
      Also enhance initialization debug messages on a per-backend basis.
      0620bd42
    • P
      storage: Store gluster volume name separately · 1115f975
      Peter Krempa 提交于
      The gluster volume name was previously stored as part of the source path
      string. This is unfortunate when we want to do operations on the path as
      the volume is used separately.
      
      Parse and store the volume name separately for gluster storage volumes
      and use the newly stored variable appropriately.
      1115f975
    • P
      qemu: Make qemuDomainPrepareDiskChainElement aware of remote storage · b8d6ba9b
      Peter Krempa 提交于
      Refactor the function to accept a virStorageSourcePtr instead of just
      the path, add a check to run it only on local storage and fix callers
      (possibly by using a newly introduced wrapper that wraps a path in the
       virStorageSource struct for legacy code)
      b8d6ba9b
    • P
      qemu: process: Refresh backing chain info when reconnecting to qemu · b3e99ad8
      Peter Krempa 提交于
      Refresh the disk backing chains when reconnecting to a qemu process
      after daemon restart. There are a few internal fields that don't get
      refreshed from the XML. Until we are able to do that, let's reload all
      the metadata by the backing chain crawler.
      b3e99ad8
    • J
      qemu: Properly abort migration to a file · 7757d83d
      Jiri Denemark 提交于
      This is similar to the previous commit in that we need to explicitly
      send migrate_cancel when libvirt detects an error other than those
      reported by query-migrate. However, the possibility to hit such error is
      pretty small.
      7757d83d
    • J
      qemu: Send migrate_cancel when aborting migration · e27d2897
      Jiri Denemark 提交于
      When QEMU reports failed or cancelled migration, we don't need to send
      it migrate_cancel QMP command. But in all other error paths, such as if
      we detect broken connection to a destination daemon or something else
      happens inside libvirt, we need to explicitly send migrate_cancel
      command instead of relying on the migration to be implicitly cancelled
      when destination QEMU is killed.
      
      Because we were not doing so, one could end up with a paused domain
      after failed migration.
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1098833
      e27d2897
    • J
      Fix error message when TUNNELLED flag is used in non-p2p migration · 7bdc7702
      Jiri Denemark 提交于
      The current error message is
      
          error: use virDomainMigrateToURI3 for peer-to-peer migration
      
      which is correct but a bit misleading because the client did not specify
      VIR_MIGRATE_PEER2PEER flag. This patch changes the error message to
      
          error: cannot perform tunnelled migration without using peer2peer
          flag
      
      which is consistent with the error reported by older migration APIs.
      
      Reported by Rich Jones in
      https://bugzilla.redhat.com/show_bug.cgi?id=1095924
      7bdc7702