[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [win-pv-devel] [PATCH 1/9] Update blkif.h to upstream



> -----Original Message-----
> From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On
> Behalf Of Owen Smith
> Sent: 29 May 2018 11:07
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Owen Smith <owen.smith@xxxxxxxxxx>
> Subject: [win-pv-devel] [PATCH 1/9] Update blkif.h to upstream
> 
> Updates blkif.h to the version in xen.git at tag "4.11.0-rc3"
> 
> By observation, main differences are whitespace and an extra
> comment block describing multi-queue changes
> 
> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>

There seems to be a lot of whitespace damage here. I'll re-work this using the 
get_xen_headers.py script and pull in a consistent set of updated headers.

  Paul

> ---
>  include/xen/io/blkif.h | 1100 ++++++++++++++++++++++++++----------------
> ------
>  1 file changed, 597 insertions(+), 503 deletions(-)
> 
> diff --git a/include/xen/io/blkif.h b/include/xen/io/blkif.h
> index c3e169c..f659881 100644
> --- a/include/xen/io/blkif.h
> +++ b/include/xen/io/blkif.h
> @@ -1,29 +1,29 @@
> 
> /**********************************************************
> ********************
> - * blkif.h
> - *
> - * Unified block-device I/O interface for Xen guest OSes.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a
> copy
> - * of this software and associated documentation files (the "Software"), to
> - * deal in the Software without restriction, including without limitation the
> - * rights to use, copy, modify, merge, publish, distribute, sublicense, 
> and/or
> - * sell copies of the Software, and to permit persons to whom the Software
> is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be included in
> - * all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
> EVENT SHALL THE
> - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
> OR OTHER
> - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING
> - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> OTHER
> - * DEALINGS IN THE SOFTWARE.
> - *
> - * Copyright (c) 2003-2004, Keir Fraser
> - * Copyright (c) 2012, Spectra Logic Corporation
> - */
> +* blkif.h
> +*
> +* Unified block-device I/O interface for Xen guest OSes.
> +*
> +* Permission is hereby granted, free of charge, to any person obtaining a
> copy
> +* of this software and associated documentation files (the "Software"), to
> +* deal in the Software without restriction, including without limitation the
> +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
> +* sell copies of the Software, and to permit persons to whom the Software
> is
> +* furnished to do so, subject to the following conditions:
> +*
> +* The above copyright notice and this permission notice shall be included in
> +* all copies or substantial portions of the Software.
> +*
> +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
> EVENT SHALL THE
> +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
> OR OTHER
> +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING
> +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> OTHER
> +* DEALINGS IN THE SOFTWARE.
> +*
> +* Copyright (c) 2003-2004, Keir Fraser
> +* Copyright (c) 2012, Spectra Logic Corporation
> +*/
> 
>  #ifndef __XEN_PUBLIC_IO_BLKIF_H__
>  #define __XEN_PUBLIC_IO_BLKIF_H__
> @@ -32,16 +32,16 @@
>  #include "../grant_table.h"
> 
>  /*
> - * Front->back notifications: When enqueuing a new request, sending a
> - * notification can be made conditional on req_event (i.e., the generic
> - * hold-off mechanism provided by the ring macros). Backends must set
> - * req_event appropriately (e.g., using
> RING_FINAL_CHECK_FOR_REQUESTS()).
> - *
> - * Back->front notifications: When enqueuing a new response, sending a
> - * notification can be made conditional on rsp_event (i.e., the generic
> - * hold-off mechanism provided by the ring macros). Frontends must set
> - * rsp_event appropriately (e.g., using
> RING_FINAL_CHECK_FOR_RESPONSES()).
> - */
> +* Front->back notifications: When enqueuing a new request, sending a
> +* notification can be made conditional on req_event (i.e., the generic
> +* hold-off mechanism provided by the ring macros). Backends must set
> +* req_event appropriately (e.g., using
> RING_FINAL_CHECK_FOR_REQUESTS()).
> +*
> +* Back->front notifications: When enqueuing a new response, sending a
> +* notification can be made conditional on rsp_event (i.e., the generic
> +* hold-off mechanism provided by the ring macros). Frontends must set
> +* rsp_event appropriately (e.g., using
> RING_FINAL_CHECK_FOR_RESPONSES()).
> +*/
> 
>  #ifndef blkif_vdev_t
>  #define blkif_vdev_t   uint16_t
> @@ -49,487 +49,581 @@
>  #define blkif_sector_t uint64_t
> 
>  /*
> - * Feature and Parameter Negotiation
> - * =================================
> - * The two halves of a Xen block driver utilize nodes within the XenStore to
> - * communicate capabilities and to negotiate operating parameters.  This
> - * section enumerates these nodes which reside in the respective front and
> - * backend portions of the XenStore, following the XenBus convention.
> - *
> - * All data in the XenStore is stored as strings.  Nodes specifying numeric
> - * values are encoded in decimal.  Integer value ranges listed below are
> - * expressed as fixed sized integer types capable of storing the conversion
> - * of a properly formated node string, without loss of information.
> - *
> - * Any specified default value is in effect if the corresponding XenBus node
> - * is not present in the XenStore.
> - *
> - * XenStore nodes in sections marked "PRIVATE" are solely for use by the
> - * driver side whose XenBus tree contains them.
> - *
> - * XenStore nodes marked "DEPRECATED" in their notes section should only
> be
> - * used to provide interoperability with legacy implementations.
> - *
> - * See the XenBus state transition diagram below for details on when
> XenBus
> - * nodes must be published and when they can be queried.
> - *
> -
> **********************************************************
> *******************
> - *                            Backend XenBus Nodes
> -
> **********************************************************
> *******************
> - *
> - *------------------ Backend Device Identification (PRIVATE) 
> ------------------
> - *
> - * mode
> - *      Values:         "r" (read only), "w" (writable)
> - *
> - *      The read or write access permissions to the backing store to be
> - *      granted to the frontend.
> - *
> - * params
> - *      Values:         string
> - *
> - *      A free formatted string providing sufficient information for the
> - *      backend driver to open the backing device.  (e.g. the path to the
> - *      file or block device representing the backing store.)
> - *
> - * type
> - *      Values:         "file", "phy", "tap"
> - *
> - *      The type of the backing device/object.
> - *
> - *--------------------------------- Features 
> ---------------------------------
> - *
> - * feature-barrier
> - *      Values:         0/1 (boolean)
> - *      Default Value:  0
> - *
> - *      A value of "1" indicates that the backend can process requests
> - *      containing the BLKIF_OP_WRITE_BARRIER request opcode.  Requests
> - *      of this type may still be returned at any time with the
> - *      BLKIF_RSP_EOPNOTSUPP result code.
> - *
> - * feature-flush-cache
> - *      Values:         0/1 (boolean)
> - *      Default Value:  0
> - *
> - *      A value of "1" indicates that the backend can process requests
> - *      containing the BLKIF_OP_FLUSH_DISKCACHE request opcode.
> Requests
> - *      of this type may still be returned at any time with the
> - *      BLKIF_RSP_EOPNOTSUPP result code.
> - *
> - * feature-discard
> - *      Values:         0/1 (boolean)
> - *      Default Value:  0
> - *
> - *      A value of "1" indicates that the backend can process requests
> - *      containing the BLKIF_OP_DISCARD request opcode.  Requests
> - *      of this type may still be returned at any time with the
> - *      BLKIF_RSP_EOPNOTSUPP result code.
> - *
> - * feature-persistent
> - *      Values:         0/1 (boolean)
> - *      Default Value:  0
> - *      Notes: 7
> - *
> - *      A value of "1" indicates that the backend can keep the grants used
> - *      by the frontend driver mapped, so the same set of grants should be
> - *      used in all transactions. The maximum number of grants the backend
> - *      can map persistently depends on the implementation, but ideally it
> - *      should be RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. Using
> this
> - *      feature the backend doesn't need to unmap each grant, preventing
> - *      costly TLB flushes. The backend driver should only map grants
> - *      persistently if the frontend supports it. If a backend driver chooses
> - *      to use the persistent protocol when the frontend doesn't support it,
> - *      it will probably hit the maximum number of persistently mapped grants
> - *      (due to the fact that the frontend won't be reusing the same grants),
> - *      and fall back to non-persistent mode. Backend implementations may
> - *      shrink or expand the number of persistently mapped grants without
> - *      notifying the frontend depending on memory constraints (this might
> - *      cause a performance degradation).
> - *
> - *      If a backend driver wants to limit the maximum number of persistently
> - *      mapped grants to a value less than RING_SIZE *
> - *      BLKIF_MAX_SEGMENTS_PER_REQUEST a LRU strategy should be used
> to
> - *      discard the grants that are less commonly used. Using a LRU in the
> - *      backend driver paired with a LIFO queue in the frontend will
> - *      allow us to have better performance in this scenario.
> - *
> - *----------------------- Request Transport Parameters 
> ------------------------
> - *
> - * max-ring-page-order
> - *      Values:         <uint32_t>
> - *      Default Value:  0
> - *      Notes:          1, 3
> - *
> - *      The maximum supported size of the request ring buffer in units of
> - *      lb(machine pages). (e.g. 0 == 1 page,  1 = 2 pages, 2 == 4 pages,
> - *      etc.).
> - *
> - * max-ring-pages
> - *      Values:         <uint32_t>
> - *      Default Value:  1
> - *      Notes:          DEPRECATED, 2, 3
> - *
> - *      The maximum supported size of the request ring buffer in units of
> - *      machine pages.  The value must be a power of 2.
> - *
> - *------------------------- Backend Device Properties 
> -------------------------
> - *
> - * discard-alignment
> - *      Values:         <uint32_t>
> - *      Default Value:  0
> - *      Notes:          4, 5
> - *
> - *      The offset, in bytes from the beginning of the virtual block device,
> - *      to the first, addressable, discard extent on the underlying device.
> - *
> - * discard-granularity
> - *      Values:         <uint32_t>
> - *      Default Value:  <"sector-size">
> - *      Notes:          4
> - *
> - *      The size, in bytes, of the individually addressable discard extents
> - *      of the underlying device.
> - *
> - * discard-secure
> - *      Values:         0/1 (boolean)
> - *      Default Value:  0
> - *      Notes:          10
> - *
> - *      A value of "1" indicates that the backend can process
> BLKIF_OP_DISCARD
> - *      requests with the BLKIF_DISCARD_SECURE flag set.
> - *
> - * info
> - *      Values:         <uint32_t> (bitmap)
> - *
> - *      A collection of bit flags describing attributes of the backing
> - *      device.  The VDISK_* macros define the meaning of each bit
> - *      location.
> - *
> - * sector-size
> - *      Values:         <uint32_t>
> - *
> - *      The logical sector size, in bytes, of the backend device.
> - *
> - * physical-sector-size
> - *      Values:         <uint32_t>
> - *
> - *      The physical sector size, in bytes, of the backend device.
> - *
> - * sectors
> - *      Values:         <uint64_t>
> - *
> - *      The size of the backend device, expressed in units of its logical
> - *      sector size ("sector-size").
> - *
> -
> **********************************************************
> *******************
> - *                            Frontend XenBus Nodes
> -
> **********************************************************
> *******************
> - *
> - *----------------------- Request Transport Parameters 
> -----------------------
> - *
> - * event-channel
> - *      Values:         <uint32_t>
> - *
> - *      The identifier of the Xen event channel used to signal activity
> - *      in the ring buffer.
> - *
> - * ring-ref
> - *      Values:         <uint32_t>
> - *      Notes:          6
> - *
> - *      The Xen grant reference granting permission for the backend to map
> - *      the sole page in a single page sized ring buffer.
> - *
> - * ring-ref%u
> - *      Values:         <uint32_t>
> - *      Notes:          6
> - *
> - *      For a frontend providing a multi-page ring, a "number of ring pages"
> - *      sized list of nodes, each containing a Xen grant reference granting
> - *      permission for the backend to map the page of the ring located
> - *      at page index "%u".  Page indexes are zero based.
> - *
> - * protocol
> - *      Values:         string (XEN_IO_PROTO_ABI_*)
> - *      Default Value:  XEN_IO_PROTO_ABI_NATIVE
> - *
> - *      The machine ABI rules governing the format of all ring request and
> - *      response structures.
> - *
> - * ring-page-order
> - *      Values:         <uint32_t>
> - *      Default Value:  0
> - *      Maximum Value:  MAX(ffs(max-ring-pages) - 1, max-ring-page-order)
> - *      Notes:          1, 3
> - *
> - *      The size of the frontend allocated request ring buffer in units
> - *      of lb(machine pages). (e.g. 0 == 1 page, 1 = 2 pages, 2 == 4 pages,
> - *      etc.).
> - *
> - * num-ring-pages
> - *      Values:         <uint32_t>
> - *      Default Value:  1
> - *      Maximum Value:  MAX(max-ring-pages,(0x1 << max-ring-page-order))
> - *      Notes:          DEPRECATED, 2, 3
> - *
> - *      The size of the frontend allocated request ring buffer in units of
> - *      machine pages.  The value must be a power of 2.
> - *
> - * feature-persistent
> - *      Values:         0/1 (boolean)
> - *      Default Value:  0
> - *      Notes: 7, 8, 9
> - *
> - *      A value of "1" indicates that the frontend will reuse the same grants
> - *      for all transactions, allowing the backend to map them with write
> - *      access (even when it should be read-only). If the frontend hits the
> - *      maximum number of allowed persistently mapped grants, it can
> fallback
> - *      to non persistent mode. This will cause a performance degradation,
> - *      since the the backend driver will still try to map those grants
> - *      persistently. Since the persistent grants protocol is compatible with
> - *      the previous protocol, a frontend driver can choose to work in
> - *      persistent mode even when the backend doesn't support it.
> - *
> - *      It is recommended that the frontend driver stores the persistently
> - *      mapped grants in a LIFO queue, so a subset of all persistently mapped
> - *      grants gets used commonly. This is done in case the backend driver
> - *      decides to limit the maximum number of persistently mapped grants
> - *      to a value less than RING_SIZE *
> BLKIF_MAX_SEGMENTS_PER_REQUEST.
> - *
> - *------------------------- Virtual Device Properties 
> -------------------------
> - *
> - * device-type
> - *      Values:         "disk", "cdrom", "floppy", etc.
> - *
> - * virtual-device
> - *      Values:         <uint32_t>
> - *
> - *      A value indicating the physical device to virtualize within the
> - *      frontend's domain.  (e.g. "The first ATA disk", "The third SCSI
> - *      disk", etc.)
> - *
> - *      See docs/misc/vbd-interface.txt for details on the format of this
> - *      value.
> - *
> - * Notes
> - * -----
> - * (1) Multi-page ring buffer scheme first developed in the Citrix XenServer
> - *     PV drivers.
> - * (2) Multi-page ring buffer scheme first used in some RedHat distributions
> - *     including a distribution deployed on certain nodes of the Amazon
> - *     EC2 cluster.
> - * (3) Support for multi-page ring buffers was implemented independently,
> - *     in slightly different forms, by both Citrix and RedHat/Amazon.
> - *     For full interoperability, block front and backends should publish
> - *     identical ring parameters, adjusted for unit differences, to the
> - *     XenStore nodes used in both schemes.
> - * (4) Devices that support discard functionality may internally allocate 
> space
> - *     (discardable extents) in units that are larger than the exported 
> logical
> - *     block size. If the backing device has such discardable extents the
> - *     backend should provide both discard-granularity and discard-alignment.
> - *     Providing just one of the two may be considered an error by the
> frontend.
> - *     Backends supporting discard should include discard-granularity and
> - *     discard-alignment even if it supports discarding individual sectors.
> - *     Frontends should assume discard-alignment == 0 and discard-
> granularity
> - *     == sector size if these keys are missing.
> - * (5) The discard-alignment parameter allows a physical device to be
> - *     partitioned into virtual devices that do not necessarily begin or
> - *     end on a discardable extent boundary.
> - * (6) When there is only a single page allocated to the request ring,
> - *     'ring-ref' is used to communicate the grant reference for this
> - *     page to the backend.  When using a multi-page ring, the 'ring-ref'
> - *     node is not created.  Instead 'ring-ref0' - 'ring-refN' are used.
> - * (7) When using persistent grants data has to be copied from/to the page
> - *     where the grant is currently mapped. The overhead of doing this copy
> - *     however doesn't suppress the speed improvement of not having to
> unmap
> - *     the grants.
> - * (8) The frontend driver has to allow the backend driver to map all grants
> - *     with write access, even when they should be mapped read-only, since
> - *     further requests may reuse these grants and require write permissions.
> - * (9) Linux implementation doesn't have a limit on the maximum number of
> - *     grants that can be persistently mapped in the frontend driver, but
> - *     due to the frontent driver implementation it should never be bigger
> - *     than RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST.
> - *(10) The discard-secure property may be present and will be set to 1 if the
> - *     backing device supports secure discard.
> - */
> +* Feature and Parameter Negotiation
> +* =================================
> +* The two halves of a Xen block driver utilize nodes within the XenStore to
> +* communicate capabilities and to negotiate operating parameters.  This
> +* section enumerates these nodes which reside in the respective front and
> +* backend portions of the XenStore, following the XenBus convention.
> +*
> +* All data in the XenStore is stored as strings.  Nodes specifying numeric
> +* values are encoded in decimal.  Integer value ranges listed below are
> +* expressed as fixed sized integer types capable of storing the conversion
> +* of a properly formated node string, without loss of information.
> +*
> +* Any specified default value is in effect if the corresponding XenBus node
> +* is not present in the XenStore.
> +*
> +* XenStore nodes in sections marked "PRIVATE" are solely for use by the
> +* driver side whose XenBus tree contains them.
> +*
> +* XenStore nodes marked "DEPRECATED" in their notes section should only
> be
> +* used to provide interoperability with legacy implementations.
> +*
> +* See the XenBus state transition diagram below for details on when
> XenBus
> +* nodes must be published and when they can be queried.
> +*
> +*********************************************************
> ********************
> +*                            Backend XenBus Nodes
> +*********************************************************
> ********************
> +*
> +*------------------ Backend Device Identification (PRIVATE) 
> ------------------
> +*
> +* mode
> +*      Values:         "r" (read only), "w" (writable)
> +*
> +*      The read or write access permissions to the backing store to be
> +*      granted to the frontend.
> +*
> +* params
> +*      Values:         string
> +*
> +*      A free formatted string providing sufficient information for the
> +*      hotplug script to attach the device and provide a suitable
> +*      handler (ie: a block device) for blkback to use.
> +*
> +* physical-device
> +*      Values:         "MAJOR:MINOR"
> +*      Notes: 11
> +*
> +*      MAJOR and MINOR are the major number and minor number of the
> +*      backing device respectively.
> +*
> +* physical-device-path
> +*      Values:         path string
> +*
> +*      A string that contains the absolute path to the disk image. On
> +*      NetBSD and Linux this is always a block device, while on FreeBSD
> +*      it can be either a block device or a regular file.
> +*
> +* type
> +*      Values:         "file", "phy", "tap"
> +*
> +*      The type of the backing device/object.
> +*
> +*
> +* direct-io-safe
> +*      Values:         0/1 (boolean)
> +*      Default Value:  0
> +*
> +*      The underlying storage is not affected by the direct IO memory
> +*      lifetime bug.  See:
> +*        http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html
> +*
> +*      Therefore this option gives the backend permission to use
> +*      O_DIRECT, notwithstanding that bug.
> +*
> +*      That is, if this option is enabled, use of O_DIRECT is safe,
> +*      in circumstances where we would normally have avoided it as a
> +*      workaround for that bug.  This option is not relevant for all
> +*      backends, and even not necessarily supported for those for
> +*      which it is relevant.  A backend which knows that it is not
> +*      affected by the bug can ignore this option.
> +*
> +*      This option doesn't require a backend to use O_DIRECT, so it
> +*      should not be used to try to control the caching behaviour.
> +*
> +*--------------------------------- Features ---------------------------------
> +*
> +* feature-barrier
> +*      Values:         0/1 (boolean)
> +*      Default Value:  0
> +*
> +*      A value of "1" indicates that the backend can process requests
> +*      containing the BLKIF_OP_WRITE_BARRIER request opcode.  Requests
> +*      of this type may still be returned at any time with the
> +*      BLKIF_RSP_EOPNOTSUPP result code.
> +*
> +* feature-flush-cache
> +*      Values:         0/1 (boolean)
> +*      Default Value:  0
> +*
> +*      A value of "1" indicates that the backend can process requests
> +*      containing the BLKIF_OP_FLUSH_DISKCACHE request opcode.
> Requests
> +*      of this type may still be returned at any time with the
> +*      BLKIF_RSP_EOPNOTSUPP result code.
> +*
> +* feature-discard
> +*      Values:         0/1 (boolean)
> +*      Default Value:  0
> +*
> +*      A value of "1" indicates that the backend can process requests
> +*      containing the BLKIF_OP_DISCARD request opcode.  Requests
> +*      of this type may still be returned at any time with the
> +*      BLKIF_RSP_EOPNOTSUPP result code.
> +*
> +* feature-persistent
> +*      Values:         0/1 (boolean)
> +*      Default Value:  0
> +*      Notes: 7
> +*
> +*      A value of "1" indicates that the backend can keep the grants used
> +*      by the frontend driver mapped, so the same set of grants should be
> +*      used in all transactions. The maximum number of grants the backend
> +*      can map persistently depends on the implementation, but ideally it
> +*      should be RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. Using
> this
> +*      feature the backend doesn't need to unmap each grant, preventing
> +*      costly TLB flushes. The backend driver should only map grants
> +*      persistently if the frontend supports it. If a backend driver chooses
> +*      to use the persistent protocol when the frontend doesn't support it,
> +*      it will probably hit the maximum number of persistently mapped grants
> +*      (due to the fact that the frontend won't be reusing the same grants),
> +*      and fall back to non-persistent mode. Backend implementations may
> +*      shrink or expand the number of persistently mapped grants without
> +*      notifying the frontend depending on memory constraints (this might
> +*      cause a performance degradation).
> +*
> +*      If a backend driver wants to limit the maximum number of persistently
> +*      mapped grants to a value less than RING_SIZE *
> +*      BLKIF_MAX_SEGMENTS_PER_REQUEST a LRU strategy should be used
> to
> +*      discard the grants that are less commonly used. Using a LRU in the
> +*      backend driver paired with a LIFO queue in the frontend will
> +*      allow us to have better performance in this scenario.
> +*
> +*----------------------- Request Transport Parameters 
> ------------------------
> +*
> +* max-ring-page-order
> +*      Values:         <uint32_t>
> +*      Default Value:  0
> +*      Notes:          1, 3
> +*
> +*      The maximum supported size of the request ring buffer in units of
> +*      lb(machine pages). (e.g. 0 == 1 page,  1 = 2 pages, 2 == 4 pages,
> +*      etc.).
> +*
> +* max-ring-pages
> +*      Values:         <uint32_t>
> +*      Default Value:  1
> +*      Notes:          DEPRECATED, 2, 3
> +*
> +*      The maximum supported size of the request ring buffer in units of
> +*      machine pages.  The value must be a power of 2.
> +*
> +*------------------------- Backend Device Properties 
> -------------------------
> +*
> +* discard-enable
> +*      Values:         0/1 (boolean)
> +*      Default Value:  1
> +*
> +*      This optional property, set by the toolstack, instructs the backend
> +*      to offer (or not to offer) discard to the frontend. If the property
> +*      is missing the backend should offer discard if the backing storage
> +*      actually supports it.
> +*
> +* discard-alignment
> +*      Values:         <uint32_t>
> +*      Default Value:  0
> +*      Notes:          4, 5
> +*
> +*      The offset, in bytes from the beginning of the virtual block device,
> +*      to the first, addressable, discard extent on the underlying device.
> +*
> +* discard-granularity
> +*      Values:         <uint32_t>
> +*      Default Value:  <"sector-size">
> +*      Notes:          4
> +*
> +*      The size, in bytes, of the individually addressable discard extents
> +*      of the underlying device.
> +*
> +* discard-secure
> +*      Values:         0/1 (boolean)
> +*      Default Value:  0
> +*      Notes:          10
> +*
> +*      A value of "1" indicates that the backend can process
> BLKIF_OP_DISCARD
> +*      requests with the BLKIF_DISCARD_SECURE flag set.
> +*
> +* info
> +*      Values:         <uint32_t> (bitmap)
> +*
> +*      A collection of bit flags describing attributes of the backing
> +*      device.  The VDISK_* macros define the meaning of each bit
> +*      location.
> +*
> +* sector-size
> +*      Values:         <uint32_t>
> +*
> +*      The logical sector size, in bytes, of the backend device.
> +*
> +* physical-sector-size
> +*      Values:         <uint32_t>
> +*
> +*      The physical sector size, in bytes, of the backend device.
> +*
> +* sectors
> +*      Values:         <uint64_t>
> +*
> +*      The size of the backend device, expressed in units of its logical
> +*      sector size ("sector-size").
> +*
> +*********************************************************
> ********************
> +*                            Frontend XenBus Nodes
> +*********************************************************
> ********************
> +*
> +*----------------------- Request Transport Parameters -----------------------
> +*
> +* event-channel
> +*      Values:         <uint32_t>
> +*
> +*      The identifier of the Xen event channel used to signal activity
> +*      in the ring buffer.
> +*
> +* ring-ref
> +*      Values:         <uint32_t>
> +*      Notes:          6
> +*
> +*      The Xen grant reference granting permission for the backend to map
> +*      the sole page in a single page sized ring buffer.
> +*
> +* ring-ref%u
> +*      Values:         <uint32_t>
> +*      Notes:          6
> +*
> +*      For a frontend providing a multi-page ring, a "number of ring pages"
> +*      sized list of nodes, each containing a Xen grant reference granting
> +*      permission for the backend to map the page of the ring located
> +*      at page index "%u".  Page indexes are zero based.
> +*
> +* protocol
> +*      Values:         string (XEN_IO_PROTO_ABI_*)
> +*      Default Value:  XEN_IO_PROTO_ABI_NATIVE
> +*
> +*      The machine ABI rules governing the format of all ring request and
> +*      response structures.
> +*
> +* ring-page-order
> +*      Values:         <uint32_t>
> +*      Default Value:  0
> +*      Maximum Value:  MAX(ffs(max-ring-pages) - 1, max-ring-page-order)
> +*      Notes:          1, 3
> +*
> +*      The size of the frontend allocated request ring buffer in units
> +*      of lb(machine pages). (e.g. 0 == 1 page, 1 = 2 pages, 2 == 4 pages,
> +*      etc.).
> +*
> +* num-ring-pages
> +*      Values:         <uint32_t>
> +*      Default Value:  1
> +*      Maximum Value:  MAX(max-ring-pages,(0x1 << max-ring-page-order))
> +*      Notes:          DEPRECATED, 2, 3
> +*
> +*      The size of the frontend allocated request ring buffer in units of
> +*      machine pages.  The value must be a power of 2.
> +*
> +* feature-persistent
> +*      Values:         0/1 (boolean)
> +*      Default Value:  0
> +*      Notes: 7, 8, 9
> +*
> +*      A value of "1" indicates that the frontend will reuse the same grants
> +*      for all transactions, allowing the backend to map them with write
> +*      access (even when it should be read-only). If the frontend hits the
> +*      maximum number of allowed persistently mapped grants, it can
> fallback
> +*      to non persistent mode. This will cause a performance degradation,
> +*      since the the backend driver will still try to map those grants
> +*      persistently. Since the persistent grants protocol is compatible with
> +*      the previous protocol, a frontend driver can choose to work in
> +*      persistent mode even when the backend doesn't support it.
> +*
> +*      It is recommended that the frontend driver stores the persistently
> +*      mapped grants in a LIFO queue, so a subset of all persistently mapped
> +*      grants gets used commonly. This is done in case the backend driver
> +*      decides to limit the maximum number of persistently mapped grants
> +*      to a value less than RING_SIZE *
> BLKIF_MAX_SEGMENTS_PER_REQUEST.
> +*
> +*------------------------- Virtual Device Properties 
> -------------------------
> +*
> +* device-type
> +*      Values:         "disk", "cdrom", "floppy", etc.
> +*
> +* virtual-device
> +*      Values:         <uint32_t>
> +*
> +*      A value indicating the physical device to virtualize within the
> +*      frontend's domain.  (e.g. "The first ATA disk", "The third SCSI
> +*      disk", etc.)
> +*
> +*      See docs/misc/vbd-interface.txt for details on the format of this
> +*      value.
> +*
> +* Notes
> +* -----
> +* (1) Multi-page ring buffer scheme first developed in the Citrix XenServer
> +*     PV drivers.
> +* (2) Multi-page ring buffer scheme first used in some RedHat distributions
> +*     including a distribution deployed on certain nodes of the Amazon
> +*     EC2 cluster.
> +* (3) Support for multi-page ring buffers was implemented independently,
> +*     in slightly different forms, by both Citrix and RedHat/Amazon.
> +*     For full interoperability, block front and backends should publish
> +*     identical ring parameters, adjusted for unit differences, to the
> +*     XenStore nodes used in both schemes.
> +* (4) Devices that support discard functionality may internally allocate 
> space
> +*     (discardable extents) in units that are larger than the exported 
> logical
> +*     block size. If the backing device has such discardable extents the
> +*     backend should provide both discard-granularity and discard-alignment.
> +*     Providing just one of the two may be considered an error by the
> frontend.
> +*     Backends supporting discard should include discard-granularity and
> +*     discard-alignment even if it supports discarding individual sectors.
> +*     Frontends should assume discard-alignment == 0 and discard-
> granularity
> +*     == sector size if these keys are missing.
> +* (5) The discard-alignment parameter allows a physical device to be
> +*     partitioned into virtual devices that do not necessarily begin or
> +*     end on a discardable extent boundary.
> +* (6) When there is only a single page allocated to the request ring,
> +*     'ring-ref' is used to communicate the grant reference for this
> +*     page to the backend.  When using a multi-page ring, the 'ring-ref'
> +*     node is not created.  Instead 'ring-ref0' - 'ring-refN' are used.
> +* (7) When using persistent grants data has to be copied from/to the page
> +*     where the grant is currently mapped. The overhead of doing this copy
> +*     however doesn't suppress the speed improvement of not having to
> unmap
> +*     the grants.
> +* (8) The frontend driver has to allow the backend driver to map all grants
> +*     with write access, even when they should be mapped read-only, since
> +*     further requests may reuse these grants and require write permissions.
> +* (9) Linux implementation doesn't have a limit on the maximum number of
> +*     grants that can be persistently mapped in the frontend driver, but
> +*     due to the frontent driver implementation it should never be bigger
> +*     than RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST.
> +*(10) The discard-secure property may be present and will be set to 1 if the
> +*     backing device supports secure discard.
> +*(11) Only used by Linux and NetBSD.
> +*/
> 
>  /*
> - * STATE DIAGRAMS
> - *
> -
> **********************************************************
> *******************
> - *                                   Startup                                 
> *
> -
> **********************************************************
> *******************
> - *
> - * Tool stack creates front and back nodes with state 
> XenbusStateInitialising.
> - *
> - * Front                                Back
> - * =================================
> =====================================
> - * XenbusStateInitialising              XenbusStateInitialising
> - *  o Query virtual device               o Query backend device 
> identification
> - *    properties.                          data.
> - *  o Setup OS device instance.          o Open and validate backend device.
> - *                                       o Publish backend features and
> - *                                         transport parameters.
> - *                                                      |
> - *                                                      |
> - *                                                      V
> - *                                      XenbusStateInitWait
> - *
> - * o Query backend features and
> - *   transport parameters.
> - * o Allocate and initialize the
> - *   request ring.
> - * o Publish transport parameters
> - *   that will be in effect during
> - *   this connection.
> - *              |
> - *              |
> - *              V
> - * XenbusStateInitialised
> - *
> - *                                       o Query frontend transport 
> parameters.
> - *                                       o Connect to the request ring and
> - *                                         event channel.
> - *                                       o Publish backend device properties.
> - *                                                      |
> - *                                                      |
> - *                                                      V
> - *                                      XenbusStateConnected
> - *
> - *  o Query backend device properties.
> - *  o Finalize OS virtual device
> - *    instance.
> - *              |
> - *              |
> - *              V
> - * XenbusStateConnected
> - *
> - * Note: Drivers that do not support any optional features, or the
> negotiation
> - *       of transport parameters, can skip certain states in the state 
> machine:
> - *
> - *       o A frontend may transition to XenbusStateInitialised without
> - *         waiting for the backend to enter XenbusStateInitWait.  In this
> - *         case, default transport parameters are in effect and any
> - *         transport parameters published by the frontend must contain
> - *         their default values.
> - *
> - *       o A backend may transition to XenbusStateInitialised, bypassing
> - *         XenbusStateInitWait, without waiting for the frontend to first
> - *         enter the XenbusStateInitialised state.  In this case, default
> - *         transport parameters are in effect and any transport parameters
> - *         published by the backend must contain their default values.
> - *
> - *       Drivers that support optional features and/or transport parameter
> - *       negotiation must tolerate these additional state transition paths.
> - *       In general this means performing the work of any skipped state
> - *       transition, if it has not already been performed, in addition to the
> - *       work associated with entry into the current state.
> - */
> +* Multiple hardware queues/rings:
> +* If supported, the backend will write the key "multi-queue-max-queues"
> to
> +* the directory for that vbd, and set its value to the maximum supported
> +* number of queues.
> +* Frontends that are aware of this feature and wish to use it can write the
> +* key "multi-queue-num-queues" with the number they wish to use, which
> must be
> +* greater than zero, and no more than the value reported by the backend in
> +* "multi-queue-max-queues".
> +*
> +* For frontends requesting just one queue, the usual event-channel and
> +* ring-ref keys are written as before, simplifying the backend processing
> +* to avoid distinguishing between a frontend that doesn't understand the
> +* multi-queue feature, and one that does, but requested only one queue.
> +*
> +* Frontends requesting two or more queues must not write the toplevel
> +* event-channel and ring-ref keys, instead writing those keys under sub-
> keys
> +* having the name "queue-N" where N is the integer ID of the queue/ring
> for
> +* which those keys belong. Queues are indexed from zero.
> +* For example, a frontend with two queues must write the following set of
> +* queue-related keys:
> +*
> +* /local/domain/1/device/vbd/0/multi-queue-num-queues = "2"
> +* /local/domain/1/device/vbd/0/queue-0 = ""
> +* /local/domain/1/device/vbd/0/queue-0/ring-ref = "<ring-ref#0>"
> +* /local/domain/1/device/vbd/0/queue-0/event-channel = "<evtchn#0>"
> +* /local/domain/1/device/vbd/0/queue-1 = ""
> +* /local/domain/1/device/vbd/0/queue-1/ring-ref = "<ring-ref#1>"
> +* /local/domain/1/device/vbd/0/queue-1/event-channel = "<evtchn#1>"
> +*
> +* It is also possible to use multiple queues/rings together with
> +* feature multi-page ring buffer.
> +* For example, a frontend requests two queues/rings and the size of each
> ring
> +* buffer is two pages must write the following set of related keys:
> +*
> +* /local/domain/1/device/vbd/0/multi-queue-num-queues = "2"
> +* /local/domain/1/device/vbd/0/ring-page-order = "1"
> +* /local/domain/1/device/vbd/0/queue-0 = ""
> +* /local/domain/1/device/vbd/0/queue-0/ring-ref0 = "<ring-ref#0>"
> +* /local/domain/1/device/vbd/0/queue-0/ring-ref1 = "<ring-ref#1>"
> +* /local/domain/1/device/vbd/0/queue-0/event-channel = "<evtchn#0>"
> +* /local/domain/1/device/vbd/0/queue-1 = ""
> +* /local/domain/1/device/vbd/0/queue-1/ring-ref0 = "<ring-ref#2>"
> +* /local/domain/1/device/vbd/0/queue-1/ring-ref1 = "<ring-ref#3>"
> +* /local/domain/1/device/vbd/0/queue-1/event-channel = "<evtchn#1>"
> +*
> +*/
> 
>  /*
> - * REQUEST CODES.
> - */
> +* STATE DIAGRAMS
> +*
> +*********************************************************
> ********************
> +*                                   Startup                                 *
> +*********************************************************
> ********************
> +*
> +* Tool stack creates front and back nodes with state XenbusStateInitialising.
> +*
> +* Front                                Back
> +* =================================
> =====================================
> +* XenbusStateInitialising              XenbusStateInitialising
> +*  o Query virtual device               o Query backend device identification
> +*    properties.                          data.
> +*  o Setup OS device instance.          o Open and validate backend device.
> +*                                       o Publish backend features and
> +*                                         transport parameters.
> +*                                                      |
> +*                                                      |
> +*                                                      V
> +*                                      XenbusStateInitWait
> +*
> +* o Query backend features and
> +*   transport parameters.
> +* o Allocate and initialize the
> +*   request ring.
> +* o Publish transport parameters
> +*   that will be in effect during
> +*   this connection.
> +*              |
> +*              |
> +*              V
> +* XenbusStateInitialised
> +*
> +*                                       o Query frontend transport 
> parameters.
> +*                                       o Connect to the request ring and
> +*                                         event channel.
> +*                                       o Publish backend device properties.
> +*                                                      |
> +*                                                      |
> +*                                                      V
> +*                                      XenbusStateConnected
> +*
> +*  o Query backend device properties.
> +*  o Finalize OS virtual device
> +*    instance.
> +*              |
> +*              |
> +*              V
> +* XenbusStateConnected
> +*
> +* Note: Drivers that do not support any optional features, or the
> negotiation
> +*       of transport parameters, can skip certain states in the state 
> machine:
> +*
> +*       o A frontend may transition to XenbusStateInitialised without
> +*         waiting for the backend to enter XenbusStateInitWait.  In this
> +*         case, default transport parameters are in effect and any
> +*         transport parameters published by the frontend must contain
> +*         their default values.
> +*
> +*       o A backend may transition to XenbusStateInitialised, bypassing
> +*         XenbusStateInitWait, without waiting for the frontend to first
> +*         enter the XenbusStateInitialised state.  In this case, default
> +*         transport parameters are in effect and any transport parameters
> +*         published by the backend must contain their default values.
> +*
> +*       Drivers that support optional features and/or transport parameter
> +*       negotiation must tolerate these additional state transition paths.
> +*       In general this means performing the work of any skipped state
> +*       transition, if it has not already been performed, in addition to the
> +*       work associated with entry into the current state.
> +*/
> +
> +/*
> +* REQUEST CODES.
> +*/
>  #define BLKIF_OP_READ              0
>  #define BLKIF_OP_WRITE             1
>  /*
> - * All writes issued prior to a request with the BLKIF_OP_WRITE_BARRIER
> - * operation code ("barrier request") must be completed prior to the
> - * execution of the barrier request.  All writes issued after the barrier
> - * request must not execute until after the completion of the barrier
> request.
> - *
> - * Optional.  See "feature-barrier" XenBus node documentation above.
> - */
> +* All writes issued prior to a request with the BLKIF_OP_WRITE_BARRIER
> +* operation code ("barrier request") must be completed prior to the
> +* execution of the barrier request.  All writes issued after the barrier
> +* request must not execute until after the completion of the barrier
> request.
> +*
> +* Optional.  See "feature-barrier" XenBus node documentation above.
> +*/
>  #define BLKIF_OP_WRITE_BARRIER     2
>  /*
> - * Commit any uncommitted contents of the backing device's volatile cache
> - * to stable storage.
> - *
> - * Optional.  See "feature-flush-cache" XenBus node documentation above.
> - */
> +* Commit any uncommitted contents of the backing device's volatile cache
> +* to stable storage.
> +*
> +* Optional.  See "feature-flush-cache" XenBus node documentation above.
> +*/
>  #define BLKIF_OP_FLUSH_DISKCACHE   3
>  /*
> - * Used in SLES sources for device specific command packet
> - * contained within the request. Reserved for that purpose.
> - */
> +* Used in SLES sources for device specific command packet
> +* contained within the request. Reserved for that purpose.
> +*/
>  #define BLKIF_OP_RESERVED_1        4
>  /*
> - * Indicate to the backend device that a region of storage is no longer in
> - * use, and may be discarded at any time without impact to the client.  If
> - * the BLKIF_DISCARD_SECURE flag is set on the request, all copies of the
> - * discarded region on the device must be rendered unrecoverable before
> the
> - * command returns.
> - *
> - * This operation is analogous to performing a trim (ATA) or unamp (SCSI),
> - * command on a native device.
> - *
> - * More information about trim/unmap operations can be found at:
> - * http://t13.org/Documents/UploadedDocuments/docs2008/
> - *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
> - * http://www.seagate.com/staticfiles/support/disc/manuals/
> - *     Interface%20manuals/100293068c.pdf
> - *
> - * Optional.  See "feature-discard", "discard-alignment",
> - * "discard-granularity", and "discard-secure" in the XenBus node
> - * documentation above.
> - */
> +* Indicate to the backend device that a region of storage is no longer in
> +* use, and may be discarded at any time without impact to the client.  If
> +* the BLKIF_DISCARD_SECURE flag is set on the request, all copies of the
> +* discarded region on the device must be rendered unrecoverable before
> the
> +* command returns.
> +*
> +* This operation is analogous to performing a trim (ATA) or unamp (SCSI),
> +* command on a native device.
> +*
> +* More information about trim/unmap operations can be found at:
> +* http://t13.org/Documents/UploadedDocuments/docs2008/
> +*     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
> +* http://www.seagate.com/staticfiles/support/disc/manuals/
> +*     Interface%20manuals/100293068c.pdf
> +*
> +* Optional.  See "feature-discard", "discard-alignment",
> +* "discard-granularity", and "discard-secure" in the XenBus node
> +* documentation above.
> +*/
>  #define BLKIF_OP_DISCARD           5
> 
>  /*
> - * Recognized if "feature-max-indirect-segments" in present in the backend
> - * xenbus info. The "feature-max-indirect-segments" node contains the
> maximum
> - * number of segments allowed by the backend per request. If the node is
> - * present, the frontend might use blkif_request_indirect structs in order to
> - * issue requests with more than BLKIF_MAX_SEGMENTS_PER_REQUEST
> (11). The
> - * maximum number of indirect segments is fixed by the backend, but the
> - * frontend can issue requests with any number of indirect segments as long
> as
> - * it's less than the number provided by the backend. The indirect_grefs
> field
> - * in blkif_request_indirect should be filled by the frontend with the
> - * grant references of the pages that are holding the indirect segments.
> - * These pages are filled with an array of blkif_request_segment that hold
> the
> - * information about the segments. The number of indirect pages to use is
> - * determined by the number of segments an indirect request contains.
> Every
> - * indirect page can contain a maximum of
> - * (PAGE_SIZE / sizeof(struct blkif_request_segment)) segments, so to
> - * calculate the number of indirect pages to use we have to do
> - * ceil(indirect_segments / (PAGE_SIZE / sizeof(struct
> blkif_request_segment))).
> - *
> - * If a backend does not recognize BLKIF_OP_INDIRECT, it should *not*
> - * create the "feature-max-indirect-segments" node!
> - */
> +* Recognized if "feature-max-indirect-segments" in present in the backend
> +* xenbus info. The "feature-max-indirect-segments" node contains the
> maximum
> +* number of segments allowed by the backend per request. If the node is
> +* present, the frontend might use blkif_request_indirect structs in order to
> +* issue requests with more than BLKIF_MAX_SEGMENTS_PER_REQUEST
> (11). The
> +* maximum number of indirect segments is fixed by the backend, but the
> +* frontend can issue requests with any number of indirect segments as long
> as
> +* it's less than the number provided by the backend. The indirect_grefs
> field
> +* in blkif_request_indirect should be filled by the frontend with the
> +* grant references of the pages that are holding the indirect segments.
> +* These pages are filled with an array of blkif_request_segment that hold
> the
> +* information about the segments. The number of indirect pages to use is
> +* determined by the number of segments an indirect request contains.
> Every
> +* indirect page can contain a maximum of
> +* (PAGE_SIZE / sizeof(struct blkif_request_segment)) segments, so to
> +* calculate the number of indirect pages to use we have to do
> +* ceil(indirect_segments / (PAGE_SIZE / sizeof(struct
> blkif_request_segment))).
> +*
> +* If a backend does not recognize BLKIF_OP_INDIRECT, it should *not*
> +* create the "feature-max-indirect-segments" node!
> +*/
>  #define BLKIF_OP_INDIRECT          6
> 
>  /*
> - * Maximum scatter/gather segments per request.
> - * This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE.
> - * NB. This could be 12 if the ring indexes weren't stored in the same page.
> - */
> +* Maximum scatter/gather segments per request.
> +* This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE.
> +* NB. This could be 12 if the ring indexes weren't stored in the same page.
> +*/
>  #define BLKIF_MAX_SEGMENTS_PER_REQUEST 11
> 
>  /*
> - * Maximum number of indirect pages to use per request.
> - */
> +* Maximum number of indirect pages to use per request.
> +*/
>  #define BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST 8
> 
>  /*
> - * NB. first_sect and last_sect in blkif_request_segment, as well as
> - * sector_number in blkif_request, are always expressed in 512-byte units.
> - * However they must be properly aligned to the real sector size of the
> - * physical disk, which is reported in the "physical-sector-size" node in
> - * the backend xenbus info. Also the xenbus "sectors" node is expressed in
> - * 512-byte units.
> - */
> +* NB. first_sect and last_sect in blkif_request_segment, as well as
> +* sector_number in blkif_request, are always expressed in 512-byte units.
> +* However they must be properly aligned to the real sector size of the
> +* physical disk, which is reported in the "physical-sector-size" node in
> +* the backend xenbus info. Also the xenbus "sectors" node is expressed in
> +* 512-byte units.
> +*/
>  struct blkif_request_segment {
>      grant_ref_t gref;        /* reference to I/O buffer frame        */
> -    /* @first_sect: first sector in frame to transfer (inclusive).   */
> -    /* @last_sect: last sector in frame to transfer (inclusive).     */
> +                             /* @first_sect: first sector in frame to 
> transfer (inclusive).   */
> +                             /* @last_sect: last sector in frame to transfer 
> (inclusive).     */
>      uint8_t     first_sect, last_sect;
>  };
> 
>  /*
> - * Starting ring element for any I/O request.
> - */
> +* Starting ring element for any I/O request.
> +*/
>  struct blkif_request {
>      uint8_t        operation;    /* BLKIF_OP_???                         */
>      uint8_t        nr_segments;  /* number of segments                   */
> @@ -541,9 +635,9 @@ struct blkif_request {
>  typedef struct blkif_request blkif_request_t;
> 
>  /*
> - * Cast to this structure when blkif_request.operation ==
> BLKIF_OP_DISCARD
> - * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
> - */
> +* Cast to this structure when blkif_request.operation ==
> BLKIF_OP_DISCARD
> +* sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
> +*/
>  struct blkif_request_discard {
>      uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
>      uint8_t        flag;         /* BLKIF_DISCARD_SECURE or zero         */
> @@ -577,18 +671,18 @@ struct blkif_response {
>  typedef struct blkif_response blkif_response_t;
> 
>  /*
> - * STATUS RETURN CODES.
> - */
> - /* Operation not supported (only happens on barrier writes). */
> +* STATUS RETURN CODES.
> +*/
> +/* Operation not supported (only happens on barrier writes). */
>  #define BLKIF_RSP_EOPNOTSUPP  -2
> - /* Operation failed for some unspecified reason (-EIO). */
> +/* Operation failed for some unspecified reason (-EIO). */
>  #define BLKIF_RSP_ERROR       -1
> - /* Operation completed successfully. */
> +/* Operation completed successfully. */
>  #define BLKIF_RSP_OKAY         0
> 
>  /*
> - * Generate blkif ring structures and types.
> - */
> +* Generate blkif ring structures and types.
> +*/
>  DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response);
> 
>  #define VDISK_CDROM        0x1
> @@ -598,11 +692,11 @@ DEFINE_RING_TYPES(blkif, struct blkif_request,
> struct blkif_response);
>  #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */
> 
>  /*
> - * Local variables:
> - * mode: C
> - * c-file-style: "BSD"
> - * c-basic-offset: 4
> - * tab-width: 4
> - * indent-tabs-mode: nil
> - * End:
> - */
> +* Local variables:
> +* mode: C
> +* c-file-style: "BSD"
> +* c-basic-offset: 4
> +* tab-width: 4
> +* indent-tabs-mode: nil
> +* End:
> +*/
> --
> 2.16.2.windows.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/win-pv-devel
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.