1. 15 6月, 2017 2 次提交
    • V
      nbd: rename read_sync and friends · d1fdf257
      Vladimir Sementsov-Ogievskiy 提交于
      Rename
        nbd_wr_syncv -> nbd_rwv
        read_sync -> nbd_read
        read_sync_eof -> nbd_read_eof
        write_sync -> nbd_write
        drop_sync -> nbd_drop
      
      1. nbd_ prefix
         read_sync and write_sync are already shared, so it is good to have a
         namespace prefix. drop_sync will be shared, and read_sync_eof is
         related to read_sync, so let's rename them all.
      
      2. _sync suffix
         _sync is related to the fact that nbd_wr_syncv doesn't return if a
         write to socket returns EAGAIN. The first implementation of
         nbd_wr_syncv (was wr_sync in 7a5ca864) just loops while getting
         EAGAIN, the current implementation yields in this case.
         Why we want to get rid of it:
         - it is normal for r/w functions to be synchronous, so having an
           additional suffix for it looks redundant (contrariwise, we have
           _aio suffix for async functions)
         - _sync suffix in block layer is used when function does flush (so
           using it for other thing is confusing a bit)
         - keep function names short after adding nbd_ prefix
      
      3. for nbd_wr_syncv let's use more common notation 'rw'
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Message-Id: <20170602150150.258222-2-vsementsov@virtuozzo.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      d1fdf257
    • E
      nbd: Fix regression on resiliency to port scan · 0c9390d9
      Eric Blake 提交于
      Back in qemu 2.5, qemu-nbd was immune to port probes (a transient
      server would not quit, regardless of how many probe connections
      came and went, until a connection actually negotiated).  But we
      broke that in commit ee7d7aab when removing the return value to
      nbd_client_new(), although that patch also introduced a bug causing
      an assertion failure on a client that fails negotiation.  We then
      made it worse during refactoring in commit 1a6245a5 (a segfault
      before we could even assert); the (masked) assertion was cleaned
      up in d3780c2d (still in 2.6), and just recently we finally fixed
      the segfault ("nbd: Fully intialize client in case of failed
      negotiation").  But that still means that ever since we added
      TLS support to qemu-nbd, we have been vulnerable to an ill-timed
      port-scan being able to cause a denial of service by taking down
      qemu-nbd before a real client has a chance to connect.
      
      Since negotiation is now handled asynchronously via coroutines,
      we no longer have a synchronous point of return by re-adding a
      return value to nbd_client_new().  So this patch instead wires
      things up to pass the negotiation status through the close_fn
      callback function.
      
      Simple test across two terminals:
      $ qemu-nbd -f raw -p 30001 file
      $ nmap 127.0.0.1 -p 30001 && \
        qemu-io -c 'r 0 512' -f raw nbd://localhost:30001
      
      Note that this patch does not change what constitutes successful
      negotiation (thus, a client must enter transmission phase before
      that client can be considered as a reason to terminate the server
      when the connection ends).  Perhaps we may want to tweak things
      in a later patch to also treat a client that uses NBD_OPT_ABORT
      as being a 'successful' negotiation (the client correctly talked
      the NBD protocol, and informed us it was not going to use our
      export after all), but that's a discussion for another day.
      
      Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1451614Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20170608222617.20376-1-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      0c9390d9
  2. 08 6月, 2017 1 次提交
    • E
      nbd: Fully initialize client in case of failed negotiation · df8ad9f1
      Eric Blake 提交于
      If a non-NBD client connects to qemu-nbd, we would end up with
      a SIGSEGV in nbd_client_put() because we were trying to
      unregister the client's association to the export, even though
      we skipped inserting the client into that list.  Easy trigger
      in two terminals:
      
      $ qemu-nbd -p 30001 --format=raw file
      $ nmap 127.0.0.1 -p 30001
      
      nmap claims that it thinks it connected to a pago-services1
      server (which probably means nmap could be updated to learn the
      NBD protocol and give a more accurate diagnosis of the open
      port - but that's not our problem), then terminates immediately,
      so our call to nbd_negotiate() fails.  The fix is to reorder
      nbd_co_client_start() to ensure that all initialization occurs
      before we ever try talking to a client in nbd_negotiate(), so
      that the teardown sequence on negotiation failure doesn't fault
      while dereferencing a half-initialized object.
      
      While debugging this, I also noticed that nbd_update_server_watch()
      called by nbd_client_closed() was still adding a channel to accept
      the next client, even when the state was no longer RUNNING.  That
      is fixed by making nbd_can_accept() pay attention to the current
      state.
      
      Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1451614Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20170527030421.28366-1-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      df8ad9f1
  3. 07 6月, 2017 2 次提交
    • V
      nbd: add errp to read_sync, write_sync and drop_sync · e44ed99d
      Vladimir Sementsov-Ogievskiy 提交于
      There a lot of calls of these functions, which already have errp, which
      they are filling themselves. On the other hand, nbd_wr_syncv has errp
      parameter too, so it would be great to connect them.
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Message-Id: <20170516094533.6160-5-vsementsov@virtuozzo.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      e44ed99d
    • V
      nbd: read_sync and friends: return 0 on success · f5d406fe
      Vladimir Sementsov-Ogievskiy 提交于
      functions read_sync, drop_sync, write_sync, and also
      nbd_negotiate_write, nbd_negotiate_read, nbd_negotiate_drop_sync
      returns number of processed bytes. But what this number can be,
      except requested number of bytes?
      
      Actually, underlying nbd_wr_syncv function returns a value >= 0 and
      != requested_bytes only on eof on read operation. So, firstly, it is
      impossible on write (let's add an assert) and on read it actually
      means, that communication is broken (except nbd_receive_reply, see
      below).
      
      Most of callers operate like this:
         if (func(..., size) != size) {
             /* error path */
         }
      , i.e.:
        1. They are not interested in partial success
        2. Extra duplications in code (especially bad are duplications of
           magic numbers)
        3. User doesn't see actual error message, as return code is lost.
           (this patch doesn't fix this point, but it makes fixing easier)
      
      Several callers handles ret >= 0 and != requested-size separately, by
      just returning EINVAL in this case. This patch makes read_sync and
      friends return EINVAL in this case, so final behavior is the same.
      
      And only one caller - nbd_receive_reply() does something not so
      obvious. It returns EINVAL for ret > 0 and != requested-size, like
      previous group, but for ret == 0 it returns 0. The only caller of
      nbd_receive_reply() - nbd_read_reply_entry() handles ret == 0 in the
      same way as ret < 0, so for now it doesn't matter. However, in
      following commits error path handling will be improved and we'll need
      to distinguish success from fail in this case too. So, this patch adds
      separate helper for this case - read_sync_eof.
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Message-Id: <20170516094533.6160-3-vsementsov@virtuozzo.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      f5d406fe
  4. 01 3月, 2017 3 次提交
  5. 21 2月, 2017 1 次提交
  6. 04 1月, 2017 1 次提交
  7. 02 11月, 2016 9 次提交
    • E
      nbd: Implement NBD_CMD_WRITE_ZEROES on server · 1f4d6d18
      Eric Blake 提交于
      Upstream NBD protocol recently added the ability to efficiently
      write zeroes without having to send the zeroes over the wire,
      along with a flag to control whether the client wants to allow
      a hole.
      
      Note that when it comes to requiring full allocation, vs.
      permitting optimizations, the NBD spec intentionally picked a
      different sense for the flag; the rules in qemu are:
      MAY_UNMAP == 0: must write zeroes
      MAY_UNMAP == 1: may use holes if reads will see zeroes
      
      while in NBD, the rules are:
      FLAG_NO_HOLE == 1: must write zeroes
      FLAG_NO_HOLE == 0: may use holes if reads will see zeroes
      
      In all cases, the 'may use holes' scenario is optional (the
      server need not use a hole, and must not use a hole if
      subsequent reads would not see zeroes).
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-16-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      1f4d6d18
    • E
      nbd: Improve server handling of shutdown requests · b6f5d3b5
      Eric Blake 提交于
      NBD commit 6d34500b clarified how clients and servers are supposed
      to behave before closing a connection. It added NBD_REP_ERR_SHUTDOWN
      (for the server to announce it is about to go away during option
      haggling, so the client should quit sending NBD_OPT_* other than
      NBD_OPT_ABORT) and ESHUTDOWN (for the server to announce it is about
      to go away during transmission, so the client should quit sending
      NBD_CMD_* other than NBD_CMD_DISC).  It also clarified that
      NBD_OPT_ABORT gets a reply, while NBD_CMD_DISC does not.
      
      This patch merely adds the missing reply to NBD_OPT_ABORT and teaches
      the client to recognize server errors.  Actually teaching the server
      to send NBD_REP_ERR_SHUTDOWN or ESHUTDOWN would require knowing that
      the server has been requested to shut down soon (maybe we could do
      that by installing a SIGINT handler in qemu-nbd, which transitions
      from RUNNING to a new state that waits for the client to react,
      rather than just out-right quitting - but that's a bigger task for
      another day).
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-15-git-send-email-eblake@redhat.com>
      [Move dummy ESHUTDOWN to include/qemu/osdep.h. - Paolo]
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      b6f5d3b5
    • E
      nbd: Support shorter handshake · c203c59a
      Eric Blake 提交于
      The NBD Protocol allows the server and client to mutually agree
      on a shorter handshake (omit the 124 bytes of reserved 0), via
      the server advertising NBD_FLAG_NO_ZEROES and the client
      acknowledging with NBD_FLAG_C_NO_ZEROES (only possible in
      newstyle, whether or not it is fixed newstyle).  It doesn't
      shave much off the wire, but we might as well implement it.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlex Bligh <alex@alex.org.uk>
      Message-Id: <1476469998-28592-13-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      c203c59a
    • E
      nbd: Send message along with server NBD_REP_ERR errors · 36683283
      Eric Blake 提交于
      The NBD Protocol allows us to send human-readable messages
      along with any NBD_REP_ERR error during option negotiation;
      make use of this fact for clients that know what to do with
      our message.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-8-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      36683283
    • E
      nbd: Share common reply-sending code in server · 526e5c65
      Eric Blake 提交于
      Rather than open-coding NBD_REP_SERVER, reuse the code we
      already have by adding a length parameter.  Additionally,
      the refactoring will make adding NBD_OPT_GO in a later patch
      easier.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-7-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      526e5c65
    • E
      nbd: Rename struct nbd_request and nbd_reply · ed2dd912
      Eric Blake 提交于
      Our coding convention prefers CamelCase names, and we already
      have other existing structs with NBDFoo naming.  Let's be
      consistent, before later patches add even more structs.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-6-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      ed2dd912
    • E
      nbd: Rename NBDRequest to NBDRequestData · 315f78ab
      Eric Blake 提交于
      We have both 'struct NBDRequest' and 'struct nbd_request'; making
      it confusing to see which does what.  Furthermore, we want to
      rename nbd_request to align with our normal CamelCase naming
      conventions.  So, rename the struct which is used to associate
      the data received during request callbacks, while leaving the
      shorter name for the description of the request sent over the
      wire in the NBD protocol.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-4-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      315f78ab
    • E
      nbd: Treat flags vs. command type as separate fields · b626b51a
      Eric Blake 提交于
      Current upstream NBD documents that requests have a 16-bit flags,
      followed by a 16-bit type integer; although older versions mentioned
      only a 32-bit field with masking to find flags.  Since the protocol
      is in network order (big-endian over the wire), the ABI is unchanged;
      but dealing with the flags as a separate field rather than masking
      will make it easier to add support for upcoming NBD extensions that
      increase the number of both flags and commands.
      
      Improve some comments in nbd.h based on the current upstream
      NBD protocol (https://github.com/yoe/nbd/blob/master/doc/proto.md),
      and touch some nearby code to keep checkpatch.pl happy.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-3-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      b626b51a
    • E
      nbd: Add qemu-nbd -D for human-readable description · b1a75b33
      Eric Blake 提交于
      The NBD protocol allows servers to advertise a human-readable
      description alongside an export name during NBD_OPT_LIST.  Add
      an option to pass through the user's string to the NBD client.
      
      Doing this also makes it easier to test commit 200650d4, which
      is the client counterpart of receiving the description.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1476469998-28592-2-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      b1a75b33
  8. 27 10月, 2016 1 次提交
  9. 06 9月, 2016 1 次提交
    • K
      nbd-server: Use a separate BlockBackend · cd7fca95
      Kevin Wolf 提交于
      The builtin NBD server uses its own BlockBackend now instead of reusing
      the monitor/guest device one.
      
      This means that it has its own writethrough setting now. The builtin
      NBD server always uses writeback caching now regardless of whether the
      guest device has WCE enabled. qemu-nbd respects the cache mode given on
      the command line.
      
      We still need to keep a reference to the monitor BB because we put an
      eject notifier on it, but we don't use it for any I/O.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      cd7fca95
  10. 04 8月, 2016 2 次提交
    • E
      nbd: Limit nbdflags to 16 bits · 7423f417
      Eric Blake 提交于
      Rather than asserting that nbdflags is within range, just give
      it the correct type to begin with :)  nbdflags corresponds to
      the per-export portion of NBD Protocol "transmission flags", which
      is 16 bits in response to NBD_OPT_EXPORT_NAME and NBD_OPT_GO.
      
      Furthermore, upstream NBD has never passed the global flags to
      the kernel via ioctl(NBD_SET_FLAGS) (the ioctl was first
      introduced in NBD 2.9.22; then a latent bug in NBD 3.1 actually
      tried to OR the global flags with the transmission flags, with
      the disaster that the addition of NBD_FLAG_NO_ZEROES in 3.9
      caused all earlier NBD 3.x clients to treat every export as
      read-only; NBD 3.10 and later intentionally clip things to 16
      bits to pass only transmission flags).  Qemu should follow suit,
      since the current two global flags (NBD_FLAG_FIXED_NEWSTYLE
      and NBD_FLAG_NO_ZEROES) have no impact on the kernel's behavior
      during transmission.
      
      CC: qemu-stable@nongnu.org
      Signed-off-by: NEric Blake <eblake@redhat.com>
      
      Message-Id: <1469129688-22848-3-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      7423f417
    • E
      nbd: Fix bad flag detection on server · 5bee0f47
      Eric Blake 提交于
      Commit ab7c548e added a check for invalid flags, but used an
      early return on error instead of properly going through the
      cleanup label.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      
      Message-Id: <1469129688-22848-2-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      5bee0f47
  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. 17 6月, 2016 8 次提交
    • E
      nbd: Avoid magic number for NBD max name size · 943cec86
      Eric Blake 提交于
      Declare a constant and use that when determining if an export
      name fits within the constraints we are willing to support.
      
      Note that upstream NBD recently documented that clients MUST
      support export names of 256 bytes (not including trailing NUL),
      and SHOULD support names up to 4096 bytes.  4096 is a bit big
      (we would lose benefits of stack-allocation of a name array),
      and we already have other limits in place (for example, qcow2
      snapshot names are clamped around 1024).  So for now, just
      stick to the required minimum, as that's easier to audit than
      a full-scale support for larger names.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      
      Message-Id: <1463006384-7734-12-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      943cec86
    • E
      nbd: Group all Linux-specific ioctl code in one place · 98494e3b
      Eric Blake 提交于
      NBD ioctl()s are used to manage an NBD client session where
      initial handshake is done in userspace, but then the transmission
      phase is handed off to the kernel through a /dev/nbdX device.
      As such, all ioctls sent to the kernel on the /dev/nbdX fd belong
      in client.c; nbd_disconnect() was out-of-place in server.c.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1463006384-7734-7-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      98494e3b
    • E
      nbd: Reject unknown request flags · ab7c548e
      Eric Blake 提交于
      The NBD protocol says that clients should not send a command flag
      that has not been negotiated (whether by the client requesting an
      option during a handshake, or because we advertise support for the
      flag in response to NBD_OPT_EXPORT_NAME), and that servers should
      reject invalid flags with EINVAL.  We were silently ignoring the
      flags instead.  The client can't rely on our behavior, since it is
      their fault for passing the bad flag in the first place, but it's
      better to be robust up front than to possibly behave differently
      than the client was expecting with the attempted flag.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlex Bligh <alex@alex.org.uk>
      Message-Id: <1463006384-7734-6-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      ab7c548e
    • E
      nbd: Improve server handling of bogus commands · 29b6c3b3
      Eric Blake 提交于
      We have a few bugs in how we handle invalid client commands:
      
      - A client can send an NBD_CMD_DISC where from + len overflows,
      convincing us to reply with an error and stay connected, even
      though the protocol requires us to silently disconnect. Fix by
      hoisting the special case sooner.
      
      - A client can send an NBD_CMD_WRITE where from + len overflows,
      where we reply to the client with EINVAL without consuming the
      payload; this will normally cause us to fail if the next thing
      read is not the right magic, but in rare cases, could cause us
      to interpret the data payload as valid commands and do things
      not requested by the client. Fix by adding a complete flag to
      track whether we are in sync or must disconnect.
      
      Furthermore, we have split the checks for bogus from/len across
      two functions, when it is easier to do it all at once.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1463006384-7734-5-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      29b6c3b3
    • E
      nbd: Quit server after any write error · 63d5ef86
      Eric Blake 提交于
      We should never ignore failure from nbd_negotiate_send_rep(); if
      we are unable to write to the client, then it is not worth trying
      to continue the negotiation.  Fortunately, the problem is not
      too severe - chances are that the errors being ignored here (mainly
      inability to write the reply to the client) are indications of
      a closed connection or something similar, which will also affect
      the next attempt to interact with the client and eventually reach
      a point where the errors are detected to end the loop.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1463006384-7734-4-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      63d5ef86
    • E
      nbd: More debug typo fixes, use correct formats · 2cb34749
      Eric Blake 提交于
      Clean up some debug message oddities missed earlier; this includes
      some typos, and recognizing that %d is not necessarily compatible
      with uint32_t. Also add a couple messages that I found useful
      while debugging things.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      
      Message-Id: <1463006384-7734-3-git-send-email-eblake@redhat.com>
      [Do not use PRIx16, clang complains. - Paolo]
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      2cb34749
    • E
      nbd: Use BDRV_REQ_FUA for better FUA where supported · a0c30369
      Eric Blake 提交于
      Rather than always flushing ourselves, let the block layer
      forward the FUA on to the underlying device - where all
      underlying layers also understand FUA, we are now more
      efficient; and where any underlying layer doesn't understand
      it, now the block layer takes care of the full flush fallback
      on our behalf.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1463006384-7734-2-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      a0c30369
    • P
      nbd: Don't use *_to_cpup() functions · 773dce3c
      Peter Maydell 提交于
      The *_to_cpup() functions are not very useful, as they simply do
      a pointer dereference and then a *_to_cpu(). Instead use either:
       * ld*_*_p(), if the data is at an address that might not be
         correctly aligned for the load
       * a local dereference and *_to_cpu(), if the pointer is
         the correct type and known to be correctly aligned
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      Message-Id: <1465570836-22211-1-git-send-email-peter.maydell@linaro.org>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      773dce3c
  14. 29 5月, 2016 1 次提交
    • E
      nbd: Don't trim unrequested bytes · 353ab969
      Eric Blake 提交于
      Similar to commit df7b97ff, we are mishandling clients that
      give an unaligned NBD_CMD_TRIM request, and potentially
      trimming bytes that occur before their request; which in turn
      can cause potential unintended data loss (unlikely in
      practice, since most clients are sane and issue aligned trim
      requests).  However, while we fixed read and write by switching
      to the byte interfaces of blk_, we don't yet have a byte
      interface for discard.  On the other hand, trim is advisory, so
      rounding the user's request to simply ignore the first and last
      unaligned sectors (or the entire request, if it is sub-sector
      in length) is just fine.
      
      CC: qemu-stable@nongnu.org
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1464173965-9694-1-git-send-email-eblake@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      353ab969
  15. 12 5月, 2016 1 次提交
    • E
      block: Allow BDRV_REQ_FUA through blk_pwrite() · 8341f00d
      Eric Blake 提交于
      We have several block drivers that understand BDRV_REQ_FUA,
      and emulate it in the block layer for the rest by a full flush.
      But without a way to actually request BDRV_REQ_FUA during a
      pass-through blk_pwrite(), FUA-aware block drivers like NBD are
      forced to repeat the emulation logic of a full flush regardless
      of whether the backend they are writing to could do it more
      efficiently.
      
      This patch just wires up a flags argument; followup patches
      will actually make use of it in the NBD driver and in qemu-io.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Acked-by: NDenis V. Lunev <den@openvz.org>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      8341f00d
  16. 22 4月, 2016 1 次提交
    • E
      nbd: Don't mishandle unaligned client requests · df7b97ff
      Eric Blake 提交于
      The NBD protocol does not (yet) force any alignment constraints
      on clients.  Even though qemu NBD clients always send requests
      that are aligned to 512 bytes, we must be prepared for non-qemu
      clients that don't care about alignment (even if it means they
      are less efficient).  Our use of blk_read() and blk_write() was
      silently operating on the wrong file offsets when the client
      made an unaligned request, corrupting the client's data (but
      as the client already has control over the file we are serving,
      I don't think it is a security hole, per se, just a data
      corruption bug).
      
      Note that in the case of NBD_CMD_READ, an unaligned length could
      cause us to return up to 511 bytes of uninitialized trailing
      garbage from blk_try_blockalign() - hopefully nothing sensitive
      from the heap's prior usage is ever leaked in that manner.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NFam Zheng <famz@redhat.com>
      Tested-by: NKevin Wolf <kwolf@redhat.com>
      Message-id: 1461249750-31928-1-git-send-email-eblake@redhat.com
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      df7b97ff
  17. 15 4月, 2016 1 次提交
    • E
      nbd: Don't kill server on client that doesn't request TLS · d1129a8a
      Eric Blake 提交于
      Upstream NBD documents (as of commit 4feebc95) that servers MAY
      choose to operate in a conditional mode, where it is up to the
      client whether to use TLS.  For qemu's case, we want to always be
      in FORCEDTLS mode, because of the risk of man-in-the-middle
      attacks, and since we never export more than one device; likewise,
      the qemu client will ALWAYS send NBD_OPT_STARTTLS as its first
      option.  But now that SELECTIVETLS servers exist, it is feasible
      to encounter a (non-qemu) client that is programmed to talk to
      such a server, and does not do NBD_OPT_STARTTLS first, but rather
      wants to probe if it can use a non-encrypted export.
      
      The NBD protocol documents that we should let such a client
      continue trying, on the grounds that maybe the client will get the
      hint to send NBD_OPT_STARTTLS, rather than immediately dropping
      the connection.
      
      Note that NBD_OPT_EXPORT_NAME is a special case: since it is the
      only option request that can't have an error return, we have to
      (continue to) drop the connection on that one; rather, what we are
      fixing here is that all other replies prior to TLS initiation tell
      the client NBD_REP_ERR_TLS_REQD, but keep the connection alive.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-id: 1460671343-18485-1-git-send-email-eblake@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      d1129a8a
  18. 08 4月, 2016 3 次提交