#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/bsg-lib.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi_transport.h>
#include <scsi/scsi_transport_fc.h>
#include <scsi/scsi_cmnd.h>
#include <net/netlink.h>
#include <scsi/scsi_netlink_fc.h>
#include <scsi/scsi_bsg_fc.h>
#include <uapi/scsi/fc/fc_els.h>
#include "scsi_priv.h"
static int fc_queue_work(struct Scsi_Host *, struct work_struct *);
static void fc_vport_sched_delete(struct work_struct *work);
static int fc_vport_setup(struct Scsi_Host *shost, int channel,
struct device *pdev, struct fc_vport_identifiers *ids,
struct fc_vport **vport);
static int fc_bsg_hostadd(struct Scsi_Host *, struct fc_host_attrs *);
static int fc_bsg_rportadd(struct Scsi_Host *, struct fc_rport *);
static void fc_bsg_remove(struct request_queue *);
static void fc_bsg_goose_queue(struct fc_rport *);
static void fc_li_stats_update(u16 event_type,
struct fc_fpin_stats *stats);
static void fc_delivery_stats_update(u32 reason_code,
struct fc_fpin_stats *stats);
static void fc_cn_stats_update(u16 event_type, struct fc_fpin_stats *stats);
static unsigned int fc_dev_loss_tmo = …;
module_param_named(dev_loss_tmo, fc_dev_loss_tmo, uint, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(…) …;
#define FC_DEVICE_ATTR(_prefix,_name,_mode,_show,_store) …
#define fc_enum_name_search(title, table_type, table) …
#define fc_enum_name_match(title, table_type, table) …
static struct { … } fc_port_type_names[] = …;
fc_enum_name_search(port_type, fc_port_type, fc_port_type_names)
#define FC_PORTTYPE_MAX_NAMELEN …
#define get_fc_vport_type_name …
static const struct { … } fc_host_event_code_names[] = …;
fc_enum_name_search(host_event_code, fc_host_event_code,
fc_host_event_code_names)
#define FC_HOST_EVENT_CODE_MAX_NAMELEN …
static struct { … } fc_port_state_names[] = …;
fc_enum_name_search(port_state, fc_port_state, fc_port_state_names)
fc_enum_name_match(port_state, fc_port_state, fc_port_state_names)
#define FC_PORTSTATE_MAX_NAMELEN …
static struct { … } fc_vport_state_names[] = …;
fc_enum_name_search(vport_state, fc_vport_state, fc_vport_state_names)
#define FC_VPORTSTATE_MAX_NAMELEN …
#define get_fc_vport_last_state_name …
static const struct { … } fc_tgtid_binding_type_names[] = …;
fc_enum_name_search(tgtid_bind_type, fc_tgtid_binding_type,
fc_tgtid_binding_type_names)
fc_enum_name_match(tgtid_bind_type, fc_tgtid_binding_type,
fc_tgtid_binding_type_names)
#define FC_BINDTYPE_MAX_NAMELEN …
#define fc_bitfield_name_search(title, table) …
static const struct { … } fc_cos_names[] = …;
fc_bitfield_name_search(cos, fc_cos_names)
static const struct { … } fc_port_speed_names[] = …;
fc_bitfield_name_search(port_speed, fc_port_speed_names)
static int
show_fc_fc4s (char *buf, u8 *fc4_list)
{ … }
static const struct { … } fc_port_role_names[] = …;
fc_bitfield_name_search(port_roles, fc_port_role_names)
#define FC_WELLKNOWN_PORTID_MASK …
#define FC_WELLKNOWN_ROLE_MASK …
#define FC_FPORT_PORTID …
#define FC_FABCTLR_PORTID …
#define FC_DIRSRVR_PORTID …
#define FC_TIMESRVR_PORTID …
#define FC_MGMTSRVR_PORTID …
static void fc_timeout_deleted_rport(struct work_struct *work);
static void fc_timeout_fail_rport_io(struct work_struct *work);
static void fc_scsi_scan_rport(struct work_struct *work);
#define FC_STARGET_NUM_ATTRS …
#define FC_RPORT_NUM_ATTRS …
#define FC_VPORT_NUM_ATTRS …
#define FC_HOST_NUM_ATTRS …
struct fc_internal { … };
#define to_fc_internal(tmpl) …
static int fc_target_setup(struct transport_container *tc, struct device *dev,
struct device *cdev)
{ … }
static DECLARE_TRANSPORT_CLASS(fc_transport_class,
"fc_transport",
fc_target_setup,
NULL,
NULL);
static int fc_host_setup(struct transport_container *tc, struct device *dev,
struct device *cdev)
{ … }
static int fc_host_remove(struct transport_container *tc, struct device *dev,
struct device *cdev)
{ … }
static DECLARE_TRANSPORT_CLASS(fc_host_class,
"fc_host",
fc_host_setup,
fc_host_remove,
NULL);
static DECLARE_TRANSPORT_CLASS(fc_rport_class,
"fc_remote_ports",
NULL,
NULL,
NULL);
static DECLARE_TRANSPORT_CLASS(fc_vport_class,
"fc_vports",
NULL,
NULL,
NULL);
static atomic_t fc_event_seq;
u32
fc_get_event_number(void)
{ … }
EXPORT_SYMBOL(…);
void
fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number,
enum fc_host_event_code event_code,
u32 data_len, char *data_buf, u64 vendor_id)
{ … }
EXPORT_SYMBOL(…);
void
fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
enum fc_host_event_code event_code, u32 event_data)
{ … }
EXPORT_SYMBOL(…);
void
fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
u32 data_len, char * data_buf, u64 vendor_id)
{ … }
EXPORT_SYMBOL(…);
struct fc_rport *
fc_find_rport_by_wwpn(struct Scsi_Host *shost, u64 wwpn)
{ … }
EXPORT_SYMBOL(…);
static void
fc_li_stats_update(u16 event_type,
struct fc_fpin_stats *stats)
{ … }
static void
fc_delivery_stats_update(u32 reason_code, struct fc_fpin_stats *stats)
{ … }
static void
fc_cn_stats_update(u16 event_type, struct fc_fpin_stats *stats)
{ … }
static void
fc_fpin_li_stats_update(struct Scsi_Host *shost, struct fc_tlv_desc *tlv)
{ … }
static void
fc_fpin_delivery_stats_update(struct Scsi_Host *shost,
struct fc_tlv_desc *tlv)
{ … }
static void
fc_fpin_peer_congn_stats_update(struct Scsi_Host *shost,
struct fc_tlv_desc *tlv)
{ … }
static void
fc_fpin_congn_stats_update(struct Scsi_Host *shost,
struct fc_tlv_desc *tlv)
{ … }
void
fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf,
u8 event_acknowledge)
{ … }
EXPORT_SYMBOL(…);
static __init int fc_transport_init(void)
{ … }
static void __exit fc_transport_exit(void)
{ … }
#define fc_rport_show_function(field, format_string, sz, cast) …
#define fc_rport_store_function(field) …
#define fc_rport_rd_attr(field, format_string, sz) …
#define fc_rport_rd_attr_cast(field, format_string, sz, cast) …
#define fc_rport_rw_attr(field, format_string, sz) …
#define fc_private_rport_show_function(field, format_string, sz, cast) …
#define fc_private_rport_rd_attr(field, format_string, sz) …
#define fc_private_rport_rd_attr_cast(field, format_string, sz, cast) …
#define fc_private_rport_rd_enum_attr(title, maxlen) …
#define SETUP_RPORT_ATTRIBUTE_RD(field) …
#define SETUP_PRIVATE_RPORT_ATTRIBUTE_RD(field) …
#define SETUP_RPORT_ATTRIBUTE_RW(field) …
#define SETUP_PRIVATE_RPORT_ATTRIBUTE_RW(field) …
fc_private_rport_rd_attr(…);
static ssize_t
show_fc_rport_supported_classes (struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static FC_DEVICE_ATTR(rport, supported_classes, S_IRUGO,
show_fc_rport_supported_classes, NULL);
static int fc_str_to_dev_loss(const char *buf, unsigned long *val)
{ … }
static int fc_rport_set_dev_loss_tmo(struct fc_rport *rport,
unsigned long val)
{ … }
fc_rport_show_function(…) …
static ssize_t
store_fc_rport_dev_loss_tmo(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static FC_DEVICE_ATTR(rport, dev_loss_tmo, S_IRUGO | S_IWUSR,
show_fc_rport_dev_loss_tmo, store_fc_rport_dev_loss_tmo);
fc_private_rport_rd_attr_cast(…) …;
fc_private_rport_rd_attr_cast(…) …;
fc_private_rport_rd_attr(…);
static ssize_t
show_fc_rport_roles (struct device *dev, struct device_attribute *attr,
char *buf)
{ … }
static FC_DEVICE_ATTR(rport, roles, S_IRUGO,
show_fc_rport_roles, NULL);
static ssize_t fc_rport_set_marginal_state(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static ssize_t
show_fc_rport_port_state(struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static FC_DEVICE_ATTR(rport, port_state, 0444 | 0200,
show_fc_rport_port_state, fc_rport_set_marginal_state);
fc_private_rport_rd_attr(…);
static ssize_t
show_fc_rport_fast_io_fail_tmo (struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static ssize_t
store_fc_rport_fast_io_fail_tmo(struct device *dev,
struct device_attribute *attr, const char *buf,
size_t count)
{ … }
static FC_DEVICE_ATTR(rport, fast_io_fail_tmo, S_IRUGO | S_IWUSR,
show_fc_rport_fast_io_fail_tmo, store_fc_rport_fast_io_fail_tmo);
#define fc_rport_fpin_statistic(name) …
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
fc_rport_fpin_statistic(…);
static struct attribute *fc_rport_statistics_attrs[] = …;
static struct attribute_group fc_rport_statistics_group = …;
#define fc_starget_show_function(field, format_string, sz, cast) …
#define fc_starget_rd_attr(field, format_string, sz) …
#define fc_starget_rd_attr_cast(field, format_string, sz, cast) …
#define SETUP_STARGET_ATTRIBUTE_RD(field) …
#define SETUP_STARGET_ATTRIBUTE_RW(field) …
fc_starget_rd_attr_cast(…);
fc_starget_rd_attr_cast(…);
fc_starget_rd_attr(…);
#define fc_vport_show_function(field, format_string, sz, cast) …
#define fc_vport_store_function(field) …
#define fc_vport_store_str_function(field, slen) …
#define fc_vport_rd_attr(field, format_string, sz) …
#define fc_vport_rd_attr_cast(field, format_string, sz, cast) …
#define fc_vport_rw_attr(field, format_string, sz) …
#define fc_private_vport_show_function(field, format_string, sz, cast) …
#define fc_private_vport_store_u32_function(field) …
#define fc_private_vport_rd_attr(field, format_string, sz) …
#define fc_private_vport_rd_attr_cast(field, format_string, sz, cast) …
#define fc_private_vport_rw_u32_attr(field, format_string, sz) …
#define fc_private_vport_rd_enum_attr(title, maxlen) …
#define SETUP_VPORT_ATTRIBUTE_RD(field) …
#define SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(field) …
#define SETUP_VPORT_ATTRIBUTE_WR(field) …
#define SETUP_VPORT_ATTRIBUTE_RW(field) …
#define SETUP_PRIVATE_VPORT_ATTRIBUTE_RW(field) …
fc_private_vport_rd_enum_attr(…);
fc_private_vport_rd_enum_attr(…);
fc_private_vport_rd_attr_cast(…) …;
fc_private_vport_rd_attr_cast(…) …;
static ssize_t
show_fc_vport_roles (struct device *dev, struct device_attribute *attr,
char *buf)
{ … }
static FC_DEVICE_ATTR(vport, roles, S_IRUGO, show_fc_vport_roles, NULL);
fc_private_vport_rd_enum_attr(…);
fc_private_vport_show_function(…) …
fc_vport_store_str_function(…) …
static FC_DEVICE_ATTR(vport, symbolic_name, S_IRUGO | S_IWUSR,
show_fc_vport_symbolic_name, store_fc_vport_symbolic_name);
static ssize_t
store_fc_vport_delete(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static FC_DEVICE_ATTR(vport, vport_delete, S_IWUSR,
NULL, store_fc_vport_delete);
static ssize_t
store_fc_vport_disable(struct device *dev, struct device_attribute *attr,
const char *buf,
size_t count)
{ … }
static FC_DEVICE_ATTR(vport, vport_disable, S_IWUSR,
NULL, store_fc_vport_disable);
#define fc_host_show_function(field, format_string, sz, cast) …
#define fc_host_store_function(field) …
#define fc_host_store_str_function(field, slen) …
#define fc_host_rd_attr(field, format_string, sz) …
#define fc_host_rd_attr_cast(field, format_string, sz, cast) …
#define fc_host_rw_attr(field, format_string, sz) …
#define fc_host_rd_enum_attr(title, maxlen) …
#define SETUP_HOST_ATTRIBUTE_RD(field) …
#define SETUP_HOST_ATTRIBUTE_RD_NS(field) …
#define SETUP_HOST_ATTRIBUTE_RW(field) …
#define fc_private_host_show_function(field, format_string, sz, cast) …
#define fc_private_host_rd_attr(field, format_string, sz) …
#define fc_private_host_rd_attr_cast(field, format_string, sz, cast) …
#define SETUP_PRIVATE_HOST_ATTRIBUTE_RD(field) …
#define SETUP_PRIVATE_HOST_ATTRIBUTE_RW(field) …
static ssize_t
show_fc_host_supported_classes (struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static FC_DEVICE_ATTR(host, supported_classes, S_IRUGO,
show_fc_host_supported_classes, NULL);
static ssize_t
show_fc_host_supported_fc4s (struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static FC_DEVICE_ATTR(host, supported_fc4s, S_IRUGO,
show_fc_host_supported_fc4s, NULL);
static ssize_t
show_fc_host_supported_speeds (struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static FC_DEVICE_ATTR(host, supported_speeds, S_IRUGO,
show_fc_host_supported_speeds, NULL);
fc_private_host_rd_attr_cast(…);
fc_private_host_rd_attr_cast(…);
fc_private_host_rd_attr_cast(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
fc_private_host_rd_attr(…);
static ssize_t
show_fc_host_active_fc4s (struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static FC_DEVICE_ATTR(host, active_fc4s, S_IRUGO,
show_fc_host_active_fc4s, NULL);
static ssize_t
show_fc_host_speed (struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
static FC_DEVICE_ATTR(host, speed, S_IRUGO,
show_fc_host_speed, NULL);
fc_host_rd_attr(…);
fc_host_rd_enum_attr(…);
fc_host_rd_enum_attr(…);
fc_host_rd_attr_cast(…);
fc_host_rd_attr(…);
fc_private_host_show_function(…)
fc_host_store_str_function(…)
static FC_DEVICE_ATTR(host, system_hostname, S_IRUGO | S_IWUSR,
show_fc_host_system_hostname, store_fc_host_system_hostname);
static ssize_t
show_fc_private_host_tgtid_bind_type(struct device *dev,
struct device_attribute *attr, char *buf)
{ … }
#define get_list_head_entry(pos, head, member) …
static ssize_t
store_fc_private_host_tgtid_bind_type(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{ … }
static FC_DEVICE_ATTR(host, tgtid_bind_type, S_IRUGO | S_IWUSR,
show_fc_private_host_tgtid_bind_type,
store_fc_private_host_tgtid_bind_type);
static ssize_t
store_fc_private_host_issue_lip(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{ … }
static FC_DEVICE_ATTR(host, issue_lip, S_IWUSR, NULL,
store_fc_private_host_issue_lip);
static ssize_t
store_fc_private_host_dev_loss_tmo(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
fc_private_host_show_function(dev_loss_tmo, "%d\n", 20, );
static FC_DEVICE_ATTR(host, dev_loss_tmo, S_IRUGO | S_IWUSR,
show_fc_host_dev_loss_tmo,
store_fc_private_host_dev_loss_tmo);
fc_private_host_rd_attr(…);
static ssize_t
fc_stat_show(const struct device *dev, char *buf, unsigned long offset)
{ … }
#define fc_host_statistic(name) …
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
fc_host_statistic(…);
#define fc_host_fpin_statistic(name) …
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
fc_host_fpin_statistic(…);
static ssize_t
fc_reset_statistics(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static FC_DEVICE_ATTR(host, reset_statistics, S_IWUSR, NULL,
fc_reset_statistics);
static struct attribute *fc_statistics_attrs[] = …;
static struct attribute_group fc_statistics_group = …;
static int
fc_parse_wwn(const char *ns, u64 *nm)
{ … }
static ssize_t
store_fc_host_vport_create(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static FC_DEVICE_ATTR(host, vport_create, S_IWUSR, NULL,
store_fc_host_vport_create);
static ssize_t
store_fc_host_vport_delete(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static FC_DEVICE_ATTR(host, vport_delete, S_IWUSR, NULL,
store_fc_host_vport_delete);
static int fc_host_match(struct attribute_container *cont,
struct device *dev)
{ … }
static int fc_target_match(struct attribute_container *cont,
struct device *dev)
{ … }
static void fc_rport_dev_release(struct device *dev)
{ … }
int scsi_is_fc_rport(const struct device *dev)
{ … }
EXPORT_SYMBOL(…);
static int fc_rport_match(struct attribute_container *cont,
struct device *dev)
{ … }
static void fc_vport_dev_release(struct device *dev)
{ … }
static int scsi_is_fc_vport(const struct device *dev)
{ … }
static int fc_vport_match(struct attribute_container *cont,
struct device *dev)
{ … }
enum scsi_timeout_action fc_eh_timed_out(struct scsi_cmnd *scmd)
{ … }
EXPORT_SYMBOL(…);
static void
fc_user_scan_tgt(struct Scsi_Host *shost, uint channel, uint id, u64 lun)
{ … }
static int
fc_user_scan(struct Scsi_Host *shost, uint channel, uint id, u64 lun)
{ … }
struct scsi_transport_template *
fc_attach_transport(struct fc_function_template *ft)
{ … }
EXPORT_SYMBOL(…);
void fc_release_transport(struct scsi_transport_template *t)
{ … }
EXPORT_SYMBOL(…);
static int
fc_queue_work(struct Scsi_Host *shost, struct work_struct *work)
{ … }
static void
fc_flush_work(struct Scsi_Host *shost)
{ … }
static int
fc_queue_devloss_work(struct Scsi_Host *shost, struct delayed_work *work,
unsigned long delay)
{ … }
static void
fc_flush_devloss(struct Scsi_Host *shost)
{ … }
void
fc_remove_host(struct Scsi_Host *shost)
{ … }
EXPORT_SYMBOL(…);
static void fc_terminate_rport_io(struct fc_rport *rport)
{ … }
static void
fc_starget_delete(struct work_struct *work)
{ … }
static void
fc_rport_final_delete(struct work_struct *work)
{ … }
static struct fc_rport *
fc_remote_port_create(struct Scsi_Host *shost, int channel,
struct fc_rport_identifiers *ids)
{ … }
struct fc_rport *
fc_remote_port_add(struct Scsi_Host *shost, int channel,
struct fc_rport_identifiers *ids)
{ … }
EXPORT_SYMBOL(…);
void
fc_remote_port_delete(struct fc_rport *rport)
{ … }
EXPORT_SYMBOL(…);
void
fc_remote_port_rolechg(struct fc_rport *rport, u32 roles)
{ … }
EXPORT_SYMBOL(…);
static void
fc_timeout_deleted_rport(struct work_struct *work)
{ … }
static void
fc_timeout_fail_rport_io(struct work_struct *work)
{ … }
static void
fc_scsi_scan_rport(struct work_struct *work)
{ … }
int fc_block_rport(struct fc_rport *rport)
{ … }
EXPORT_SYMBOL(…);
int fc_block_scsi_eh(struct scsi_cmnd *cmnd)
{ … }
EXPORT_SYMBOL(…);
bool fc_eh_should_retry_cmd(struct scsi_cmnd *scmd)
{ … }
EXPORT_SYMBOL_GPL(…);
static int
fc_vport_setup(struct Scsi_Host *shost, int channel, struct device *pdev,
struct fc_vport_identifiers *ids, struct fc_vport **ret_vport)
{ … }
struct fc_vport *
fc_vport_create(struct Scsi_Host *shost, int channel,
struct fc_vport_identifiers *ids)
{ … }
EXPORT_SYMBOL(…);
int
fc_vport_terminate(struct fc_vport *vport)
{ … }
EXPORT_SYMBOL(…);
static void
fc_vport_sched_delete(struct work_struct *work)
{ … }
static enum blk_eh_timer_return
fc_bsg_job_timeout(struct request *req)
{ … }
static int fc_bsg_host_dispatch(struct Scsi_Host *shost, struct bsg_job *job)
{ … }
static void
fc_bsg_goose_queue(struct fc_rport *rport)
{ … }
static int fc_bsg_rport_dispatch(struct Scsi_Host *shost, struct bsg_job *job)
{ … }
static int fc_bsg_dispatch(struct bsg_job *job)
{ … }
static blk_status_t fc_bsg_rport_prep(struct fc_rport *rport)
{ … }
static int fc_bsg_dispatch_prep(struct bsg_job *job)
{ … }
static int
fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
{ … }
static int
fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
{ … }
static void
fc_bsg_remove(struct request_queue *q)
{ … }
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
module_init(…) …;
module_exit(fc_transport_exit);