|
@@ -57,6 +57,36 @@ typedef uint64_t blkif_sector_t;
|
|
|
* "feature-flush-cache" node!
|
|
|
*/
|
|
|
#define BLKIF_OP_FLUSH_DISKCACHE 3
|
|
|
+
|
|
|
+/*
|
|
|
+ * Recognised only if "feature-discard" is present in backend xenbus info.
|
|
|
+ * The "feature-discard" node contains a boolean indicating whether trim
|
|
|
+ * (ATA) or unmap (SCSI) - conviently called discard requests are likely
|
|
|
+ * to succeed or fail. Either way, a discard request
|
|
|
+ * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
|
|
|
+ * the underlying block-device hardware. The boolean simply indicates whether
|
|
|
+ * or not it is worthwhile for the frontend to attempt discard requests.
|
|
|
+ * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
|
|
|
+ * create the "feature-discard" node!
|
|
|
+ *
|
|
|
+ * Discard operation is a request for the underlying block device to mark
|
|
|
+ * extents to be erased. However, discard does not guarantee that the blocks
|
|
|
+ * will be erased from the device - it is just a hint to the device
|
|
|
+ * controller that these blocks are no longer in use. What the device
|
|
|
+ * controller does with that information is left to the controller.
|
|
|
+ * Discard operations are passed with sector_number as the
|
|
|
+ * sector index to begin discard operations at and nr_sectors as the number of
|
|
|
+ * sectors to be discarded. The specified sectors should be discarded if the
|
|
|
+ * underlying block device supports trim (ATA) or unmap (SCSI) operations,
|
|
|
+ * or a BLKIF_RSP_EOPNOTSUPP should be returned.
|
|
|
+ * More information about trim/unmap operations 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
|
|
|
+ */
|
|
|
+#define BLKIF_OP_DISCARD 5
|
|
|
+
|
|
|
/*
|
|
|
* Maximum scatter/gather segments per request.
|
|
|
* This is carefully chosen so that sizeof(struct blkif_ring) <= PAGE_SIZE.
|
|
@@ -74,6 +104,11 @@ struct blkif_request_rw {
|
|
|
} seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
|
|
};
|
|
|
|
|
|
+struct blkif_request_discard {
|
|
|
+ blkif_sector_t sector_number;
|
|
|
+ uint64_t nr_sectors;
|
|
|
+};
|
|
|
+
|
|
|
struct blkif_request {
|
|
|
uint8_t operation; /* BLKIF_OP_??? */
|
|
|
uint8_t nr_segments; /* number of segments */
|
|
@@ -81,6 +116,7 @@ struct blkif_request {
|
|
|
uint64_t id; /* private guest value, echoed in resp */
|
|
|
union {
|
|
|
struct blkif_request_rw rw;
|
|
|
+ struct blkif_request_discard discard;
|
|
|
} u;
|
|
|
};
|
|
|
|