1. 31 8月, 2018 1 次提交
  2. 25 8月, 2018 5 次提交
    • M
      json: Clean up headers · 86cdf9ec
      Markus Armbruster 提交于
      The JSON parser has three public headers, json-lexer.h, json-parser.h,
      json-streamer.h.  They all contain stuff that is of no interest
      outside qobject/json-*.c.
      
      Collect the public interface in include/qapi/qmp/json-parser.h, and
      everything else in qobject/json-parser-int.h.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180823164025.12553-54-armbru@redhat.com>
      86cdf9ec
    • M
      json: Pass lexical errors and limit violations to callback · 84a56f38
      Markus Armbruster 提交于
      The callback to consume JSON values takes QObject *json, Error *err.
      If both are null, the callback is supposed to make up an error by
      itself.  This sucks.
      
      qjson.c's consume_json() neglects to do so, which makes
      qobject_from_json() null instead of failing.  I consider that a bug.
      
      The culprit is json_message_process_token(): it passes two null
      pointers when it runs into a lexical error or a limit violation.  Fix
      it to pass a proper Error object then.  Update the callbacks:
      
      * monitor.c's handle_qmp_command(): the code to make up an error is
        now dead, drop it.
      
      * qga/main.c's process_event(): lumps the "both null" case together
        with the "not a JSON object" case.  The former is now gone.  The
        error message "Invalid JSON syntax" is misleading for the latter.
        Improve it to "Input must be a JSON object".
      
      * qobject/qjson.c's consume_json(): no update; check-qjson
        demonstrates qobject_from_json() now sets an error on lexical
        errors, but still doesn't on some other errors.
      
      * tests/libqtest.c's qmp_response(): the Error object is now reliable,
        so use it to improve the error message.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180823164025.12553-40-armbru@redhat.com>
      84a56f38
    • M
      json: Redesign the callback to consume JSON values · 62815d85
      Markus Armbruster 提交于
      The classical way to structure parser and lexer is to have the client
      call the parser to get an abstract syntax tree, the parser call the
      lexer to get the next token, and the lexer call some function to get
      input characters.
      
      Another way to structure them would be to have the client feed
      characters to the lexer, the lexer feed tokens to the parser, and the
      parser feed abstract syntax trees to some callback provided by the
      client.  This way is more easily integrated into an event loop that
      dispatches input characters as they arrive.
      
      Our JSON parser is kind of between the two.  The lexer feeds tokens to
      a "streamer" instead of a real parser.  The streamer accumulates
      tokens until it got the sequence of tokens that comprise a single JSON
      value (it counts curly braces and square brackets to decide).  It
      feeds those token sequences to a callback provided by the client.  The
      callback passes each token sequence to the parser, and gets back an
      abstract syntax tree.
      
      I figure it was done that way to make a straightforward recursive
      descent parser possible.  "Get next token" becomes "pop the first
      token off the token sequence".  Drawback: we need to store a complete
      token sequence.  Each token eats 13 + input characters + malloc
      overhead bytes.
      
      Observations:
      
      1. This is not the only way to use recursive descent.  If we replaced
         "get next token" by a coroutine yield, we could do without a
         streamer.
      
      2. The lexer reports errors by passing a JSON_ERROR token to the
         streamer.  This communicates the offending input characters and
         their location, but no more.
      
      3. The streamer reports errors by passing a null token sequence to the
         callback.  The (already poor) lexical error information is thrown
         away.
      
      4. Having the callback receive a token sequence duplicates the code to
         convert token sequence to abstract syntax tree in every callback.
      
      5. Known bug: the streamer silently drops incomplete token sequences.
      
      This commit rectifies 4. by lifting the call of the parser from the
      callbacks into the streamer.  Later commits will address 3. and 5.
      
      The lifting removes a bug from qjson.c's parse_json(): it passed a
      pointer to a non-null Error * in certain cases, as demonstrated by
      check-qjson.c.
      
      json_parser_parse() is now unused.  It's a stupid wrapper around
      json_parser_parse_err().  Drop it, and rename json_parser_parse_err()
      to json_parser_parse().
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180823164025.12553-35-armbru@redhat.com>
      62815d85
    • M
      test-qga: Clean up how we test QGA synchronization · e2f64a68
      Markus Armbruster 提交于
      To permit recovering from arbitrary JSON parse errors, the JSON parser
      resets itself on lexical errors.  We recommend sending a 0xff byte for
      that purpose, and test-qga covers this usage since commit 5229564b.
      That commit had to add an ugly hack to qmp_fd_vsend() to make capable
      of sending this byte (it's designed to send only valid JSON).
      
      The previous commit added a way to send arbitrary text.  Put that to
      use for this purpose, and drop the hack from qmp_fd_vsend().
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180823164025.12553-8-armbru@redhat.com>
      e2f64a68
    • M
      qmp-test: Cover syntax and lexical errors · aed877c5
      Markus Armbruster 提交于
      qmp-test neglects to cover QMP input that isn't valid JSON.  libqtest
      doesn't let us send such input.  Add qtest_qmp_send_raw() for this
      purpose, and put it to use in qmp-test.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180823164025.12553-7-armbru@redhat.com>
      [Commit message typo fixed]
      aed877c5
  3. 24 8月, 2018 1 次提交
    • T
      tests: Skip old versioned machine types in quick testing mode · 1f4a0d81
      Thomas Huth 提交于
      The tests that check something for all machine types currently spend
      a lot of time checking old machine types (like "pc-i440fx-2.0" for
      example). The chances that we find something new there in addition
      to checking the latest version of a machine type are pretty low, so
      we should not waste the time of the developers by testing this again
      and again in the "quick" testing mode.
      Thus let's add some code to determine whether we are testing a current
      machine type or an old one, and only test the old types if we are
      running in "SPEED=slow" mode.
      This decreases the testing time quite a bit now, e.g. the qom-test
      now finishes within 4 seconds for qemu-system-x86_64 instead of 30
      seconds when testing all machines.
      Signed-off-by: NThomas Huth <thuth@redhat.com>
      Message-Id: <1534419358-10932-6-git-send-email-thuth@redhat.com>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      1f4a0d81
  4. 16 8月, 2018 12 次提交
    • M
      libqtest: Improve error reporting for bad read from QEMU · f9e986d2
      Markus Armbruster 提交于
      When read() from the qtest socket or the QMP socket fails or EOFs, we
      report "Broken pipe" and exit(1).  This commonly happens when QEMU
      crashes.  It also happens when QEMU refuses to run because the test
      passed it bad arguments.  Sadly, we neglect to report either.
      
      Improve this by calling abort() instead of exit(1), so kill_qemu()
      runs, and reports how QEMU died.  This improves error reporting to
      something like
      
          /x86_64/device/introspect/list: Broken pipe
          tests/libqtest.c:129: kill_qemu() detected QEMU death from signal 6 (Aborted) (dumped core)
      
      Three exit() remain in libqtest.c:
      
      * In qmp_response(), when we can't parse a QMP reply read from the QMP
        socket.  Change to abort() for consistency.
      
      * In qtest_qemu_binary(), when QTEST_QEMU_BINARY isn't in the
        environment.  This can only happen before we start QEMU.  Leave
        alone.
      
      * In qtest_init_without_qmp_handshake(), when the fork()ed child fails
        to execlp().  Leave alone.
      
      exit() elsewhere are unlikely due to QEMU dying on us.  If that should
      turn out to be wrong, we can move kill_qemu() from @abrt_hooks to
      atexit() or something.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <20180815141945.10457-2-armbru@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      [Commit message tweaked slightly]
      f9e986d2
    • E
      tests/libqtest: Improve kill_qemu() · 71a268a5
      Eric Blake 提交于
      In kill_qemu() we have an assert that checks that the QEMU process
      didn't dump core:
                  assert(!WCOREDUMP(wstatus));
      
      Unfortunately the WCOREDUMP macro here means the resulting message
      is not very easy to comprehend on at least some systems:
      
      ahci-test: tests/libqtest.c:113: kill_qemu: Assertion `!(((__extension__ (((union { __typeof(wstatus) __in; int __i; }) { .__in = (wstatus) }).__i))) & 0x80)' failed.
      
      and it doesn't identify what signal the process took. What's more,
      WCOREDUMP is not reliable - in some cases, setrlimit() coupled with
      kernel dump settings can result in the flag not being set.  It's
      better to log ALL death by signal, instead of caring whether a core
      dump was attempted (although once we know a signal happened, also
      mentioning if a core dump is present can be helpful).
      
      Furthermore, we are NOT detecting EINTR (while EINTR shouldn't be
      happening if we didn't install signal handlers, it's still better
      to always be robust).
      
      Finally, even non-signal death with a non-zero status is suspicious,
      since qemu's SIGINT handler is supposed to result in exit(0).
      
      Instead of using a raw assert, print the information in an
      easier to understand way:
      
      /i386/ahci/sanity: tests/libqtest.c:129: kill_qemu() detected QEMU death from signal 11 (Segmentation fault) (core dumped)
      
      (Of course, the really useful information would be why the QEMU
      process dumped core in the first place, but we don't have that
      by the time the test program has picked up the exit status.)
      Suggested-by: NPeter Maydell <peter.maydell@linaro.org>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180810132800.38549-1-eblake@redhat.com>
      Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
      [Core dump reporting and commit message tweaked]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      71a268a5
    • M
      libqtest: Rename qtest_FOOv() to qtest_vFOO() for consistency · 248eef02
      Markus Armbruster 提交于
      13 of 13 C99 library function pairs taking ... or a va_list parameter
      are called FOO() and vFOO().  In QEMU, we sometimes call the one
      taking a va_list FOOv() instead.  Bad taste.  libqtest.h uses both
      spellings.  Normalize it to the standard spelling.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-24-armbru@redhat.com>
      248eef02
    • M
      libqtest: Replace qtest_startf() by qtest_initf() · 88b988c8
      Markus Armbruster 提交于
      qtest_init() creates a new QTestState, and leaves @global_qtest alone.
      qtest_start() additionally assigns it to @global_qtest, but
      qtest_startf() additionally assigns NULL to @global_qtest.  This makes
      no sense.  Replace it by qtest_initf() that works like qtest_init(),
      i.e. leaves @global_qtest alone.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-23-armbru@redhat.com>
      88b988c8
    • M
      tests: New helper qtest_qmp_receive_success() · 3cd46d42
      Markus Armbruster 提交于
      Commit b21373d0 copied wait_command() from tests/migration-test.c
      to tests/tpm-util.c.  Replace both copies by new libqtest helper
      qtest_qmp_receive_success().  Also use it to simplify
      qtest_qmp_device_del().
      
      Bonus: gets rid of a non-literal format string.  A step towards
      compile-time format string checking without triggering
      -Wformat-nonliteral.
      
      Cc: Thomas Huth <thuth@redhat.com>
      Cc: Juan Quintela <quintela@redhat.com>
      Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
      Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NJuan Quintela <quintela@redhat.com>
      Reviewed-by: NStefan Berger <stefanb@linux.vnet.ibm.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-17-armbru@redhat.com>
      3cd46d42
    • M
      tests: Clean up string interpolation around qtest_qmp_device_add() · 82cab70b
      Markus Armbruster 提交于
      Leaving interpolation into JSON to qmp() is more robust than building
      QMP input manually, as explained in the commit before previous.
      
      qtest_qmp_device_add() and its wrappers interpolate into JSON as
      follows:
      
      * qtest_qmp_device_add() interpolates members into a JSON object.
      
      * So do its wrappers qpci_plug_device_test() and usb_test_hotplug().
      
      * usb_test_hotplug() additionally interpolates strings and numbers
        into JSON strings.
      
      Clean them up:
      
      * Have qtest_qmp_device_add() take its extra device properties as
        arguments for qdict_from_jsonf_nofail() instead of a string
        containing JSON members.
      
      * Drop qpci_plug_device_test(), use qtest_qmp_device_add()
        directly.
      
      * Change usb_test_hotplug() parameter @port to string, to avoid
        interpolation.  Interpolate @hcd_id separately.
      
      Bonus: gets rid of a non-literal format string.  A step towards
      compile-time format string checking without triggering
      -Wformat-nonliteral.
      
      Cc: Thomas Huth <thuth@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-15-armbru@redhat.com>
      82cab70b
    • M
      tests: Clean up string interpolation into QMP input (simple cases) · 015715f5
      Markus Armbruster 提交于
      When you build QMP input manually like this
      
          cmd = g_strdup_printf("{ 'execute': 'migrate',"
                                "'arguments': { 'uri': '%s' } }",
                                uri);
          rsp = qmp(cmd);
          g_free(cmd);
      
      you're responsible for escaping the interpolated values for JSON.  Not
      done here, and therefore works only for sufficiently nice @uri.  For
      instance, if @uri contained a single "'", qobject_from_vjsonf_nofail()
      would abort.  A sufficiently nasty @uri could even inject unwanted
      members into the arguments object.
      
      Leaving interpolation into JSON to qmp() is more robust:
      
          rsp = qmp("{ 'execute': 'migrate', 'arguments': { 'uri': %s } }", uri);
      
      It's also more concise.
      
      Clean up the simple cases where we interpolate exactly a JSON value.
      
      Bonus: gets rid of non-literal format strings.  A step towards
      compile-time format string checking without triggering
      -Wformat-nonliteral.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-13-armbru@redhat.com>
      015715f5
    • M
      libqtest: Simplify qmp_fd_vsend() a bit · 69f0cb66
      Markus Armbruster 提交于
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-9-armbru@redhat.com>
      69f0cb66
    • M
      libqtest: Remove qtest_qmp_discard_response() & friends · 055a1efc
      Markus Armbruster 提交于
      qtest_qmp_discard_response(...) is shorthand for
      qobject_unref(qtest_qmp(...), except it's not actually shorter.
      Moreover, the presence of these functions encourage sloppy testing.
      Remove them from libqtest.  Add them as macros to the tests that use
      them, with a TODO comment asking for cleanup.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-5-armbru@redhat.com>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      055a1efc
    • M
      libqtest: Clean up how we read the QMP greeting · be62e172
      Markus Armbruster 提交于
      qtest_init() still uses the qtest_qmp_discard_response(s, "") hack to
      receive the greeting, even though we have qtest_qmp_receive() since
      commit 66e0c7b1.  Put it to use.
      
      Bonus: gets rid of an empty format string.  A step towards
      compile-time format string checking without triggering
      -Wformat-zero-length.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-4-armbru@redhat.com>
      be62e172
    • M
      libqtest: Clean up how we read device_del messages · f94648fe
      Markus Armbruster 提交于
      qtest_qmp_device_del() still uses the qmp("") hack to receive a
      message, even though we have qmp_receive() since commit 66e0c7b1.
      Put it to use.
      
      Bonus: gets rid of empty format strings.  A step towards compile-time
      format string checking without triggering -Wformat-zero-length.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-3-armbru@redhat.com>
      f94648fe
    • M
      libqtest: Rename functions to send QMP messages · 4277f1eb
      Markus Armbruster 提交于
      The functions to receive messages are called qtest_qmp_receive() and
      qmp_receive(), qmp_fd_receive().  The ones to send messages are called
      qtest_async_qmp(), qtest_async_qmpv(), qmp_async(), qmp_fd_send(),
      qmp_fd_sendv().  Inconsistent.  Rename the *_async* ones to
      qmp_send(), qtest_qmp_send(), qtest_qmp_vsend().  Rename
      qmp_fd_sendv() to qmp_fd_vsend().
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180806065344.7103-2-armbru@redhat.com>
      4277f1eb
  5. 31 5月, 2018 1 次提交
  6. 25 5月, 2018 1 次提交
  7. 04 5月, 2018 1 次提交
  8. 27 3月, 2018 1 次提交
  9. 20 3月, 2018 1 次提交
    • M
      qapi: Replace qobject_to_X(o) by qobject_to(X, o) · 7dc847eb
      Max Reitz 提交于
      This patch was generated using the following Coccinelle script:
      
      @@
      expression Obj;
      @@
      (
      - qobject_to_qnum(Obj)
      + qobject_to(QNum, Obj)
      |
      - qobject_to_qstring(Obj)
      + qobject_to(QString, Obj)
      |
      - qobject_to_qdict(Obj)
      + qobject_to(QDict, Obj)
      |
      - qobject_to_qlist(Obj)
      + qobject_to(QList, Obj)
      |
      - qobject_to_qbool(Obj)
      + qobject_to(QBool, Obj)
      )
      
      and a bit of manual fix-up for overly long lines and three places in
      tests/check-qjson.c that Coccinelle did not find.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-Id: <20180224154033.29559-4-mreitz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      [eblake: swap order from qobject_to(o, X), rebase to master, also a fix
      to latent false-positive compiler complaint about hw/i386/acpi-build.c]
      Signed-off-by: NEric Blake <eblake@redhat.com>
      7dc847eb
  10. 14 2月, 2018 1 次提交
  11. 09 2月, 2018 3 次提交
  12. 20 10月, 2017 1 次提交
    • E
      libqtest: Add qtest_[v]startf() · 78b27bad
      Eric Blake 提交于
      We have several callers that were formatting the argument strings
      themselves; consolidate this effort by adding new convenience
      functions directly in libqtest, and update some call-sites that
      can benefit from it.
      
      Note that the new functions qtest_startf() and qtest_vstartf()
      behave more like qtest_init() (the caller must assign global_qtest
      after the fact, rather than getting it implicitly set).  This helps
      us prepare for future patches that get rid of the global variable,
      by explicitly highlighting which tests still depend on it now.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      [thuth: Dropped the hunks that do not apply cleanly to qemu master
       yet and added the missing g_free(args) in qtest_vstartf()]
      Signed-off-by: NThomas Huth <thuth@redhat.com>
      Message-Id: <1508336428-20511-2-git-send-email-thuth@redhat.com>
      Acked-by: NMichael S. Tsirkin <mst@redhat.com>
      Signed-off-by: NCornelia Huck <cohuck@redhat.com>
      78b27bad
  13. 16 10月, 2017 1 次提交
  14. 15 9月, 2017 3 次提交
  15. 09 8月, 2017 1 次提交
    • J
      libqtest: always set up signal handler for SIGABRT · 24dd1e17
      Jens Freimann 提交于
      Currently abort handlers only work for the first test function
      in a testcase, because the list of abort handlers is not properly
      cleared when qtest_quit() is called.
      
      qtest_quit() only deletes the kill_qemu_hook but doesn't completely
      clear the abrt_hooks list.  The effect is that abrt_hooks.is_setup is
      never set to false and in a following test the abrt_hooks list is not
      initialized and setup_sigabrt_handler() is not called.
      
      One way to solve this is to clear the list in qtest_quit(), but
      that means only asserts between qtest_start and qtest_quit will
      be catched by the abort handler.
      
      We can make abort handlers work in all cases if we always setup the
      signal handler for SIGABRT in qtest_init.
      Signed-off-by: NJens Freimann <jfreimann@redhat.com>
      Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      24dd1e17
  16. 04 6月, 2017 1 次提交
  17. 09 5月, 2017 1 次提交
    • E
      test-qga: Actually test 0xff sync bytes · 5229564b
      Eric Blake 提交于
      Commit 62c39b30 introduced test-qga, and at face value, appears
      to be testing the 'guest-sync' behavior that is recommended for
      guests in sending 0xff to QGA to force the parser to reset.  But
      this aspect of the test has never actually done anything: the
      qmp_fd() call chain converts its string argument into QObject,
      then converts that QObject back to the actual string that is
      sent over the wire - and the conversion process silently drops
      the 0xff byte from the string sent to QGA, thus never resetting
      the QGA parser.
      
      An upcoming patch will get rid of the wasteful round trip
      through QObject, at which point the string in test-qga will be
      directly sent over the wire.
      
      But fixing qmp_fd() to actually send 0xff over the wire is not
      all we have to do - the actual QMP parser loudly complains that
      0xff is not valid JSON, and sends an error message _prior_ to
      actually parsing the 'guest-sync' or 'guest-sync-delimited'
      command.  With 'guest-sync', we cannot easily tell if this error
      message is a result of our command - which is WHY we invented
      the 'guest-sync-delimited' command.  So for the testsuite, fix
      things to only check 0xff behavior on 'guest-sync-delimited',
      and to loop until we've consumed all garbage prior to the
      requested delimiter, which is compatible with the documented actions
      that a real QGA client is supposed to do.
      
      Ideally, we'd fix the QGA JSON parser to silently ignore 0xff
      rather than sending an error message back, at which point we
      could enhance this test for 'guest-sync' as well as for
      'guest-sync-delimited'.  But for the sake of this patch, our
      testing of 'guest-sync' is no worse than it was pre-patch,
      because we have never been sending 0xff over the wire in the
      first place.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <20170427215821.19397-11-eblake@redhat.com>
      Reviewed-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
      [Additional comment squashed in, along with matching commit message
      update]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      5229564b
  18. 26 4月, 2017 2 次提交
  19. 04 4月, 2017 1 次提交
  20. 07 3月, 2017 1 次提交