#include <scsi/scsi.h>
#include <scsi/scsi_eh.h>
#include <scsi/scsi_dh.h>
#include <linux/workqueue.h>
#include <linux/slab.h>
#include <linux/module.h>
#define RDAC_NAME …
#define RDAC_RETRY_COUNT …
#define RDAC_QUIESCENCE_TIME …
#define RDAC_PAGE_CODE_REDUNDANT_CONTROLLER …
#define RDAC_MODE_TRANSFER_SPECIFIED_LUNS …
#define RDAC_FORCED_QUIESENCE …
#define RDAC_TIMEOUT …
#define RDAC_RETRIES …
struct rdac_mode_6_hdr { … };
struct rdac_mode_10_hdr { … };
struct rdac_mode_common { … };
struct rdac_pg_legacy { … };
struct rdac_pg_expanded { … };
struct c9_inquiry { … };
#define SUBSYS_ID_LEN …
#define SLOT_ID_LEN …
#define ARRAY_LABEL_LEN …
struct c4_inquiry { … };
#define UNIQUE_ID_LEN …
struct c8_inquiry { … };
struct rdac_controller { … };
struct c2_inquiry { … };
struct rdac_dh_data { … };
static const char *mode[] = …;
static const char *lun_state[] = …;
struct rdac_queue_data { … };
static LIST_HEAD(ctlr_list);
static DEFINE_SPINLOCK(list_lock);
static struct workqueue_struct *kmpath_rdacd;
static void send_mode_select(struct work_struct *work);
static int rdac_logging = …;
module_param(rdac_logging, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(…) …;
#define RDAC_LOG_FAILOVER …
#define RDAC_LOG_SENSE …
#define RDAC_LOG_BITS …
#define RDAC_LOG_LEVEL(SHIFT) …
#define RDAC_LOG(SHIFT, sdev, f, arg...) …
static unsigned int rdac_failover_get(struct rdac_controller *ctlr,
struct list_head *list,
unsigned char *cdb)
{ … }
static void release_controller(struct kref *kref)
{ … }
static struct rdac_controller *get_controller(int index, char *array_name,
u8 *array_id, struct scsi_device *sdev)
{ … }
static int get_lun_info(struct scsi_device *sdev, struct rdac_dh_data *h,
char *array_name, u8 *array_id)
{ … }
static int check_ownership(struct scsi_device *sdev, struct rdac_dh_data *h)
{ … }
static int initialize_controller(struct scsi_device *sdev,
struct rdac_dh_data *h, char *array_name, u8 *array_id)
{ … }
static int set_mode_select(struct scsi_device *sdev, struct rdac_dh_data *h)
{ … }
static int mode_select_handle_sense(struct scsi_device *sdev,
struct scsi_sense_hdr *sense_hdr)
{ … }
static void send_mode_select(struct work_struct *work)
{ … }
static int queue_mode_select(struct scsi_device *sdev,
activate_complete fn, void *data)
{ … }
static int rdac_activate(struct scsi_device *sdev,
activate_complete fn, void *data)
{ … }
static blk_status_t rdac_prep_fn(struct scsi_device *sdev, struct request *req)
{ … }
static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
struct scsi_sense_hdr *sense_hdr)
{ … }
static int rdac_bus_attach(struct scsi_device *sdev)
{ … }
static void rdac_bus_detach( struct scsi_device *sdev )
{ … }
static struct scsi_device_handler rdac_dh = …;
static int __init rdac_init(void)
{ … }
static void __exit rdac_exit(void)
{ … }
module_init(…) …;
module_exit(rdac_exit);
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;
MODULE_VERSION(…) …;
MODULE_LICENSE(…) …;