Skip to content

Commits

Permalink
stable-4.1-sta…
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Commits on Nov 12, 2019

  1. mirror: Keep mirror_top_bs drained after dropping permissions

    mirror_top_bs is currently implicitly drained through its connection to
    the source or the target node. However, the drain section for target_bs
    ends early after moving mirror_top_bs from src to target_bs, so that
    requests can already be restarted while mirror_top_bs is still present
    in the chain, but has dropped all permissions and therefore runs into an
    assertion failure like this:
    
        qemu-system-x86_64: block/io.c:1634: bdrv_co_write_req_prepare:
        Assertion `child->perm & BLK_PERM_WRITE' failed.
    
    Keep mirror_top_bs drained until all graph changes have completed.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Kevin Wolf <kwolf@redhat.com>
    Reviewed-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit d2da5e2)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Kevin Wolf authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    e092a17 View commit details
    Browse the repository at this point in the history
  2. block/create: Do not abort if a block driver is not available

    The 'blockdev-create' QMP command was introduced as experimental
    feature in commit b0292b8, using the assert() debug call.
    It got promoted to 'stable' command in 3fb588a, but the
    assert call was not removed.
    
    Some block drivers are optional, and bdrv_find_format() might
    return a NULL value, triggering the assertion.
    
    Stable code is not expected to abort, so return an error instead.
    
    This is easily reproducible when libnfs is not installed:
    
      ./configure
      [...]
      module support    no
      Block whitelist (rw)
      Block whitelist (ro)
      libiscsi support  yes
      libnfs support    no
      [...]
    
    Start QEMU:
    
      $ qemu-system-x86_64 -S -qmp unix:/tmp/qemu.qmp,server,nowait
    
    Send the 'blockdev-create' with the 'nfs' driver:
    
      $ ( cat << 'EOF'
      {'execute': 'qmp_capabilities'}
      {'execute': 'blockdev-create', 'arguments': {'job-id': 'x', 'options': {'size': 0, 'driver': 'nfs', 'location': {'path': '/', 'server': {'host': '::1', 'type': 'inet'}}}}, 'id': 'x'}
      EOF
      ) | socat STDIO UNIX:/tmp/qemu.qmp
      {"QMP": {"version": {"qemu": {"micro": 50, "minor": 1, "major": 4}, "package": "v4.1.0-733-g89ea03a7dc"}, "capabilities": ["oob"]}}
      {"return": {}}
    
    QEMU crashes:
    
      $ gdb qemu-system-x86_64 core
      Program received signal SIGSEGV, Segmentation fault.
      (gdb) bt
      #0  0x00007ffff510957f in raise () at /lib64/libc.so.6
      #1  0x00007ffff50f3895 in abort () at /lib64/libc.so.6
      #2  0x00007ffff50f3769 in _nl_load_domain.cold.0 () at /lib64/libc.so.6
      #3  0x00007ffff5101a26 in .annobin_assert.c_end () at /lib64/libc.so.6
      #4  0x0000555555d7e1f1 in qmp_blockdev_create (job_id=0x555556baee40 "x", options=0x555557666610, errp=0x7fffffffc770) at block/create.c:69
      #5  0x0000555555c96b52 in qmp_marshal_blockdev_create (args=0x7fffdc003830, ret=0x7fffffffc7f8, errp=0x7fffffffc7f0) at qapi/qapi-commands-block-core.c:1314
      #6  0x0000555555deb0a0 in do_qmp_dispatch (cmds=0x55555645de70 <qmp_commands>, request=0x7fffdc005c70, allow_oob=false, errp=0x7fffffffc898) at qapi/qmp-dispatch.c:131
      #7  0x0000555555deb2a1 in qmp_dispatch (cmds=0x55555645de70 <qmp_commands>, request=0x7fffdc005c70, allow_oob=false) at qapi/qmp-dispatch.c:174
    
    With this patch applied, QEMU returns a QMP error:
    
      {'execute': 'blockdev-create', 'arguments': {'job-id': 'x', 'options': {'size': 0, 'driver': 'nfs', 'location': {'path': '/', 'server': {'host': '::1', 'type': 'inet'}}}}, 'id': 'x'}
      {"id": "x", "error": {"class": "GenericError", "desc": "Block driver 'nfs' not found or not supported"}}
    
    Cc: qemu-stable@nongnu.org
    Reported-by: Xu Tian <xutian@redhat.com>
    Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Reviewed-by: John Snow <jsnow@redhat.com>
    Signed-off-by: Kevin Wolf <kwolf@redhat.com>
    (cherry picked from commit d90d5ca)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    philmd authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    088f1e8 View commit details
    Browse the repository at this point in the history
  3. vhost: Fix memory region section comparison

    Using memcmp to compare structures wasn't safe,
    as I found out on ARM when I was getting falce miscompares.
    
    Use the helper function for comparing the MRSs.
    
    Fixes: ade6d08 ("vhost: Regenerate region list from changed sections list")
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
    Message-Id: <20190814175535.2023-4-dgilbert@redhat.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    (cherry picked from commit 3fc4a64)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    dagrh authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    145b562 View commit details
    Browse the repository at this point in the history
  4. memory: Provide an equality function for MemoryRegionSections

    Provide a comparison function that checks all the fields are the same.
    
    Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
    Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
    Message-Id: <20190814175535.2023-3-dgilbert@redhat.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    (cherry picked from commit 9366cf0)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    dagrh authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    42b6571 View commit details
    Browse the repository at this point in the history
  5. memory: Align MemoryRegionSections fields

    MemoryRegionSection includes an Int128 'size' field;
    on some platforms the compiler causes an alignment of this to
    a 128bit boundary, leaving 8 bytes of dead space.
    This deadspace can be filled with junk.
    
    Move the size field to the top avoiding unnecessary alignment.
    
    Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
    Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
    Message-Id: <20190814175535.2023-2-dgilbert@redhat.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    (cherry picked from commit 44f85d3)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    dagrh authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    c0aca93 View commit details
    Browse the repository at this point in the history
  6. tests: make filemonitor test more robust to event ordering

    The ordering of events that are emitted during the rmdir
    test have changed with kernel >= 5.3. Semantically both
    new & old orderings are correct, so we must be able to
    cope with either.
    
    To cope with this, when we see an unexpected event, we
    push it back onto the queue and look and the subsequent
    event to see if that matches instead.
    
    Tested-by: Peter Xu <peterx@redhat.com>
    Tested-by: Wei Yang <richardw.yang@linux.intel.com>
    Tested-by: Cornelia Huck <cohuck@redhat.com>
    Reviewed-by: Thomas Huth <thuth@redhat.com>
    Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
    (cherry picked from commit bf9e031)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    berrange authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    54c1304 View commit details
    Browse the repository at this point in the history
  7. block: posix: Always allocate the first block

    When creating an image with preallocation "off" or "falloc", the first
    block of the image is typically not allocated. When using Gluster
    storage backed by XFS filesystem, reading this block using direct I/O
    succeeds regardless of request length, fooling alignment detection.
    
    In this case we fallback to a safe value (4096) instead of the optimal
    value (512), which may lead to unneeded data copying when aligning
    requests.  Allocating the first block avoids the fallback.
    
    Since we allocate the first block even with preallocation=off, we no
    longer create images with zero disk size:
    
        $ ./qemu-img create -f raw test.raw 1g
        Formatting 'test.raw', fmt=raw size=1073741824
    
        $ ls -lhs test.raw
        4.0K -rw-r--r--. 1 nsoffer nsoffer 1.0G Aug 16 23:48 test.raw
    
    And converting the image requires additional cluster:
    
        $ ./qemu-img measure -f raw -O qcow2 test.raw
        required size: 458752
        fully allocated size: 1074135040
    
    When using format like vmdk with multiple files per image, we allocate
    one block per file:
    
        $ ./qemu-img create -f vmdk -o subformat=twoGbMaxExtentFlat test.vmdk 4g
        Formatting 'test.vmdk', fmt=vmdk size=4294967296 compat6=off hwversion=undefined subformat=twoGbMaxExtentFlat
    
        $ ls -lhs test*.vmdk
        4.0K -rw-r--r--. 1 nsoffer nsoffer 2.0G Aug 27 03:23 test-f001.vmdk
        4.0K -rw-r--r--. 1 nsoffer nsoffer 2.0G Aug 27 03:23 test-f002.vmdk
        4.0K -rw-r--r--. 1 nsoffer nsoffer  353 Aug 27 03:23 test.vmdk
    
    I did quick performance test for copying disks with qemu-img convert to
    new raw target image to Gluster storage with sector size of 512 bytes:
    
        for i in $(seq 10); do
            rm -f dst.raw
            sleep 10
            time ./qemu-img convert -f raw -O raw -t none -T none src.raw dst.raw
        done
    
    Here is a table comparing the total time spent:
    
    Type    Before(s)   After(s)    Diff(%)
    ---------------------------------------
    real      530.028    469.123      -11.4
    user       17.204     10.768      -37.4
    sys        17.881      7.011      -60.7
    
    We can see very clear improvement in CPU usage.
    
    Signed-off-by: Nir Soffer <nsoffer@redhat.com>
    Message-id: 20190827010528.8818-2-nsoffer@redhat.com
    Reviewed-by: Max Reitz <mreitz@redhat.com>
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    
    (cherry picked from commit 3a20013)
    
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    nirs authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    3d018ff View commit details
    Browse the repository at this point in the history
  8. file-posix: Handle undetectable alignment

    In some cases buf_align or request_alignment cannot be detected:
    
    1. With Gluster, buf_align cannot be detected since the actual I/O is
       done on Gluster server, and qemu buffer alignment does not matter.
       Since we don't have alignment requirement, buf_align=1 is the best
       value.
    
    2. With local XFS filesystem, buf_align cannot be detected if reading
       from unallocated area. In this we must align the buffer, but we don't
       know what is the correct size. Using the wrong alignment results in
       I/O error.
    
    3. With Gluster backed by XFS, request_alignment cannot be detected if
       reading from unallocated area. In this case we need to use the
       correct alignment, and failing to do so results in I/O errors.
    
    4. With NFS, the server does not use direct I/O, so both buf_align cannot
       be detected. In this case we don't need any alignment so we can use
       buf_align=1 and request_alignment=1.
    
    These cases seems to work when storage sector size is 512 bytes, because
    the current code starts checking align=512. If the check succeeds
    because alignment cannot be detected we use 512. But this does not work
    for storage with 4k sector size.
    
    To determine if we can detect the alignment, we probe first with
    align=1. If probing succeeds, maybe there are no alignment requirement
    (cases 1, 4) or we are probing unallocated area (cases 2, 3). Since we
    don't have any way to tell, we treat this as undetectable alignment. If
    probing with align=1 fails with EINVAL, but probing with one of the
    expected alignments succeeds, we know that we found a working alignment.
    
    Practically the alignment requirements are the same for buffer
    alignment, buffer length, and offset in file. So in case we cannot
    detect buf_align, we can use request alignment. If we cannot detect
    request alignment, we can fallback to a safe value. To use this logic,
    we probe first request alignment instead of buf_align.
    
    Here is a table showing the behaviour with current code (the value in
    parenthesis is the optimal value).
    
    Case    Sector    buf_align (opt)   request_alignment (opt)     result
    ======================================================================
    1       512       512   (1)          512   (512)                 OK
    1       4096      512   (1)          4096  (4096)                FAIL
    ----------------------------------------------------------------------
    2       512       512   (512)        512   (512)                 OK
    2       4096      512   (4096)       4096  (4096)                FAIL
    ----------------------------------------------------------------------
    3       512       512   (1)          512   (512)                 OK
    3       4096      512   (1)          512   (4096)                FAIL
    ----------------------------------------------------------------------
    4       512       512   (1)          512   (1)                   OK
    4       4096      512   (1)          512   (1)                   OK
    
    Same cases with this change:
    
    Case    Sector    buf_align (opt)   request_alignment (opt)     result
    ======================================================================
    1       512       512   (1)          512   (512)                 OK
    1       4096      4096  (1)          4096  (4096)                OK
    ----------------------------------------------------------------------
    2       512       512   (512)        512   (512)                 OK
    2       4096      4096  (4096)       4096  (4096)                OK
    ----------------------------------------------------------------------
    3       512       4096  (1)          4096  (512)                 OK
    3       4096      4096  (1)          4096  (4096)                OK
    ----------------------------------------------------------------------
    4       512       4096  (1)          4096  (1)                   OK
    4       4096      4096  (1)          4096  (1)                   OK
    
    I tested that provisioning VMs and copying disks on local XFS and
    Gluster with 4k bytes sector size work now, resolving bugs [1],[2].
    I tested also on XFS, NFS, Gluster with 512 bytes sector size.
    
    [1] https://bugzilla.redhat.com/1737256
    [2] https://bugzilla.redhat.com/1738657
    
    Signed-off-by: Nir Soffer <nsoffer@redhat.com>
    Signed-off-by: Kevin Wolf <kwolf@redhat.com>
    
    (cherry picked from commit a6b257a)
    
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    nirs authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    f0d3fa2 View commit details
    Browse the repository at this point in the history
  9. block/file-posix: Let post-EOF fallocate serialize

    The XFS kernel driver has a bug that may cause data corruption for qcow2
    images as of qemu commit c8bb23c.  We can work around it by
    treating post-EOF fallocates as serializing up until infinity (INT64_MAX
    in practice).
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Message-id: 20191101152510.11719-4-mreitz@redhat.com
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit 292d06b)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    7db05c8 View commit details
    Browse the repository at this point in the history
  10. block: Add bdrv_co_get_self_request()

    Cc: qemu-stable@nongnu.org
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Message-id: 20191101152510.11719-3-mreitz@redhat.com
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit c28107e)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    d9b88f7 View commit details
    Browse the repository at this point in the history
  11. block: Make wait/mark serialising requests public

    Make both bdrv_mark_request_serialising() and
    bdrv_wait_serialising_requests() public so they can be used from block
    drivers.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Message-id: 20191101152510.11719-2-mreitz@redhat.com
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit 304d9d7)
     Conflicts:
    	block/io.c
    *drop context dependency on 1acc346
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    590cff8 View commit details
    Browse the repository at this point in the history
  12. block/io: refactor padding

    We have similar padding code in bdrv_co_pwritev,
    bdrv_co_do_pwrite_zeroes and bdrv_co_preadv. Let's combine and unify
    it.
    
    [Squashed in Vladimir's qemu-iotests 077 fix
    --Stefan]
    
    Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
    Message-id: 20190604161514.262241-4-vsementsov@virtuozzo.com
    Message-Id: <20190604161514.262241-4-vsementsov@virtuozzo.com>
    Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
    (cherry picked from commit 7a3f542)
    *prereq for 292d06b
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Vladimir Sementsov-Ogievskiy authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    2e2ad02 View commit details
    Browse the repository at this point in the history
  13. util/iov: improve qemu_iovec_is_zero

    We'll need to check a part of qiov soon, so implement it now.
    
    Optimization with align down to 4 * sizeof(long) is dropped due to:
    1. It is strange: it aligns length of the buffer, but where is a
       guarantee that buffer pointer is aligned itself?
    2. buffer_is_zero() is a better place for optimizations and it has
       them.
    
    Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
    Message-id: 20190604161514.262241-3-vsementsov@virtuozzo.com
    Message-Id: <20190604161514.262241-3-vsementsov@virtuozzo.com>
    Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
    (cherry picked from commit f76889e)
    *prereq for 292d06b
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Vladimir Sementsov-Ogievskiy authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    b3b76fc View commit details
    Browse the repository at this point in the history
  14. util/iov: introduce qemu_iovec_init_extended

    Introduce new initialization API, to create requests with padding. Will
    be used in the following patch. New API uses qemu_iovec_init_buf if
    resulting io vector has only one element, to avoid extra allocations.
    So, we need to update qemu_iovec_destroy to support destroying such
    QIOVs.
    
    Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
    Message-id: 20190604161514.262241-2-vsementsov@virtuozzo.com
    Message-Id: <20190604161514.262241-2-vsementsov@virtuozzo.com>
    Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
    (cherry picked from commit d953169)
    *prereq for 292d06b
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Vladimir Sementsov-Ogievskiy authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    cff024f View commit details
    Browse the repository at this point in the history
  15. qcow2-bitmap: Fix uint64_t left-shift overflow

    There are two issues in In check_constraints_on_bitmap(),
    1) The sanity check on the granularity will cause uint64_t
    integer left-shift overflow when cluster_size is 2M and the
    granularity is BIGGER than 32K.
    2) The way to calculate image size that the maximum bitmap
    supported can map to is a bit incorrect.
    This patch fix it by add a helper function to calculate the
    number of bytes needed by a normal bitmap in image and compare
    it to the maximum bitmap bytes supported by qemu.
    
    Fixes: 5f72826
    Signed-off-by: Guoyi Tu <tu.guoyi@h3c.com>
    Message-id: 4ba40cd1e7ee4a708b40899952e49f22@h3c.com
    Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit 570542e)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Tuguoyi authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    40df4a1 View commit details
    Browse the repository at this point in the history
  16. iotests: Add peek_file* functions

    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Message-id: 20191011152814.14791-16-mreitz@redhat.com
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit fc8ba42)
    *prereq for 570542e
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    b156178 View commit details
    Browse the repository at this point in the history
  17. iotests: Add test for 4G+ compressed qcow2 write

    Test what qemu-img check says about an image after one has written
    compressed data to an offset above 4 GB.
    
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Message-id: 20191028161841.1198-3-mreitz@redhat.com
    Reviewed-by: Alberto Garcia <berto@igalia.com>
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit b7cd2c1)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 12, 2019
    Copy the full SHA
    15f5e8c View commit details
    Browse the repository at this point in the history

Commits on Nov 11, 2019

  1. qcow2: Fix QCOW2_COMPRESSED_SECTOR_MASK

    Masks for L2 table entries should have 64 bit.
    
    Fixes: b6c2469
    Buglink: https://bugs.launchpad.net/qemu/+bug/1850000
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Message-id: 20191028161841.1198-2-mreitz@redhat.com
    Reviewed-by: Alberto Garcia <berto@igalia.com>
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit 24552fe)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 11, 2019
    Copy the full SHA
    405deba View commit details
    Browse the repository at this point in the history

Commits on Nov 5, 2019

  1. virtio-blk: Cancel the pending BH when the dataplane is reset

    When 'system_reset' is called, the main loop clear the memory
    region cache before the BH has a chance to execute. Later when
    the deferred function is called, some assumptions that were
    made when scheduling them are no longer true when they actually
    execute.
    
    This is what happens using a virtio-blk device (fresh RHEL7.8 install):
    
     $ (sleep 12.3; echo system_reset; sleep 12.3; echo system_reset; sleep 1; echo q) \
       | qemu-system-x86_64 -m 4G -smp 8 -boot menu=on \
         -device virtio-blk-pci,id=image1,drive=drive_image1 \
         -drive file=/var/lib/libvirt/images/rhel78.qcow2,if=none,id=drive_image1,format=qcow2,cache=none \
         -device virtio-net-pci,netdev=net0,id=nic0,mac=52:54:00:c4:e7:84 \
         -netdev tap,id=net0,script=/bin/true,downscript=/bin/true,vhost=on \
         -monitor stdio -serial null -nographic
      (qemu) system_reset
      (qemu) system_reset
      (qemu) qemu-system-x86_64: hw/virtio/virtio.c:225: vring_get_region_caches: Assertion `caches != NULL' failed.
      Aborted
    
      (gdb) bt
      Thread 1 (Thread 0x7f109c17b680 (LWP 10939)):
      #0  0x00005604083296d1 in vring_get_region_caches (vq=0x56040a24bdd0) at hw/virtio/virtio.c:227
      #1  0x000056040832972b in vring_avail_flags (vq=0x56040a24bdd0) at hw/virtio/virtio.c:235
      #2  0x000056040832d13d in virtio_should_notify (vdev=0x56040a240630, vq=0x56040a24bdd0) at hw/virtio/virtio.c:1648
      #3  0x000056040832d1f8 in virtio_notify_irqfd (vdev=0x56040a240630, vq=0x56040a24bdd0) at hw/virtio/virtio.c:1662
      #4  0x00005604082d213d in notify_guest_bh (opaque=0x56040a243ec0) at hw/block/dataplane/virtio-blk.c:75
      #5  0x000056040883dc35 in aio_bh_call (bh=0x56040a243f10) at util/async.c:90
      #6  0x000056040883dccd in aio_bh_poll (ctx=0x560409161980) at util/async.c:118
      #7  0x0000560408842af7 in aio_dispatch (ctx=0x560409161980) at util/aio-posix.c:460
      #8  0x000056040883e068 in aio_ctx_dispatch (source=0x560409161980, callback=0x0, user_data=0x0) at util/async.c:261
      #9  0x00007f10a8fca06d in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
      #10 0x0000560408841445 in glib_pollfds_poll () at util/main-loop.c:215
      #11 0x00005604088414bf in os_host_main_loop_wait (timeout=0) at util/main-loop.c:238
      #12 0x00005604088415c4 in main_loop_wait (nonblocking=0) at util/main-loop.c:514
      #13 0x0000560408416b1e in main_loop () at vl.c:1923
      #14 0x000056040841e0e8 in main (argc=20, argv=0x7ffc2c3f9c58, envp=0x7ffc2c3f9d00) at vl.c:4578
    
    Fix this by cancelling the BH when the virtio dataplane is stopped.
    
    [This is version of the patch was modified as discussed with Philippe on
    the mailing list thread.
    --Stefan]
    
    Reported-by: Yihuang Yu <yihyu@redhat.com>
    Suggested-by: Stefan Hajnoczi <stefanha@redhat.com>
    Fixes: https://bugs.launchpad.net/qemu/+bug/1839428
    Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
    Message-Id: <20190816171503.24761-1-philmd@redhat.com>
    Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
    (cherry picked from commit ebb6ff2)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    philmd authored and mdroth committed Nov 5, 2019
    Copy the full SHA
    01be506 View commit details
    Browse the repository at this point in the history
  2. scsi: lsi: exit infinite loop while executing script (CVE-2019-12068)

    When executing script in lsi_execute_script(), the LSI scsi adapter
    emulator advances 's->dsp' index to read next opcode. This can lead
    to an infinite loop if the next opcode is empty. Move the existing
    loop exit after 10k iterations so that it covers no-op opcodes as
    well.
    
    Reported-by: Bugs SysSec <bugs-syssec@rub.de>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    (cherry picked from commit de594e4)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    bonzini authored and mdroth committed Nov 5, 2019
    Copy the full SHA
    051c9b3 View commit details
    Browse the repository at this point in the history
  3. target/xtensa: regenerate and re-import test_mmuhifi_c3 core

    Overlay part of the test_mmuhifi_c3 core has GPL3 copyright headers in
    it. Fix that by regenerating test_mmuhifi_c3 core overlay and
    re-importing it.
    
    Fixes: d848ea7 ("target/xtensa: add test_mmuhifi_c3 core")
    Reported-by: Thomas Huth <thuth@redhat.com>
    Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
    (cherry picked from commit d5eaec8)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    jcmvbkbc authored and mdroth committed Nov 5, 2019
    Copy the full SHA
    b387531 View commit details
    Browse the repository at this point in the history

Commits on Nov 4, 2019

  1. target/arm: Allow reading flags from FPSCR for M-profile

    rt==15 is a special case when reading the flags: it means the
    destination is APSR. This patch avoids rejecting
    vmrs apsr_nzcv, fpscr
    as illegal instruction.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Christophe Lyon <christophe.lyon@linaro.org>
    Message-id: 20191025095711.10853-1-christophe.lyon@linaro.org
    [PMM: updated the comment]
    Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
    Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
    (cherry picked from commit 2529ab4)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Christophe Lyon authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    cdc6896 View commit details
    Browse the repository at this point in the history
  2. hbitmap: handle set/reset with zero length

    Passing zero length to these functions leads to unpredicted results.
    Zero-length set/reset may occur in active-mirror, on zero-length write
    (which is unlikely, but not guaranteed to never happen).
    
    Let's just do nothing on zero-length request.
    
    Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Message-id: 20191011090711.19940-2-vsementsov@virtuozzo.com
    Reviewed-by: Max Reitz <mreitz@redhat.com>
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit fed33bd)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Vladimir Sementsov-Ogievskiy authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    c0b35d8 View commit details
    Browse the repository at this point in the history
  3. util/hbitmap: strict hbitmap_reset

    hbitmap_reset has an unobvious property: it rounds requested region up.
    It may provoke bugs, like in recently fixed write-blocking mode of
    mirror: user calls reset on unaligned region, not keeping in mind that
    there are possible unrelated dirty bytes, covered by rounded-up region
    and information of this unrelated "dirtiness" will be lost.
    
    Make hbitmap_reset strict: assert that arguments are aligned, allowing
    only one exception when @start + @count == hb->orig_size. It's needed
    to comfort users of hbitmap_next_dirty_area, which cares about
    hb->orig_size.
    
    Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Reviewed-by: Max Reitz <mreitz@redhat.com>
    Message-Id: <20190806152611.280389-1-vsementsov@virtuozzo.com>
    [Maintainer edit: Max's suggestions from on-list. --js]
    [Maintainer edit: Eric's suggestion for aligned macro. --js]
    Signed-off-by: John Snow <jsnow@redhat.com>
    (cherry picked from commit 48557b1)
    *prereq for fed33bd
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Vladimir Sementsov-Ogievskiy authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    fcd7cba View commit details
    Browse the repository at this point in the history
  4. COLO-compare: Fix incorrect if logic

    'colo_mark_tcp_pkt' should return 'true' when packets are the same, and
    'false' otherwise.  However, it returns 'true' when
    'colo_compare_packet_payload' returns non-zero while
    'colo_compare_packet_payload' is just a 'memcmp'.  The result is that
    COLO-compare reports inconsistent TCP packets when they are actually
    the same.
    
    Fixes: f449c9e ("colo: compare the packet based on the tcp sequence number")
    Cc: qemu-stable@nongnu.org
    Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
    Signed-off-by: Fan Yang <Fan_Yang@sjtu.edu.cn>
    Signed-off-by: Jason Wang <jasowang@redhat.com>
    (cherry picked from commit 1e907a3)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Raphus-cucullatus authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    aea18ef View commit details
    Browse the repository at this point in the history
  5. virtio-net: prevent offloads reset on migration

    Currently offloads disabled by guest via the VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET
    command are not preserved on VM migration.
    Instead all offloads reported by guest features (via VIRTIO_PCI_GUEST_FEATURES)
    get enabled.
    What happens is: first the VirtIONet::curr_guest_offloads gets restored and offloads
    are getting set correctly:
    
     #0  qemu_set_offload (nc=0x555556a11400, csum=1, tso4=0, tso6=0, ecn=0, ufo=0) at net/net.c:474
     #1  virtio_net_apply_guest_offloads (n=0x555557701ca0) at hw/net/virtio-net.c:720
     #2  virtio_net_post_load_device (opaque=0x555557701ca0, version_id=11) at hw/net/virtio-net.c:2334
     #3  vmstate_load_state (f=0x5555569dc010, vmsd=0x555556577c80 <vmstate_virtio_net_device>, opaque=0x555557701ca0, version_id=11)
         at migration/vmstate.c:168
     #4  virtio_load (vdev=0x555557701ca0, f=0x5555569dc010, version_id=11) at hw/virtio/virtio.c:2197
     #5  virtio_device_get (f=0x5555569dc010, opaque=0x555557701ca0, size=0, field=0x55555668cd00 <__compound_literal.5>) at hw/virtio/virtio.c:2036
     #6  vmstate_load_state (f=0x5555569dc010, vmsd=0x555556577ce0 <vmstate_virtio_net>, opaque=0x555557701ca0, version_id=11) at migration/vmstate.c:143
     #7  vmstate_load (f=0x5555569dc010, se=0x5555578189e0) at migration/savevm.c:829
     #8  qemu_loadvm_section_start_full (f=0x5555569dc010, mis=0x5555569eee20) at migration/savevm.c:2211
     #9  qemu_loadvm_state_main (f=0x5555569dc010, mis=0x5555569eee20) at migration/savevm.c:2395
     #10 qemu_loadvm_state (f=0x5555569dc010) at migration/savevm.c:2467
     #11 process_incoming_migration_co (opaque=0x0) at migration/migration.c:449
    
    However later on the features are getting restored, and offloads get reset to
    everything supported by features:
    
     #0  qemu_set_offload (nc=0x555556a11400, csum=1, tso4=1, tso6=1, ecn=0, ufo=0) at net/net.c:474
     #1  virtio_net_apply_guest_offloads (n=0x555557701ca0) at hw/net/virtio-net.c:720
     #2  virtio_net_set_features (vdev=0x555557701ca0, features=5104441767) at hw/net/virtio-net.c:773
     #3  virtio_set_features_nocheck (vdev=0x555557701ca0, val=5104441767) at hw/virtio/virtio.c:2052
     #4  virtio_load (vdev=0x555557701ca0, f=0x5555569dc010, version_id=11) at hw/virtio/virtio.c:2220
     #5  virtio_device_get (f=0x5555569dc010, opaque=0x555557701ca0, size=0, field=0x55555668cd00 <__compound_literal.5>) at hw/virtio/virtio.c:2036
     #6  vmstate_load_state (f=0x5555569dc010, vmsd=0x555556577ce0 <vmstate_virtio_net>, opaque=0x555557701ca0, version_id=11) at migration/vmstate.c:143
     #7  vmstate_load (f=0x5555569dc010, se=0x5555578189e0) at migration/savevm.c:829
     #8  qemu_loadvm_section_start_full (f=0x5555569dc010, mis=0x5555569eee20) at migration/savevm.c:2211
     #9  qemu_loadvm_state_main (f=0x5555569dc010, mis=0x5555569eee20) at migration/savevm.c:2395
     #10 qemu_loadvm_state (f=0x5555569dc010) at migration/savevm.c:2467
     #11 process_incoming_migration_co (opaque=0x0) at migration/migration.c:449
    
    Fix this by preserving the state in saved_guest_offloads field and
    pushing out offload initialization to the new post load hook.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Mikhail Sennikovsky <mikhail.sennikovskii@cloud.ionos.com>
    Signed-off-by: Jason Wang <jasowang@redhat.com>
    (cherry picked from commit 7788c3f)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Mikhail Sennikovsky authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    4887acf View commit details
    Browse the repository at this point in the history
  6. virtio: new post_load hook

    Post load hook in virtio vmsd is called early while device is processed,
    and when VirtIODevice core isn't fully initialized.  Most device
    specific code isn't ready to deal with a device in such state, and
    behaves weirdly.
    
    Add a new post_load hook in a device class instead.  Devices should use
    this unless they specifically want to verify the migration stream as
    it's processed, e.g. for bounds checking.
    
    Cc: qemu-stable@nongnu.org
    Suggested-by: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
    Cc: Mikhail Sennikovsky <mikhail.sennikovskii@cloud.ionos.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Jason Wang <jasowang@redhat.com>
    (cherry picked from commit 1dd7138)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    mstsirkin authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    8010d3f View commit details
    Browse the repository at this point in the history
  7. ui: Fix hanging up Cocoa display on macOS 10.15 (Catalina)

    macOS API documentation says that before applicationDidFinishLaunching
    is called, any events will not be processed. However, some events are
    fired before it is called in macOS Catalina. This causes deadlock of
    iothread_lock in handleEvent while it will be released after the
    app_started_sem is posted.
    This patch avoids processing events before the app_started_sem is
    posted to prevent this deadlock.
    
    Buglink: https://bugs.launchpad.net/qemu/+bug/1847906
    Signed-off-by: Hikaru Nishida <hikarupsp@gmail.com>
    Message-id: 20191015010734.85229-1-hikarupsp@gmail.com
    Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    (cherry picked from commit dff742a)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    hikalium authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    6705b93 View commit details
    Browse the repository at this point in the history
  8. mirror: Do not dereference invalid pointers

    mirror_exit_common() may be called twice (if it is called from
    mirror_prepare() and fails, it will be called from mirror_abort()
    again).
    
    In such a case, many of the pointers in the MirrorBlockJob object will
    already be freed.  This can be seen most reliably for s->target, which
    is set to NULL (and then dereferenced by blk_bs()).
    
    Cc: qemu-stable@nongnu.org
    Fixes: 737efc1
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Reviewed-by: John Snow <jsnow@redhat.com>
    Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Message-id: 20191014153931.20699-2-mreitz@redhat.com
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit f93c3ad)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    c0e2fbf View commit details
    Browse the repository at this point in the history
  9. iotests: Test large write request to qcow2 file

    Without HEAD^, the following happens when you attempt a large write
    request to a qcow2 file such that the number of bytes covered by all
    clusters involved in a single allocation will exceed INT_MAX:
    
    (A) handle_alloc_space() decides to fill the whole area with zeroes and
        fails because bdrv_co_pwrite_zeroes() fails (the request is too
        large).
    
    (B) If handle_alloc_space() does not do anything, but merge_cow()
        decides that the requests can be merged, it will create a too long
        IOV that later cannot be written.
    
    (C) Otherwise, all parts will be written separately, so those requests
        will work.
    
    In either B or C, though, qcow2_alloc_cluster_link_l2() will have an
    overflow: We use an int (i) to iterate over nb_clusters, and then
    calculate the L2 entry based on "i << s->cluster_bits" -- which will
    overflow if the range covers more than INT_MAX bytes.  This then leads
    to image corruption because the L2 entry will be wrong (it will be
    recognized as a compressed cluster).
    
    Even if that were not the case, the .cow_end area would be empty
    (because handle_alloc() will cap avail_bytes and nb_bytes at INT_MAX, so
    their difference (which is the .cow_end size) will be 0).
    
    So this test checks that on such large requests, the image will not be
    corrupted.  Unfortunately, we cannot check whether COW will be handled
    correctly, because that data is discarded when it is written to null-co
    (but we have to use null-co, because writing 2 GB of data in a test is
    not quite reasonable).
    
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Signed-off-by: Kevin Wolf <kwolf@redhat.com>
    (cherry picked from commit a1406a9)
     Conflicts:
    	tests/qemu-iotests/group
    *drop context dep. on tests not in 4.1
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    b077ac6 View commit details
    Browse the repository at this point in the history
  10. qcow2: Limit total allocation range to INT_MAX

    When the COW areas are included, the size of an allocation can exceed
    INT_MAX.  This is kind of limited by handle_alloc() in that it already
    caps avail_bytes at INT_MAX, but the number of clusters still reflects
    the original length.
    
    This can have all sorts of effects, ranging from the storage layer write
    call failing to image corruption.  (If there were no image corruption,
    then I suppose there would be data loss because the .cow_end area is
    forced to be empty, even though there might be something we need to
    COW.)
    
    Fix all of it by limiting nb_clusters so the equivalent number of bytes
    will not exceed INT_MAX.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
    Signed-off-by: Kevin Wolf <kwolf@redhat.com>
    (cherry picked from commit d1b9d19)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    XanClic authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    9e51c53 View commit details
    Browse the repository at this point in the history
  11. hw/core/loader: Fix possible crash in rom_copy()

    Both, "rom->addr" and "addr" are derived from the binary image
    that can be loaded with the "-kernel" paramer. The code in
    rom_copy() then calculates:
    
        d = dest + (rom->addr - addr);
    
    and uses "d" as destination in a memcpy() some lines later. Now with
    bad kernel images, it is possible that rom->addr is smaller than addr,
    thus "rom->addr - addr" gets negative and the memcpy() then tries to
    copy contents from the image to a bad memory location. This could
    maybe be used to inject code from a kernel image into the QEMU binary,
    so we better fix it with an additional sanity check here.
    
    Cc: qemu-stable@nongnu.org
    Reported-by: Guangming Liu
    Buglink: https://bugs.launchpad.net/qemu/+bug/1844635
    Message-Id: <20190925130331.27825-1-thuth@redhat.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit e423455)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    huth authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    aae0faa View commit details
    Browse the repository at this point in the history
  12. vhost-user: save features if the char dev is closed

    That way the state can be correctly restored when the device is opened
    again. This might happen if the backend is restarted.
    
    Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1738768
    Reported-by: Pei Zhang <pezhang@redhat.com>
    Fixes: 6ab79a2 ("do not call vhost_net_cleanup() on running net from char user event")
    Cc: ddstreet@canonical.com
    Cc: Michael S. Tsirkin <mst@redhat.com>
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
    Message-Id: <20190924162044.11414-1-amorenoz@redhat.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    (cherry picked from commit c6beefd)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    amorenoz authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    7b404ca View commit details
    Browse the repository at this point in the history
  13. iotests: Test internal snapshots with -blockdev

    Signed-off-by: Kevin Wolf <kwolf@redhat.com>
    Reviewed-by: Peter Krempa <pkrempa@redhat.com>
    Tested-by: Peter Krempa <pkrempa@redhat.com>
    (cherry picked from commit 92b22e7)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Kevin Wolf authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    d868d30 View commit details
    Browse the repository at this point in the history
  14. block/snapshot: Restrict set of snapshot nodes

    Nodes involved in internal snapshots were those that were returned by
    bdrv_next(), inserted and not read-only. bdrv_next() in turn returns all
    nodes that are either the root node of a BlockBackend or monitor-owned
    nodes.
    
    With the typical -drive use, this worked well enough. However, in the
    typical -blockdev case, the user defines one node per option, making all
    nodes monitor-owned nodes. This includes protocol nodes etc. which often
    are not snapshottable, so "savevm" only returns an error.
    
    Change the conditions so that internal snapshot still include all nodes
    that have a BlockBackend attached (we definitely want to snapshot
    anything attached to a guest device and probably also the built-in NBD
    server; snapshotting block job BlockBackends is more of an accident, but
    a preexisting one), but other monitor-owned nodes are only included if
    they have no parents.
    
    This makes internal snapshots usable again with typical -blockdev
    configurations.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: Kevin Wolf <kwolf@redhat.com>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Reviewed-by: Peter Krempa <pkrempa@redhat.com>
    Tested-by: Peter Krempa <pkrempa@redhat.com>
    (cherry picked from commit 05f4ace)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    Kevin Wolf authored and mdroth committed Nov 4, 2019
    Copy the full SHA
    7a8aa6c View commit details
    Browse the repository at this point in the history
Older