Jeremy Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame^] | 1 | /****************************************************************************** |
| 2 | * blkif.h |
| 3 | * |
| 4 | * Unified block-device I/O interface for Xen guest OSes. |
| 5 | * |
| 6 | * Copyright (c) 2003-2004, Keir Fraser |
| 7 | */ |
| 8 | |
| 9 | #ifndef __XEN_PUBLIC_IO_BLKIF_H__ |
| 10 | #define __XEN_PUBLIC_IO_BLKIF_H__ |
| 11 | |
| 12 | #include "ring.h" |
| 13 | #include "../grant_table.h" |
| 14 | |
| 15 | /* |
| 16 | * Front->back notifications: When enqueuing a new request, sending a |
| 17 | * notification can be made conditional on req_event (i.e., the generic |
| 18 | * hold-off mechanism provided by the ring macros). Backends must set |
| 19 | * req_event appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). |
| 20 | * |
| 21 | * Back->front notifications: When enqueuing a new response, sending a |
| 22 | * notification can be made conditional on rsp_event (i.e., the generic |
| 23 | * hold-off mechanism provided by the ring macros). Frontends must set |
| 24 | * rsp_event appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). |
| 25 | */ |
| 26 | |
| 27 | typedef uint16_t blkif_vdev_t; |
| 28 | typedef uint64_t blkif_sector_t; |
| 29 | |
| 30 | /* |
| 31 | * REQUEST CODES. |
| 32 | */ |
| 33 | #define BLKIF_OP_READ 0 |
| 34 | #define BLKIF_OP_WRITE 1 |
| 35 | /* |
| 36 | * Recognised only if "feature-barrier" is present in backend xenbus info. |
| 37 | * The "feature_barrier" node contains a boolean indicating whether barrier |
| 38 | * requests are likely to succeed or fail. Either way, a barrier request |
| 39 | * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by |
| 40 | * the underlying block-device hardware. The boolean simply indicates whether |
| 41 | * or not it is worthwhile for the frontend to attempt barrier requests. |
| 42 | * If a backend does not recognise BLKIF_OP_WRITE_BARRIER, it should *not* |
| 43 | * create the "feature-barrier" node! |
| 44 | */ |
| 45 | #define BLKIF_OP_WRITE_BARRIER 2 |
| 46 | |
| 47 | /* |
| 48 | * Maximum scatter/gather segments per request. |
| 49 | * This is carefully chosen so that sizeof(struct blkif_ring) <= PAGE_SIZE. |
| 50 | * NB. This could be 12 if the ring indexes weren't stored in the same page. |
| 51 | */ |
| 52 | #define BLKIF_MAX_SEGMENTS_PER_REQUEST 11 |
| 53 | |
| 54 | struct blkif_request { |
| 55 | uint8_t operation; /* BLKIF_OP_??? */ |
| 56 | uint8_t nr_segments; /* number of segments */ |
| 57 | blkif_vdev_t handle; /* only for read/write requests */ |
| 58 | uint64_t id; /* private guest value, echoed in resp */ |
| 59 | blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ |
| 60 | struct blkif_request_segment { |
| 61 | grant_ref_t gref; /* reference to I/O buffer frame */ |
| 62 | /* @first_sect: first sector in frame to transfer (inclusive). */ |
| 63 | /* @last_sect: last sector in frame to transfer (inclusive). */ |
| 64 | uint8_t first_sect, last_sect; |
| 65 | } seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; |
| 66 | }; |
| 67 | |
| 68 | struct blkif_response { |
| 69 | uint64_t id; /* copied from request */ |
| 70 | uint8_t operation; /* copied from request */ |
| 71 | int16_t status; /* BLKIF_RSP_??? */ |
| 72 | }; |
| 73 | |
| 74 | /* |
| 75 | * STATUS RETURN CODES. |
| 76 | */ |
| 77 | /* Operation not supported (only happens on barrier writes). */ |
| 78 | #define BLKIF_RSP_EOPNOTSUPP -2 |
| 79 | /* Operation failed for some unspecified reason (-EIO). */ |
| 80 | #define BLKIF_RSP_ERROR -1 |
| 81 | /* Operation completed successfully. */ |
| 82 | #define BLKIF_RSP_OKAY 0 |
| 83 | |
| 84 | /* |
| 85 | * Generate blkif ring structures and types. |
| 86 | */ |
| 87 | |
| 88 | DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response); |
| 89 | |
| 90 | #define VDISK_CDROM 0x1 |
| 91 | #define VDISK_REMOVABLE 0x2 |
| 92 | #define VDISK_READONLY 0x4 |
| 93 | |
| 94 | #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ |