1. 13 12月, 2016 2 次提交
    • E
      block: Let write zeroes fallback work even with small max_transfer · dd11d33d
      Eric Blake 提交于
      Commit 443668ca rewrote the write_zeroes logic to guarantee that
      an unaligned request never crosses a cluster boundary.  But
      in the rewrite, the new code assumed that at most one iteration
      would be needed to get to an alignment boundary.
      
      However, it is easy to trigger an assertion failure: the Linux
      kernel limits loopback devices to advertise a max_transfer of
      only 64k.  Any operation that requires falling back to writes
      rather than more efficient zeroing must obey max_transfer during
      that fallback, which means an unaligned head may require multiple
      iterations of the write fallbacks before reaching the aligned
      boundaries, when layering a format with clusters larger than 64k
      atop the protocol of file access to a loopback device.
      
      Test case:
      
      $ qemu-img create -f qcow2 -o cluster_size=1M file 10M
      $ losetup /dev/loop2 /path/to/file
      $ qemu-io -f qcow2 /dev/loop2
      qemu-io> w 7m 1k
      qemu-io> w -z 8003584 2093056
      
      In fairness to Denis (as the original listed author of the culprit
      commit), the faulty logic for at most one iteration is probably all
      my fault in reworking his idea.  But the solution is to restore what
      was in place prior to that commit: when dealing with an unaligned
      head or tail, iterate as many times as necessary while fragmenting
      the operation at max_transfer boundaries.
      Reported-by: NEd Swierk <eswierk@skyportsystems.com>
      CC: qemu-stable@nongnu.org
      CC: Denis V. Lunev <den@openvz.org>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      (cherry picked from commit b2f95fee)
      Signed-off-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      dd11d33d
    • E
      qcow2: Inform block layer about discard boundaries · c4bf37e0
      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>
      (cherry picked from commit ecdbead6)
      Signed-off-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      c4bf37e0
  2. 09 12月, 2016 5 次提交
  3. 02 12月, 2016 1 次提交
  4. 19 11月, 2016 2 次提交
  5. 03 11月, 2016 30 次提交