1. 21 2月, 2017 25 次提交
    • M
      hw/i386: Deprecate -drive if=scsi with PC machine types · f778a82f
      Markus Armbruster 提交于
      The PC machines (pc-q35-* pc-i440fx-* pc-* isapc xenfv) automatically
      create lsi53c895a SCSI HBAs and SCSI devices to honor -drive if=scsi.
      For giggles, try -drive if=scsi,bus=25,media=cdrom --- this makes QEMU
      create 25 of them.
      
      lsi53c895a is thoroughly obsolete (PCI Ultra2 SCSI, ca. 2000), and
      currently has no maintainer in QEMU.  megasas is a better choice,
      except with old OSes that lack drivers.  virtio-scsi is a much better
      choice when you have a driver, but only (newish) Linux comes with one
      in the box.  There is no good default that works for all guests.
      
      Encourage users to pick a non-obsolete SCSI HBA that works for them by
      deprecating -drive if=scsi.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1487161136-9018-4-git-send-email-armbru@redhat.com>
      Acked-By: NPaolo Bonzini <pbonzini@redhat.com>
      f778a82f
    • M
      hw: Deprecate -drive if=scsi with non-onboard HBAs · a64aa578
      Markus Armbruster 提交于
      Block backends defined with "-drive if=T" with T other than "none" are
      meant to be picked up by machine initialization code: a suitable
      frontend gets created and wired up automatically.
      
      Drives defined with if=scsi are also picked up by SCSI HBAs added with
      -device, unlike other interface types.  Deprecate this usage, as follows.
      
      Create the frontends for onboard HBAs in machine initialization code,
      exactly like we do for if=ide and other interface types.  Change
      scsi_legacy_handle_cmdline() to create a frontend only when it's still
      missing, and warn that this usage is deprecated.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1487161136-9018-3-git-send-email-armbru@redhat.com>
      a64aa578
    • M
      hw/scsi: Concentrate -drive if=scsi auto-create in one place · fb8b660e
      Markus Armbruster 提交于
      The logic to create frontends for -drive if=scsi is in SCSI HBAs.  For
      all other interface types, it's in machine initialization code.
      
      A few machine types create the SCSI HBAs necessary for that.  That's
      also not done for other interface types.
      
      I'm going to deprecate these SCSI eccentricities.  In preparation for
      that, create the frontends in main() instead of the SCSI HBAs, by
      calling new function scsi_legacy_handle_cmdline() there.
      
      Note that not all SCSI HBAs create frontends.  Take care not to change
      that.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1487161136-9018-2-git-send-email-armbru@redhat.com>
      Acked-By: NPaolo Bonzini <pbonzini@redhat.com>
      fb8b660e
    • M
      hw: Drop superfluous special checks for orphaned -drive · 8f2d75e8
      Markus Armbruster 提交于
      We've traditionally rejected orphans here and there, but not
      systematically.  For instance, the sun4m machines have an onboard SCSI
      HBA (bus=0), and have always rejected bus>0.  Other machines with an
      onboard SCSI HBA don't.
      
      Commit a66c9dc7 made all orphans trigger a warning, and the previous
      commit turned this into an error.  The checks "here and there" are now
      redundant.  Drop them.
      
      Note that the one in mips_jazz.c was wrong: it rejected bus > MAX_FD,
      but MAX_FD is the number of floppy drives per bus.
      
      Error messages change from
      
          $ qemu-system-x86_64 -drive if=ide,bus=2
          qemu-system-x86_64: Too many IDE buses defined (3 > 2)
          $ qemu-system-mips64 -M magnum,accel=qtest -drive if=floppy,bus=2,id=fd1
          qemu: too many floppy drives
          $ qemu-system-sparc -M LX -drive if=scsi,bus=1
          qemu: too many SCSI bus
      
      to
      
          $ qemu-system-x86_64 -drive if=ide,bus=2
          qemu-system-x86_64: -drive if=ide,bus=2: machine type does not support if=ide,bus=2,unit=0
          $ qemu-system-mips64 -M magnum,accel=qtest -drive if=floppy,bus=2,id=fd1
          qemu-system-mips64: -drive if=floppy,bus=2,id=fd1: machine type does not support if=floppy,bus=2,unit=0
          $ qemu-system-sparc -M LX -drive if=scsi,bus=1
          qemu-system-sparc: -drive if=scsi,bus=1: machine type does not support if=scsi,bus=1,unit=0
      
      Cc: John Snow <jsnow@redhat.com>
      Cc: "Hervé Poussineau" <hpoussin@reactos.org>
      Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1487153147-11530-9-git-send-email-armbru@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      8f2d75e8
    • M
      blockdev: Make orphaned -drive fatal · 720b8dc0
      Markus Armbruster 提交于
      Block backends defined with "-drive if=T" with T other than "none" are
      meant to be picked up by machine initialization code: a suitable
      frontend gets created and wired up automatically.
      
      If machine initialization code doesn't comply, the block backend
      remains unused.  This triggers a warning since commit a66c9dc7, v2.2.0.
      Drives created by default are exempted; use -nodefaults to get rid of
      them.
      
      Turn this warning into an error.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1487153147-11530-8-git-send-email-armbru@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      720b8dc0
    • M
      blockdev: Improve message for orphaned -drive · 664cc623
      Markus Armbruster 提交于
      We warn when a -drive isn't supported by the machine type (commit
      a66c9dc7):
      
          $ qemu-system-x86_64 -S -display none -drive if=mtd
          Warning: Orphaned drive without device: id=mtd0,file=,if=mtd,bus=0,unit=0
      
      Improve this to point to the offending bit of configuration:
      
          qemu-system-x86_64: -drive if=mtd: warning: machine type does not support if=mtd,bus=0,unit=0
      
      Especially nice when it's hidden behind -readconfig foo.cfg:
      
          qemu-system-x86_64:foo.cfg:140: warning: machine type does not support if=mtd,bus=0,unit=0
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1487153147-11530-7-git-send-email-armbru@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      664cc623
    • M
      hw/arm/highbank: Default -drive to if=ide instead of if=scsi · 2a7ae4ee
      Markus Armbruster 提交于
      These machines have no onboard SCSI HBA, and no way to plug one.
      -drive if=scsi therefore cannot work.  They do have an onboard IDE
      controller (sysbus-ahci), but fail to honor if=ide.
      
      Change their default to if=ide, and add a TODO comment on what needs
      to be done to actually honor -drive if=ide.
      
      Cc: Rob Herring <robh@kernel.org>
      Cc: Peter Maydell <peter.maydell@linaro.org>
      Cc: qemu-arm@nongnu.org
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Message-Id: <1487153147-11530-6-git-send-email-armbru@redhat.com>
      2a7ae4ee
    • M
      hw: Default -drive to if=none instead of scsi when scsi cannot work · 7e465513
      Markus Armbruster 提交于
      Block backends defined with -drive if=scsi are meant to be picked up
      by machine initialization code: a suitable frontend gets created and
      wired up automatically.
      
      if=scsi drives not picked up that way can still be used with -device
      as if they had if=none, but that's unclean and best avoided.  Unused
      ones produce an "Orphaned drive without device" warning.
      
      A few machine types default to if=scsi, even though they don't
      actually have a SCSI HBA.  This makes no sense.  Change their default
      to if=none.  Affected machines:
      
      * aarch64/arm: realview-pbx-a9 vexpress-a9 vexpress-a15 xilinx-zynq-a9
      
      Cc: Peter Maydell <peter.maydell@linaro.org>
      Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
      Cc: Alistair Francis <alistair.francis@xilinx.com>
      Cc: qemu-arm@nongnu.org
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Reviewed-by: NAlistair Francis <alistair.francis@xilinx.com>
      Message-Id: <1487153147-11530-5-git-send-email-armbru@redhat.com>
      7e465513
    • M
      hw: Default -drive to if=none instead of ide when ide cannot work · a27fa28f
      Markus Armbruster 提交于
      Block backends defined with -drive if=ide are meant to be picked up by
      machine initialization code: a suitable frontend gets created and
      wired up automatically.
      
      if=ide drives not picked up that way can still be used with -device as
      if they had if=none, but that's unclean and best avoided.  Unused ones
      produce an "Orphaned drive without device" warning.
      
      -drive parameter "if" is optional, and the default depends on the
      machine type.  If a machine type doesn't specify a default, the
      default is "ide".
      
      Many machine types implicitly default to if=ide that way, even though
      they don't actually have an IDE controller.  This makes no sense.
      
      Change the implicit default to if=none.  Affected machines:
      
      * all targets: none
      * aarch64/arm: akita ast2500 canon cheetah collie connex imx25
        integratorcp kzm lm3s6965evb lm3s811evb mainstone musicpal n800 n810
        netduino2 nuri palmetto realview romulus sabrelite smdkc210 sx1 sx1
        verdex z2
      * cris: axis-dev88
      * i386/x86_64: xenpv
      * lm32: lm32-evr lm32-uclinux milkymist
      * m68k: an5206 dummy mcf5208evb
      * microblaze/microblazeel: petalogix-ml605 petalogix-s3adsp1800
      * mips/mips64/mips64el/mipsel: mipssim
      * moxie: moxiesim
      * or32: or32-sim
      * ppc/ppc64/ppcemb: bamboo ref405ep taihu virtex-ml507
      * ppc/ppc64: mpc8544ds ppce500
      * sh4/sh4eb: shix
      * sparc: leon3_generic
      * sparc64: niagara
      * tricore: tricore_testboard
      * unicore32: puv3
      * xtensa/xtensaeb: kc705 lx200 lx60 ml605 sim
      
      None of these machines have an IDE controller, let alone code to
      honor if=ide.
      
      Cc: Peter Maydell <peter.maydell@linaro.org>
      Cc: qemu-arm@nongnu.org
      Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com>
      Cc: Stefano Stabellini <sstabellini@kernel.org>
      Cc: Anthony Perard <anthony.perard@citrix.com>
      Cc: xen-devel@lists.xensource.com
      Cc: Michael Walle <michael@walle.cc>
      Cc: Laurent Vivier <laurent@vivier.eu>
      Cc: Anthony Green <green@moxielogic.com>
      Cc: Jia Liu <proljc@gmail.com>
      Cc: Alexander Graf <agraf@suse.de>
      Cc: qemu-ppc@nongnu.org
      Cc: Magnus Damm <magnus.damm@gmail.com>
      Cc: Fabien Chouteau <chouteau@adacore.com>
      Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
      Cc: Artyom Tarasenko <atar4qemu@gmail.com>
      Cc: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
      Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
      Cc: Max Filippov <jcmvbkbc@gmail.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Acked-By: NArtyom Tarasenko <atar4qemu@gmail.com>
      Reviewed-by: NLaurent Vivier <laurent@vivier.eu>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Message-Id: <1487153147-11530-4-git-send-email-armbru@redhat.com>
      a27fa28f
    • M
      hw/arm/cubieboard hw/arm/xlnx-ep108: Fix units_per_default_bus · e0319b03
      Markus Armbruster 提交于
      Machine types cubieboard, xlnx-ep108, xlnx-zcu102 have an onboard AHCI
      controller, but neglect to set their MachineClass member
      units_per_default_bus = 1.  This permits -drive if=ide,unit=1, which
      makes no sense for AHCI.  It also screws up index=N for odd N, because
      it gets desugared to unit=1,bus=N/2
      
      Doesn't really matter, because these machine types fail to honor
      -drive if=ide.  Add the missing units_per_default_bus = 1 anyway,
      along with a TODO comment on what needs to be done for -drive if=ide.
      
      Also set block_default_type = IF_IDE explicitly.  It's currently the
      default, but the next commit will change it to something more
      sensible, and we want to keep the IF_IDE default for these three
      machines.  See also the previous commit.
      
      Cc: Beniamino Galvani <b.galvani@gmail.com>
      Cc: Alistair Francis <alistair.francis@xilinx.com>
      Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
      Cc: Peter Maydell <peter.maydell@linaro.org>
      Cc: qemu-arm@nongnu.org
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Acked-by: NAlistair Francis <alistair.francis@xilinx.com>
      Message-Id: <1487153147-11530-3-git-send-email-armbru@redhat.com>
      e0319b03
    • M
      hw: Default -drive to if=ide explicitly where it works · 2059839b
      Markus Armbruster 提交于
      Block backends defined with -drive if=ide are meant to be picked up by
      machine initialization code: a suitable frontend gets created and
      wired up automatically.
      
      if=ide drives not picked up that way can still be used with -device as
      if they had if=none, but that's unclean and best avoided.  Unused ones
      produce an "Orphaned drive without device" warning.
      
      -drive parameter "if" is optional, and the default depends on the
      machine type.  If a machine type doesn't specify a default, the
      default is "ide".
      
      Many machine types default to if=ide, even though they don't actually
      have an IDE controller.  A future patch will change these defaults to
      something more sensible.  To prepare for it, this patch makes default
      "ide" explicit for the machines that actually pick up if=ide drives:
      
      * alpha: clipper
      * arm/aarch64: spitz borzoi terrier tosa
      * i386/x86_64: generic-pc-machine (with concrete subtypes pc-q35-*
        pc-i440fx-* pc-* isapc xenfv)
      * mips64el: fulong2e
      * mips/mipsel/mips64el: malta mips
      * ppc/ppc64: mac99 g3beige prep
      * sh4/sh4eb: r2d
      * sparc64: sun4u sun4v
      
      Note that ppc64 machine powernv already sets an "ide" default
      explicitly.  Its IDE controller isn't implemented, yet.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Message-Id: <1487153147-11530-2-git-send-email-armbru@redhat.com>
      2059839b
    • P
      Merge remote-tracking branch 'remotes/kraxel/tags/pull-usb-20170221-1' into staging · b8562561
      Peter Maydell 提交于
      xhci: add qemu-xhci device, some followup cleanups.
      ccid: better sanity checking.
      ehci: fix memory leak
      ohci: bugfixes.
      
      # gpg: Signature made Tue 21 Feb 2017 07:14:35 GMT
      # gpg:                using RSA key 0x4CB6D8EED3E87138
      # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
      # gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
      # gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
      # Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138
      
      * remotes/kraxel/tags/pull-usb-20170221-1:
        usb-ccid: add check message size checks
        usb-ccid: move header size check
        usb-ccid: better bulk_out error handling
        xhci: drop via vendor command handling
        xhci: fix nec vendor quirk handling
        xhci: add qemu xhci controller
        xhci: drop ER_FULL_HACK workaround
        xhci: apply limits to loops
        usb: ohci: limit the number of link eds
        usb: ohci: fix error return code in servicing iso td
        usb: ehci: fix memory leak in ehci
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      b8562561
    • G
      usb-ccid: add check message size checks · 31fb4444
      Gerd Hoffmann 提交于
      Check message size too when figuring whenever we should expect more data.
      Fix debug message to show useful data, p->iov.size is fixed anyway if we
      land there, print how much we got meanwhile instead.
      
      Also check announced message size against actual message size.  That
      is a more general fix for CVE-2017-5898 than commit "c7dfbf32 usb: ccid:
      check ccid apdu length".
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Reviewed-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
      Message-id: 1487250819-23764-4-git-send-email-kraxel@redhat.com
      31fb4444
    • G
      usb-ccid: move header size check · 7569c546
      Gerd Hoffmann 提交于
      Move up header size check, so we can use header fields in sanity checks
      (in followup patches).  Also reword the debug message.
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Reviewed-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
      Message-id: 1487250819-23764-3-git-send-email-kraxel@redhat.com
      7569c546
    • G
      usb-ccid: better bulk_out error handling · 0aeebc73
      Gerd Hoffmann 提交于
      Add err goto label where we can jump to from all error conditions.
      STALL request on all errors.  Reset position on all errors.
      
      Normal request processing is not in a else branch any more, so this code
      is reintended, there are no code changes in that part of the code
      though.
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Reviewed-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
      Message-id: 1487250819-23764-2-git-send-email-kraxel@redhat.com
      0aeebc73
    • G
      xhci: drop via vendor command handling · 558ff1b6
      Gerd Hoffmann 提交于
      Seems pretty pointless, we don't emulate an via xhci controller.
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Message-id: 1486382139-30630-5-git-send-email-kraxel@redhat.com
      558ff1b6
    • G
      xhci: fix nec vendor quirk handling · 2992d6b4
      Gerd Hoffmann 提交于
      Only the TYPE_NEC_XHCI controller will have the nec vendor quirks.
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Message-id: 1486382139-30630-4-git-send-email-kraxel@redhat.com
      2992d6b4
    • G
      xhci: add qemu xhci controller · 72a810f4
      Gerd Hoffmann 提交于
      Turn existing TYPE_XHCI into an abstract base class.
      Create two child classes, TYPE_NEC_XHCI (same name as old xhci
      controller) and TYPE_QEMU_XHCI (using an ID from our namespace).
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Reviewed-by: NMarcel Apfelbaum <marcel@redhat.com>
      Message-id: 1486382139-30630-3-git-send-email-kraxel@redhat.com
      72a810f4
    • G
      xhci: drop ER_FULL_HACK workaround · 898248a3
      Gerd Hoffmann 提交于
      The nec/renesas driver problems have finally been debugged and root
      caused, see commit "7da76e12 xhci: fix event queue IRQ handling".
      
      It's pretty clear now that
       (a) The whole "driver can't handle ring full" story is most likely
           wrong.
       (b) The ER_FULL_HACK workaround based on the false assumtion doesn't
           much.  It avoids the driver crashing (without commit 7da76e12), but
           it doesn't make usb work.
       (c) With 7da76e12 applied it doesn't trigger any more.
      
      So, lets kill it.  Or, to be exact, lets almost kill it.  Some data
      fields are kept unused in the state struct, for live migration backward
      compatibility.
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Message-id: 1486382139-30630-2-git-send-email-kraxel@redhat.com
      898248a3
    • G
      xhci: apply limits to loops · f89b60f6
      Gerd Hoffmann 提交于
      Limits should be big enough that normal guest should not hit it.
      Add a tracepoint to log them, just in case.  Also, while being
      at it, log the existing link trb limit too.
      Reported-by: N李强 <liqiang6-s@360.cn>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Message-id: 1486383669-6421-1-git-send-email-kraxel@redhat.com
      f89b60f6
    • L
      usb: ohci: limit the number of link eds · 95ed5693
      Li Qiang 提交于
      The guest may builds an infinite loop with link eds. This patch
      limit the number of linked ed to avoid this.
      Signed-off-by: NLi Qiang <liqiang6-s@360.cn>
      Message-id: 5899a02e.45ca240a.6c373.93c1@mx.google.com
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      95ed5693
    • L
      usb: ohci: fix error return code in servicing iso td · 26f670a2
      Li Qiang 提交于
      It should return 1 if an error occurs when reading iso td.
      This will avoid an infinite loop issue in ohci_service_ed_list.
      Signed-off-by: NLi Qiang <liqiang6-s@360.cn>
      Message-id: 5899ac3e.1033240a.944d5.9a2d@mx.google.com
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      26f670a2
    • L
      usb: ehci: fix memory leak in ehci · d710e1e7
      Li Qiang 提交于
      In usb_ehci_init function, it initializes 's->ipacket', but there
      is no corresponding function to free this. As the ehci can be hotplug
      and unplug, this will leak host memory leak. In order to make the
      hierarchy clean, we should add a ehci pci finalize function, then call
      the clean function in ehci device.
      Signed-off-by: NLi Qiang <liqiang6-s@360.cn>
      Message-id: 589a85b8.3c2b9d0a.b8e6.1434@mx.google.com
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      d710e1e7
    • P
      Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2017-02-20' into staging · 56f9e46b
      Peter Maydell 提交于
      QAPI patches for 2017-02-20
      
      # gpg: Signature made Mon 20 Feb 2017 13:31:12 GMT
      # gpg:                using RSA key 0x3870B400EB918653
      # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>"
      # gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>"
      # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867  4E5F 3870 B400 EB91 8653
      
      * remotes/armbru/tags/pull-qapi-2017-02-20:
        Makefile: Put VERSION info into version.texi rather than using -D
        qapi2texi: replace quotation by bold section name
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      56f9e46b
    • P
      Merge remote-tracking branch 'remotes/kraxel/tags/pull-ui-20170220-1' into staging · c8f21dbf
      Peter Maydell 提交于
      ui: opengl fixes, for spice and egl-helpers.
      
      # gpg: Signature made Mon 20 Feb 2017 13:12:46 GMT
      # gpg:                using RSA key 0x4CB6D8EED3E87138
      # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
      # gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
      # gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
      # Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138
      
      * remotes/kraxel/tags/pull-ui-20170220-1:
        egl-helpers: Support newer MESA versions
        spice: allow to specify drm rendernode
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      c8f21dbf
  2. 20 2月, 2017 9 次提交
  3. 19 2月, 2017 3 次提交
  4. 18 2月, 2017 3 次提交