1. 24 2月, 2017 1 次提交
  2. 12 2月, 2017 1 次提交
    • A
      qcow2: Optimize the refcount-block overlap check · 7061a078
      Alberto Garcia 提交于
      The metadata overlap checks introduced in a40f1c2a help detect
      corruption in the qcow2 image by verifying that data writes don't
      overlap with existing metadata sections.
      
      The 'refcount-block' check in particular iterates over the refcount
      table in order to get the addresses of all refcount blocks and check
      that none of them overlap with the region where we want to write.
      
      The problem with the refcount table is that since it always occupies
      complete clusters its size is usually very big. With the default
      values of cluster_size=64KB and refcount_bits=16 this table holds 8192
      entries, each one of them enough to map 2GB worth of host clusters.
      
      So unless we're using images with several TB of allocated data this
      table is going to be mostly empty, and iterating over it is a waste of
      CPU. If the storage backend is fast enough this can have an effect on
      I/O performance.
      
      This patch keeps the index of the last used (i.e. non-zero) entry in
      the refcount table and updates it every time the table changes. The
      refcount-block overlap check then uses that index instead of reading
      the whole table.
      
      In my tests with a 4GB qcow2 file stored in RAM this doubles the
      amount of write IOPS.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20170201123828.4815-1-berto@igalia.com
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      7061a078
  3. 06 12月, 2016 1 次提交
  4. 25 11月, 2016 1 次提交
  5. 22 11月, 2016 2 次提交
    • E
      block: Return -ENOTSUP rather than assert on unaligned discards · 49228d1e
      Eric Blake 提交于
      Right now, the block layer rounds discard requests, so that
      individual drivers are able to assert that discard requests
      will never be unaligned.  But there are some ISCSI devices
      that track and coalesce multiple unaligned requests, turning it
      into an actual discard if the requests eventually cover an
      entire page, which implies that it is better to always pass
      discard requests as low down the stack as possible.
      
      In isolation, this patch has no semantic effect, since the
      block layer currently never passes an unaligned request through.
      But the block layer already has code that silently ignores
      drivers that return -ENOTSUP for a discard request that cannot
      be honored (as well as drivers that return 0 even when nothing
      was done).  But the next patch will update the block layer to
      fragment discard requests, so that clients are guaranteed that
      they are either dealing with an unaligned head or tail, or an
      aligned core, making it similar to the block layer semantics of
      write zero fragmentation.
      
      CC: qemu-stable@nongnu.org
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      49228d1e
    • E
      qcow2: Inform block layer about discard boundaries · ecdbead6
      Eric Blake 提交于
      At the qcow2 layer, discard is only possible on a per-cluster
      basis; at the moment, qcow2 silently rounds any unaligned
      requests to this granularity.  However, an upcoming patch will
      fix a regression in the block layer ignoring too much of an
      unaligned discard request, by changing the block layer to
      break up a discard request at alignment boundaries; for that
      to work, the block layer must know about our limits.
      
      However, we can't go one step further by changing
      qcow2_discard_clusters() to assert that requests are always
      aligned, since that helper function is reached on paths
      outside of the block layer.
      
      CC: qemu-stable@nongnu.org
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      ecdbead6
  6. 24 10月, 2016 1 次提交
  7. 19 10月, 2016 1 次提交
  8. 13 9月, 2016 1 次提交
    • S
      qcow2: avoid memcpy(dst, NULL, len) · 0647d47c
      Stefan Hajnoczi 提交于
      Section "7.1.4 Use of library functions" in the C99 standard says:
      
        If an argument to a function has an invalid value (such as [...]
        a null pointer [...]) [...] the behavior is undefined.
      
      Additionally the "searching and sorting" functions are specified as
      requiring valid pointer values as described in 7.1.4.
      
      This patch fixes the following sanitizer errors:
      
        block/qcow2.c:1807:41: runtime error: null pointer passed as argument 2, which is declared to never be null
        block/qcow2-cluster.c:86:26: runtime error: null pointer passed as argument 2, which is declared to never be null
      Reported-by: NPeter Maydell <peter.maydell@linaro.org>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Message-id: 1473758138-19260-1-git-send-email-stefanha@redhat.com
      Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
      0647d47c
  9. 06 9月, 2016 3 次提交
  10. 26 7月, 2016 1 次提交
  11. 20 7月, 2016 1 次提交
  12. 13 7月, 2016 1 次提交
    • P
      coroutine: move entry argument to qemu_coroutine_create · 0b8b8753
      Paolo Bonzini 提交于
      In practice the entry argument is always known at creation time, and
      it is confusing that sometimes qemu_coroutine_enter is used with a
      non-NULL argument to re-enter a coroutine (this happens in
      block/sheepdog.c and tests/test-coroutine.c).  So pass the opaque value
      at creation time, for consistency with e.g. aio_bh_new.
      
      Mostly done with the following semantic patch:
      
      @ entry1 @
      expression entry, arg, co;
      @@
      - co = qemu_coroutine_create(entry);
      + co = qemu_coroutine_create(entry, arg);
        ...
      - qemu_coroutine_enter(co, arg);
      + qemu_coroutine_enter(co);
      
      @ entry2 @
      expression entry, arg;
      identifier co;
      @@
      - Coroutine *co = qemu_coroutine_create(entry);
      + Coroutine *co = qemu_coroutine_create(entry, arg);
        ...
      - qemu_coroutine_enter(co, arg);
      + qemu_coroutine_enter(co);
      
      @ entry3 @
      expression entry, arg;
      @@
      - qemu_coroutine_enter(qemu_coroutine_create(entry), arg);
      + qemu_coroutine_enter(qemu_coroutine_create(entry, arg));
      
      @ reentry @
      expression co;
      @@
      - qemu_coroutine_enter(co, NULL);
      + qemu_coroutine_enter(co);
      
      except for the aforementioned few places where the semantic patch
      stumbled (as expected) and for test_co_queue, which would otherwise
      produce an uninitialized variable warning.
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      Reviewed-by: NFam Zheng <famz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      0b8b8753
  13. 05 7月, 2016 9 次提交
  14. 20 6月, 2016 1 次提交
  15. 16 6月, 2016 5 次提交
    • K
      qcow2: Let vmstate call qcow2_co_preadv/pwrite directly · 734a7758
      Kevin Wolf 提交于
      We don't really want to go through the block layer in order to read from
      or write to the vmstate in a qcow2 image. Doing so required a few ugly
      hacks like saving and restoring the old image size (because writing to
      vmstate offsets would increase the image size) or disabling the "reads
      after EOF = zeroes" logic. When calling the right functions directly,
      these hacks aren't necessary any more.
      
      Note that .bdrv_vmstate_load/save() return 0 instead of the number of
      bytes in case of success now.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NFam Zheng <famz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      734a7758
    • K
      block: Make .bdrv_load_vmstate() vectored · 5ddda0b8
      Kevin Wolf 提交于
      This brings it in line with .bdrv_save_vmstate().
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NFam Zheng <famz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      5ddda0b8
    • D
      block: drop support for using qcow[2] encryption with system emulators · 8c0dcbc4
      Daniel P. Berrange 提交于
      Back in the 2.3.0 release we declared qcow[2] encryption as
      deprecated, warning people that it would be removed in a future
      release.
      
        commit a1f688f4
        Author: Markus Armbruster <armbru@redhat.com>
        Date:   Fri Mar 13 21:09:40 2015 +0100
      
          block: Deprecate QCOW/QCOW2 encryption
      
      The code still exists today, but by a (happy?) accident we entirely
      broke the ability to use qcow[2] encryption in the system emulators
      in the 2.4.0 release due to
      
        commit 8336aafa
        Author: Daniel P. Berrange <berrange@redhat.com>
        Date:   Tue May 12 17:09:18 2015 +0100
      
          qcow2/qcow: protect against uninitialized encryption key
      
      This commit was designed to prevent future coding bugs which
      might cause QEMU to read/write data on an encrypted block
      device in plain text mode before a decryption key is set.
      
      It turns out this preventative measure was a little too good,
      because we already had a long standing bug where QEMU read
      encrypted data in plain text mode during system emulator
      startup, in order to guess disk geometry:
      
        Thread 10 (Thread 0x7fffd3fff700 (LWP 30373)):
        #0  0x00007fffe90b1a28 in raise () at /lib64/libc.so.6
        #1  0x00007fffe90b362a in abort () at /lib64/libc.so.6
        #2  0x00007fffe90aa227 in __assert_fail_base () at /lib64/libc.so.6
        #3  0x00007fffe90aa2d2 in  () at /lib64/libc.so.6
        #4  0x000055555587ae19 in qcow2_co_readv (bs=0x5555562accb0, sector_num=0, remaining_sectors=1, qiov=0x7fffffffd260) at block/qcow2.c:1229
        #5  0x000055555589b60d in bdrv_aligned_preadv (bs=bs@entry=0x5555562accb0, req=req@entry=0x7fffd3ffea50, offset=offset@entry=0, bytes=bytes@entry=512, align=align@entry=512, qiov=qiov@entry=0x7fffffffd260, flags=0) at block/io.c:908
        #6  0x000055555589b8bc in bdrv_co_do_preadv (bs=0x5555562accb0, offset=0, bytes=512, qiov=0x7fffffffd260, flags=<optimized out>) at block/io.c:999
        #7  0x000055555589c375 in bdrv_rw_co_entry (opaque=0x7fffffffd210) at block/io.c:544
        #8  0x000055555586933b in coroutine_thread (opaque=0x555557876310) at coroutine-gthread.c:134
        #9  0x00007ffff64e1835 in g_thread_proxy (data=0x5555562b5590) at gthread.c:778
        #10 0x00007ffff6bb760a in start_thread () at /lib64/libpthread.so.0
        #11 0x00007fffe917f59d in clone () at /lib64/libc.so.6
      
        Thread 1 (Thread 0x7ffff7ecab40 (LWP 30343)):
        #0  0x00007fffe91797a9 in syscall () at /lib64/libc.so.6
        #1  0x00007ffff64ff87f in g_cond_wait (cond=cond@entry=0x555555e085f0 <coroutine_cond>, mutex=mutex@entry=0x555555e08600 <coroutine_lock>) at gthread-posix.c:1397
        #2  0x00005555558692c3 in qemu_coroutine_switch (co=<optimized out>) at coroutine-gthread.c:117
        #3  0x00005555558692c3 in qemu_coroutine_switch (from_=0x5555562b5e30, to_=to_@entry=0x555557876310, action=action@entry=COROUTINE_ENTER) at coroutine-gthread.c:175
        #4  0x0000555555868a90 in qemu_coroutine_enter (co=0x555557876310, opaque=0x0) at qemu-coroutine.c:116
        #5  0x0000555555859b84 in thread_pool_completion_bh (opaque=0x7fffd40010e0) at thread-pool.c:187
        #6  0x0000555555859514 in aio_bh_poll (ctx=ctx@entry=0x5555562953b0) at async.c:85
        #7  0x0000555555864d10 in aio_dispatch (ctx=ctx@entry=0x5555562953b0) at aio-posix.c:135
        #8  0x0000555555864f75 in aio_poll (ctx=ctx@entry=0x5555562953b0, blocking=blocking@entry=true) at aio-posix.c:291
        #9  0x000055555589c40d in bdrv_prwv_co (bs=bs@entry=0x5555562accb0, offset=offset@entry=0, qiov=qiov@entry=0x7fffffffd260, is_write=is_write@entry=false, flags=flags@entry=(unknown: 0)) at block/io.c:591
        #10 0x000055555589c503 in bdrv_rw_co (bs=bs@entry=0x5555562accb0, sector_num=sector_num@entry=0, buf=buf@entry=0x7fffffffd2e0 "\321,", nb_sectors=nb_sectors@entry=21845, is_write=is_write@entry=false, flags=flags@entry=(unknown: 0)) at block/io.c:614
        #11 0x000055555589c562 in bdrv_read_unthrottled (nb_sectors=21845, buf=0x7fffffffd2e0 "\321,", sector_num=0, bs=0x5555562accb0) at block/io.c:622
        #12 0x000055555589c562 in bdrv_read_unthrottled (bs=0x5555562accb0, sector_num=sector_num@entry=0, buf=buf@entry=0x7fffffffd2e0 "\321,", nb_sectors=nb_sectors@entry=21845) at block/io.c:634
          nb_sectors@entry=1) at block/block-backend.c:504
        #14 0x0000555555752e9f in guess_disk_lchs (blk=blk@entry=0x5555562a5290, pcylinders=pcylinders@entry=0x7fffffffd52c, pheads=pheads@entry=0x7fffffffd530, psectors=psectors@entry=0x7fffffffd534) at hw/block/hd-geometry.c:68
        #15 0x0000555555752ff7 in hd_geometry_guess (blk=0x5555562a5290, pcyls=pcyls@entry=0x555557875d1c, pheads=pheads@entry=0x555557875d20, psecs=psecs@entry=0x555557875d24, ptrans=ptrans@entry=0x555557875d28) at hw/block/hd-geometry.c:133
        #16 0x0000555555752b87 in blkconf_geometry (conf=conf@entry=0x555557875d00, ptrans=ptrans@entry=0x555557875d28, cyls_max=cyls_max@entry=65536, heads_max=heads_max@entry=16, secs_max=secs_max@entry=255, errp=errp@entry=0x7fffffffd5e0) at hw/block/block.c:71
        #17 0x0000555555799bc4 in ide_dev_initfn (dev=0x555557875c80, kind=IDE_HD) at hw/ide/qdev.c:174
        #18 0x0000555555768394 in device_realize (dev=0x555557875c80, errp=0x7fffffffd640) at hw/core/qdev.c:247
        #19 0x0000555555769a81 in device_set_realized (obj=0x555557875c80, value=<optimized out>, errp=0x7fffffffd730) at hw/core/qdev.c:1058
        #20 0x00005555558240ce in property_set_bool (obj=0x555557875c80, v=<optimized out>, opaque=0x555557875de0, name=<optimized out>, errp=0x7fffffffd730)
              at qom/object.c:1514
        #21 0x0000555555826c87 in object_property_set_qobject (obj=obj@entry=0x555557875c80, value=value@entry=0x55555784bcb0, name=name@entry=0x55555591cb3d "realized", errp=errp@entry=0x7fffffffd730) at qom/qom-qobject.c:24
        #22 0x0000555555825760 in object_property_set_bool (obj=obj@entry=0x555557875c80, value=value@entry=true, name=name@entry=0x55555591cb3d "realized", errp=errp@entry=0x7fffffffd730) at qom/object.c:905
        #23 0x000055555576897b in qdev_init_nofail (dev=dev@entry=0x555557875c80) at hw/core/qdev.c:380
        #24 0x0000555555799ead in ide_create_drive (bus=bus@entry=0x555557629630, unit=unit@entry=0, drive=0x5555562b77e0) at hw/ide/qdev.c:122
        #25 0x000055555579a746 in pci_ide_create_devs (dev=dev@entry=0x555557628db0, hd_table=hd_table@entry=0x7fffffffd830) at hw/ide/pci.c:440
        #26 0x000055555579b165 in pci_piix3_ide_init (bus=<optimized out>, hd_table=0x7fffffffd830, devfn=<optimized out>) at hw/ide/piix.c:218
        #27 0x000055555568ca55 in pc_init1 (machine=0x5555562960a0, pci_enabled=1, kvmclock_enabled=<optimized out>) at /home/berrange/src/virt/qemu/hw/i386/pc_piix.c:256
        #28 0x0000555555603ab2 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4249
      
      So the safety net is correctly preventing QEMU reading cipher
      text as if it were plain text, during startup and aborting QEMU
      to avoid bad usage of this data.
      
      For added fun this bug only happens if the encrypted qcow2
      file happens to have data written to the first cluster,
      otherwise the cluster won't be allocated and so qcow2 would
      not try the decryption routines at all, just return all 0's.
      
      That no one even noticed, let alone reported, this bug that
      has shipped in 2.4.0, 2.5.0 and 2.6.0 shows that the number
      of actual users of encrypted qcow2 is approximately zero.
      
      So rather than fix the crash, and backport it to stable
      releases, just go ahead with what we have warned users about
      and disable any use of qcow2 encryption in the system
      emulators. qemu-img/qemu-io/qemu-nbd are still able to access
      qcow2 encrypted images for the sake of data conversion.
      
      In the future, qcow2 will gain support for the alternative
      luks format, but when this happens it'll be using the
      '-object secret' infrastructure for getting keys, which
      avoids this problematic scenario entirely.
      Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      8c0dcbc4
    • K
      qcow2: Implement .bdrv_co_pwritev() · d46a0bb2
      Kevin Wolf 提交于
      This changes qcow2 to implement the byte-based .bdrv_co_pwritev
      interface rather than the sector-based old one.
      
      As preallocation uses the same allocation function as normal writes, and
      the interface of that function needs to be changed, it is converted in
      the same patch.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      d46a0bb2
    • K
      qcow2: Implement .bdrv_co_preadv() · ecfe1863
      Kevin Wolf 提交于
      Reading from qcow2 images is now byte granularity.
      
      Most of the affected code in qcow2 actually gets simpler with this
      change. The only exception is encryption, which is fixed on 512 bytes
      blocks; in order to keep this working, bs->request_alignment is set for
      encrypted images.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      ecfe1863
  16. 08 6月, 2016 7 次提交
    • D
      qcow2: avoid extra flushes in qcow2 · f3c3b87d
      Denis V. Lunev 提交于
      The problem with excessive flushing was found by a couple of performance
      tests:
        - parallel directory tree creation (from 2 processes)
        - 32 cached writes + fsync at the end in a loop
      
      For the first one results improved from 2.6 loops/sec to 3.5 loops/sec.
      Each loop creates 10^3 directories with 10 files in each.
      
      For the second one results improved from ~600 fsync/sec to ~1100
      fsync/sec. Though, it was run on SSD so it probably won't show such
      performance gain on rotational media.
      
      qcow2_cache_flush() calls bdrv_flush() unconditionally after writing
      cache entries of a particular cache. This can lead to as many as
      2 additional fdatasyncs inside bdrv_flush.
      
      We can simply skip all fdatasync calls inside qcow2_co_flush_to_os
      as bdrv_flush for sure will do the job. These flushes are necessary to
      keep the right order of writes to the different caches. Though this is
      not necessary in the current code base as this ordering is ensured through
      the flush in qcow2_cache_flush_dependency().
      Signed-off-by: NDenis V. Lunev <den@openvz.org>
      CC: Pavel Borzenkov <pborzenkov@virtuozzo.com>
      CC: Kevin Wolf <kwolf@redhat.com>
      CC: Max Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      f3c3b87d
    • E
      qcow2: Convert to bdrv_co_pwrite_zeroes() · 5544b59f
      Eric Blake 提交于
      Another step on our continuing quest to switch to byte-based
      interfaces.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      5544b59f
    • E
      block: Switch bdrv_write_zeroes() to byte interface · 74021bc4
      Eric Blake 提交于
      Rename to bdrv_pwrite_zeroes() to let the compiler ensure we
      cater to the updated semantics.  Do the same for bdrv_co_write_zeroes().
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      74021bc4
    • E
      block: Track write zero limits in bytes · cf081fca
      Eric Blake 提交于
      Another step towards removing sector-based interfaces: convert
      the maximum write and minimum alignment values from sectors to
      bytes.  Rename the variables to let the compiler check that all
      users are converted to the new semantics.
      
      The maximum remains an int as long as BDRV_REQUEST_MAX_SECTORS
      is constrained by INT_MAX (this means that we can't even
      support a 2G write_zeroes, but just under it) - changing
      operation lengths to unsigned or to 64-bits is a much bigger
      audit, and debatable if we even want to do it (since at the
      core, a 32-bit platform will still have ssize_t as its
      underlying limit on write()).
      
      Meanwhile, alignment is changed to 'uint32_t', since it makes no
      sense to have an alignment larger than the maximum write, and
      less painful to use an unsigned type with well-defined behavior
      in bit operations than to have to worry about what happens if
      a driver mistakenly supplies a negative alignment.
      
      Add an assert that no one was trying to use sectors to get a
      write zeroes larger than 2G, and therefore that a later conversion
      to bytes won't be impacted by keeping the limit at 32 bits.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      cf081fca
    • E
      qcow2: Catch more unaligned write_zero into zero cluster · ebb718a5
      Eric Blake 提交于
      is_zero_cluster() and is_zero_cluster_top_locked() are used only
      by qcow2_co_write_zeroes().  The former is too broad (we don't
      care if the sectors we are about to overwrite are non-zero, only
      that all other sectors in the cluster are zero), so it needs to
      be called up to twice but with smaller limits - rename it along
      with adding the neeeded parameter.  The latter can be inlined for
      more compact code.
      
      The testsuite change shows that we now have a sparser top file
      when an unaligned write_zeroes overwrites the only portion of
      the backing file with data.
      
      Based on a patch proposal by Denis V. Lunev.
      
      CC: Denis V. Lunev <den@openvz.org>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NDenis V. Lunev <den@openvz.org>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      ebb718a5
    • D
      qcow2: add tracepoints for qcow2_co_write_zeroes · 5a64e942
      Denis V. Lunev 提交于
      This patch follows guidelines of all other tracepoints in qcow2, like ones
      in qcow2_co_writev. I think that they should dump values in the same
      quantities or be changed all together.
      Signed-off-by: NDenis V. Lunev <den@openvz.org>
      CC: Eric Blake <eblake@redhat.com>
      CC: Kevin Wolf <kwolf@redhat.com>
      Message-Id: <1463476543-3087-4-git-send-email-den@openvz.org>
      [eblake: typo fix in commit message]
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      5a64e942
    • D
      qcow2: simplify logic in qcow2_co_write_zeroes · ba142846
      Denis V. Lunev 提交于
      Unaligned requests will occupy only one cluster. This is true since the
      previous commit. Simplify the code taking this consideration into
      account.
      
      In other words, the caller is now buggy if it ever passes us an unaligned
      request that crosses cluster boundaries (the only requests that can cross
      boundaries will be aligned).
      
      There are no other changes so far.
      Signed-off-by: NDenis V. Lunev <den@openvz.org>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      CC: Eric Blake <eblake@redhat.com>
      CC: Kevin Wolf <kwolf@redhat.com>
      Message-Id: <1463476543-3087-3-git-send-email-den@openvz.org>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      ba142846
  17. 19 5月, 2016 3 次提交