1. 13 12月, 2016 3 次提交
    • E
      block: Return -ENOTSUP rather than assert on unaligned discards · 5e4eb851
      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>
      (cherry picked from commit 49228d1e)
      Signed-off-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      5e4eb851
    • 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 29 次提交