bdev: make struct spdk_bdev_io contents private
Change-Id: I24ff52a7375d54df06b9769bc53ddf84691e1cb1 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
04f476eec3
commit
15fcb1020c
@ -57,7 +57,13 @@
|
|||||||
|
|
||||||
typedef void (*spdk_bdev_remove_cb_t)(void *remove_ctx);
|
typedef void (*spdk_bdev_remove_cb_t)(void *remove_ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Block device I/O
|
||||||
|
*
|
||||||
|
* This is an I/O that is passed to an spdk_bdev.
|
||||||
|
*/
|
||||||
struct spdk_bdev_io;
|
struct spdk_bdev_io;
|
||||||
|
|
||||||
struct spdk_bdev_fn_table;
|
struct spdk_bdev_fn_table;
|
||||||
struct spdk_io_channel;
|
struct spdk_io_channel;
|
||||||
struct spdk_json_write_ctx;
|
struct spdk_json_write_ctx;
|
||||||
@ -168,146 +174,6 @@ typedef void (*spdk_bdev_io_completion_cb)(struct spdk_bdev_io *bdev_io,
|
|||||||
void *cb_arg);
|
void *cb_arg);
|
||||||
typedef void (*spdk_bdev_io_get_rbuf_cb)(struct spdk_bdev_io *bdev_io);
|
typedef void (*spdk_bdev_io_get_rbuf_cb)(struct spdk_bdev_io *bdev_io);
|
||||||
|
|
||||||
/**
|
|
||||||
* Block device I/O
|
|
||||||
*
|
|
||||||
* This is an I/O that is passed to an spdk_bdev.
|
|
||||||
*/
|
|
||||||
struct spdk_bdev_io {
|
|
||||||
/** Pointer to scratch area reserved for use by the driver consuming this spdk_bdev_io. */
|
|
||||||
void *ctx;
|
|
||||||
|
|
||||||
/** The block device that this I/O belongs to. */
|
|
||||||
struct spdk_bdev *bdev;
|
|
||||||
|
|
||||||
/** The I/O channel to submit this I/O on. */
|
|
||||||
struct spdk_io_channel *ch;
|
|
||||||
|
|
||||||
/** Generation value for each I/O. */
|
|
||||||
uint32_t gencnt;
|
|
||||||
|
|
||||||
/** Enumerated value representing the I/O type. */
|
|
||||||
enum spdk_bdev_io_type type;
|
|
||||||
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
|
|
||||||
/** The unaligned rbuf originally allocated. */
|
|
||||||
void *buf_unaligned;
|
|
||||||
|
|
||||||
/** For basic read case, use our own iovec element. */
|
|
||||||
struct iovec iov;
|
|
||||||
|
|
||||||
/** For SG buffer cases, array of iovecs to transfer. */
|
|
||||||
struct iovec *iovs;
|
|
||||||
|
|
||||||
/** For SG buffer cases, number of iovecs in iovec array. */
|
|
||||||
int iovcnt;
|
|
||||||
|
|
||||||
/** For SG buffer cases, total size of data to be transferred. */
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
|
||||||
uint64_t offset;
|
|
||||||
|
|
||||||
/** Indicate whether the blockdev layer to put rbuf or not. */
|
|
||||||
bool put_rbuf;
|
|
||||||
} read;
|
|
||||||
struct {
|
|
||||||
/** For basic write case, use our own iovec element */
|
|
||||||
struct iovec iov;
|
|
||||||
|
|
||||||
/** For SG buffer cases, array of iovecs to transfer. */
|
|
||||||
struct iovec *iovs;
|
|
||||||
|
|
||||||
/** For SG buffer cases, number of iovecs in iovec array. */
|
|
||||||
int iovcnt;
|
|
||||||
|
|
||||||
/** For SG buffer cases, total size of data to be transferred. */
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
|
||||||
uint64_t offset;
|
|
||||||
} write;
|
|
||||||
struct {
|
|
||||||
/** Represents the unmap block descriptors. */
|
|
||||||
struct spdk_scsi_unmap_bdesc *unmap_bdesc;
|
|
||||||
|
|
||||||
/** Count of unmap block descriptors. */
|
|
||||||
uint16_t bdesc_count;
|
|
||||||
} unmap;
|
|
||||||
struct {
|
|
||||||
/** Represents starting offset in bytes of the range to be flushed. */
|
|
||||||
uint64_t offset;
|
|
||||||
|
|
||||||
/** Represents the number of bytes to be flushed, starting at offset. */
|
|
||||||
uint64_t length;
|
|
||||||
} flush;
|
|
||||||
struct {
|
|
||||||
enum spdk_bdev_reset_type type;
|
|
||||||
} reset;
|
|
||||||
} u;
|
|
||||||
|
|
||||||
/** Error information from a device */
|
|
||||||
union {
|
|
||||||
/** Only valid when status is SPDK_BDEV_IO_STATUS_NVME_ERROR */
|
|
||||||
struct {
|
|
||||||
/** NVMe status code type */
|
|
||||||
int sct;
|
|
||||||
/** NVMe status code */
|
|
||||||
int sc;
|
|
||||||
} nvme;
|
|
||||||
/** Only valid when status is SPDK_BDEV_IO_STATUS_SCSI_ERROR */
|
|
||||||
struct {
|
|
||||||
/** SCSI status code */
|
|
||||||
enum spdk_scsi_status sc;
|
|
||||||
/** SCSI sense key */
|
|
||||||
enum spdk_scsi_sense sk;
|
|
||||||
/** SCSI additional sense code */
|
|
||||||
uint8_t asc;
|
|
||||||
/** SCSI additional sense code qualifier */
|
|
||||||
uint8_t ascq;
|
|
||||||
} scsi;
|
|
||||||
} error;
|
|
||||||
|
|
||||||
/** User function that will be called when this completes */
|
|
||||||
spdk_bdev_io_completion_cb cb;
|
|
||||||
|
|
||||||
/** Context that will be passed to the completion callback */
|
|
||||||
void *caller_ctx;
|
|
||||||
|
|
||||||
/** Callback for when rbuf is allocated */
|
|
||||||
spdk_bdev_io_get_rbuf_cb get_rbuf_cb;
|
|
||||||
|
|
||||||
/** Status for the IO */
|
|
||||||
enum spdk_bdev_io_status status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set to true while the bdev module submit_request function is in progress.
|
|
||||||
*
|
|
||||||
* This is used to decide whether spdk_bdev_io_complete() can complete the I/O directly
|
|
||||||
* or if completion must be deferred via an event.
|
|
||||||
*/
|
|
||||||
bool in_submit_request;
|
|
||||||
|
|
||||||
/** Used in virtual device (e.g., RAID), indicates its parent spdk_bdev_io */
|
|
||||||
struct spdk_bdev_io *parent;
|
|
||||||
|
|
||||||
/** Used in virtual device (e.g., RAID) for storing multiple child device I/Os */
|
|
||||||
TAILQ_HEAD(child_io, spdk_bdev_io) child_io;
|
|
||||||
|
|
||||||
/** Member used for linking child I/Os together. */
|
|
||||||
TAILQ_ENTRY(spdk_bdev_io) link;
|
|
||||||
|
|
||||||
/** Entry to the list need_buf of struct spdk_bdev. */
|
|
||||||
TAILQ_ENTRY(spdk_bdev_io) rbuf_link;
|
|
||||||
|
|
||||||
/** Per I/O context for use by the blockdev module */
|
|
||||||
uint8_t driver_ctx[0];
|
|
||||||
|
|
||||||
/* No members may be added after driver_ctx! */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct spdk_bdev *spdk_bdev_get_by_name(const char *bdev_name);
|
struct spdk_bdev *spdk_bdev_get_by_name(const char *bdev_name);
|
||||||
void spdk_bdev_unregister(struct spdk_bdev *bdev);
|
void spdk_bdev_unregister(struct spdk_bdev *bdev);
|
||||||
|
|
||||||
|
@ -149,6 +149,141 @@ struct spdk_bdev_fn_table {
|
|||||||
int (*dump_config_json)(void *ctx, struct spdk_json_write_ctx *w);
|
int (*dump_config_json)(void *ctx, struct spdk_json_write_ctx *w);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct spdk_bdev_io {
|
||||||
|
/** Pointer to scratch area reserved for use by the driver consuming this spdk_bdev_io. */
|
||||||
|
void *ctx;
|
||||||
|
|
||||||
|
/** The block device that this I/O belongs to. */
|
||||||
|
struct spdk_bdev *bdev;
|
||||||
|
|
||||||
|
/** The I/O channel to submit this I/O on. */
|
||||||
|
struct spdk_io_channel *ch;
|
||||||
|
|
||||||
|
/** Generation value for each I/O. */
|
||||||
|
uint32_t gencnt;
|
||||||
|
|
||||||
|
/** Enumerated value representing the I/O type. */
|
||||||
|
enum spdk_bdev_io_type type;
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
|
||||||
|
/** The unaligned rbuf originally allocated. */
|
||||||
|
void *buf_unaligned;
|
||||||
|
|
||||||
|
/** For basic read case, use our own iovec element. */
|
||||||
|
struct iovec iov;
|
||||||
|
|
||||||
|
/** For SG buffer cases, array of iovecs to transfer. */
|
||||||
|
struct iovec *iovs;
|
||||||
|
|
||||||
|
/** For SG buffer cases, number of iovecs in iovec array. */
|
||||||
|
int iovcnt;
|
||||||
|
|
||||||
|
/** For SG buffer cases, total size of data to be transferred. */
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
||||||
|
uint64_t offset;
|
||||||
|
|
||||||
|
/** Indicate whether the blockdev layer to put rbuf or not. */
|
||||||
|
bool put_rbuf;
|
||||||
|
} read;
|
||||||
|
struct {
|
||||||
|
/** For basic write case, use our own iovec element */
|
||||||
|
struct iovec iov;
|
||||||
|
|
||||||
|
/** For SG buffer cases, array of iovecs to transfer. */
|
||||||
|
struct iovec *iovs;
|
||||||
|
|
||||||
|
/** For SG buffer cases, number of iovecs in iovec array. */
|
||||||
|
int iovcnt;
|
||||||
|
|
||||||
|
/** For SG buffer cases, total size of data to be transferred. */
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
||||||
|
uint64_t offset;
|
||||||
|
} write;
|
||||||
|
struct {
|
||||||
|
/** Represents the unmap block descriptors. */
|
||||||
|
struct spdk_scsi_unmap_bdesc *unmap_bdesc;
|
||||||
|
|
||||||
|
/** Count of unmap block descriptors. */
|
||||||
|
uint16_t bdesc_count;
|
||||||
|
} unmap;
|
||||||
|
struct {
|
||||||
|
/** Represents starting offset in bytes of the range to be flushed. */
|
||||||
|
uint64_t offset;
|
||||||
|
|
||||||
|
/** Represents the number of bytes to be flushed, starting at offset. */
|
||||||
|
uint64_t length;
|
||||||
|
} flush;
|
||||||
|
struct {
|
||||||
|
enum spdk_bdev_reset_type type;
|
||||||
|
} reset;
|
||||||
|
} u;
|
||||||
|
|
||||||
|
/** Error information from a device */
|
||||||
|
union {
|
||||||
|
/** Only valid when status is SPDK_BDEV_IO_STATUS_NVME_ERROR */
|
||||||
|
struct {
|
||||||
|
/** NVMe status code type */
|
||||||
|
int sct;
|
||||||
|
/** NVMe status code */
|
||||||
|
int sc;
|
||||||
|
} nvme;
|
||||||
|
/** Only valid when status is SPDK_BDEV_IO_STATUS_SCSI_ERROR */
|
||||||
|
struct {
|
||||||
|
/** SCSI status code */
|
||||||
|
enum spdk_scsi_status sc;
|
||||||
|
/** SCSI sense key */
|
||||||
|
enum spdk_scsi_sense sk;
|
||||||
|
/** SCSI additional sense code */
|
||||||
|
uint8_t asc;
|
||||||
|
/** SCSI additional sense code qualifier */
|
||||||
|
uint8_t ascq;
|
||||||
|
} scsi;
|
||||||
|
} error;
|
||||||
|
|
||||||
|
/** User function that will be called when this completes */
|
||||||
|
spdk_bdev_io_completion_cb cb;
|
||||||
|
|
||||||
|
/** Context that will be passed to the completion callback */
|
||||||
|
void *caller_ctx;
|
||||||
|
|
||||||
|
/** Callback for when rbuf is allocated */
|
||||||
|
spdk_bdev_io_get_rbuf_cb get_rbuf_cb;
|
||||||
|
|
||||||
|
/** Status for the IO */
|
||||||
|
enum spdk_bdev_io_status status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set to true while the bdev module submit_request function is in progress.
|
||||||
|
*
|
||||||
|
* This is used to decide whether spdk_bdev_io_complete() can complete the I/O directly
|
||||||
|
* or if completion must be deferred via an event.
|
||||||
|
*/
|
||||||
|
bool in_submit_request;
|
||||||
|
|
||||||
|
/** Used in virtual device (e.g., RAID), indicates its parent spdk_bdev_io */
|
||||||
|
struct spdk_bdev_io *parent;
|
||||||
|
|
||||||
|
/** Used in virtual device (e.g., RAID) for storing multiple child device I/Os */
|
||||||
|
TAILQ_HEAD(child_io, spdk_bdev_io) child_io;
|
||||||
|
|
||||||
|
/** Member used for linking child I/Os together. */
|
||||||
|
TAILQ_ENTRY(spdk_bdev_io) link;
|
||||||
|
|
||||||
|
/** Entry to the list need_buf of struct spdk_bdev. */
|
||||||
|
TAILQ_ENTRY(spdk_bdev_io) rbuf_link;
|
||||||
|
|
||||||
|
/** Per I/O context for use by the blockdev module */
|
||||||
|
uint8_t driver_ctx[0];
|
||||||
|
|
||||||
|
/* No members may be added after driver_ctx! */
|
||||||
|
};
|
||||||
|
|
||||||
void spdk_bdev_register(struct spdk_bdev *bdev);
|
void spdk_bdev_register(struct spdk_bdev *bdev);
|
||||||
void spdk_bdev_io_get_rbuf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_rbuf_cb cb);
|
void spdk_bdev_io_get_rbuf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_rbuf_cb cb);
|
||||||
struct spdk_bdev_io *spdk_bdev_get_io(void);
|
struct spdk_bdev_io *spdk_bdev_get_io(void);
|
||||||
|
@ -34,6 +34,12 @@
|
|||||||
|
|
||||||
#include "scsi_internal.h"
|
#include "scsi_internal.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: move bdev SCSI error code translation tests to bdev unit test
|
||||||
|
* and remove this include.
|
||||||
|
*/
|
||||||
|
#include "spdk_internal/bdev.h"
|
||||||
|
|
||||||
#include "spdk/env.h"
|
#include "spdk/env.h"
|
||||||
#include "spdk/bdev.h"
|
#include "spdk/bdev.h"
|
||||||
#include "spdk/endian.h"
|
#include "spdk/endian.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user