Merge tag 'for-5.3/block-20190708' of git://git.kernel.dk/linux-block
Pull block updates from Jens Axboe: "This is the main block updates for 5.3. Nothing earth shattering or major in here, just fixes, additions, and improvements all over the map. This contains: - Series of documentation fixes (Bart) - Optimization of the blk-mq ctx get/put (Bart) - null_blk removal race condition fix (Bob) - req/bio_op() cleanups (Chaitanya) - Series cleaning up the segment accounting, and request/bio mapping (Christoph) - Series cleaning up the page getting/putting for bios (Christoph) - block cgroup cleanups and moving it to where it is used (Christoph) - block cgroup fixes (Tejun) - Series of fixes and improvements to bcache, most notably a write deadlock fix (Coly) - blk-iolatency STS_AGAIN and accounting fixes (Dennis) - Series of improvements and fixes to BFQ (Douglas, Paolo) - debugfs_create() return value check removal for drbd (Greg) - Use struct_size(), where appropriate (Gustavo) - Two lighnvm fixes (Heiner, Geert) - MD fixes, including a read balance and corruption fix (Guoqing, Marcos, Xiao, Yufen) - block opal shadow mbr additions (Jonas, Revanth) - sbitmap compare-and-exhange improvemnts (Pavel) - Fix for potential bio->bi_size overflow (Ming) - NVMe pull requests: - improved PCIe suspent support (Keith Busch) - error injection support for the admin queue (Akinobu Mita) - Fibre Channel discovery improvements (James Smart) - tracing improvements including nvmetc tracing support (Minwoo Im) - misc fixes and cleanups (Anton Eidelman, Minwoo Im, Chaitanya Kulkarni)" - Various little fixes and improvements to drivers and core" * tag 'for-5.3/block-20190708' of git://git.kernel.dk/linux-block: (153 commits) blk-iolatency: fix STS_AGAIN handling block: nr_phys_segments needs to be zero for REQ_OP_WRITE_ZEROES blk-mq: simplify blk_mq_make_request() blk-mq: remove blk_mq_put_ctx() sbitmap: Replace cmpxchg with xchg block: fix .bi_size overflow block: sed-opal: check size of shadow mbr block: sed-opal: ioctl for writing to shadow mbr block: sed-opal: add ioctl for done-mark of shadow mbr block: never take page references for ITER_BVEC direct-io: use bio_release_pages in dio_bio_complete block_dev: use bio_release_pages in bio_unmap_user block_dev: use bio_release_pages in blkdev_bio_end_io iomap: use bio_release_pages in iomap_dio_bio_end_io block: use bio_release_pages in bio_map_user_iov block: use bio_release_pages in bio_unmap_user block: optionally mark pages dirty in bio_release_pages block: move the BIO_NO_PAGE_REF check into bio_release_pages block: skd_main.c: Remove call to memset after dma_alloc_coherent block: mtip32xx: Remove call to memset after dma_alloc_coherent ...
This commit is contained in:
@@ -274,6 +274,7 @@ struct lpfc_stats {
|
||||
uint32_t elsXmitADISC;
|
||||
uint32_t elsXmitLOGO;
|
||||
uint32_t elsXmitSCR;
|
||||
uint32_t elsXmitRSCN;
|
||||
uint32_t elsXmitRNID;
|
||||
uint32_t elsXmitFARP;
|
||||
uint32_t elsXmitFARPR;
|
||||
@@ -819,6 +820,7 @@ struct lpfc_hba {
|
||||
uint32_t cfg_use_msi;
|
||||
uint32_t cfg_auto_imax;
|
||||
uint32_t cfg_fcp_imax;
|
||||
uint32_t cfg_force_rscn;
|
||||
uint32_t cfg_cq_poll_threshold;
|
||||
uint32_t cfg_cq_max_proc_limit;
|
||||
uint32_t cfg_fcp_cpu_map;
|
||||
|
@@ -4958,6 +4958,64 @@ static DEVICE_ATTR(lpfc_req_fw_upgrade, S_IRUGO | S_IWUSR,
|
||||
lpfc_request_firmware_upgrade_show,
|
||||
lpfc_request_firmware_upgrade_store);
|
||||
|
||||
/**
|
||||
* lpfc_force_rscn_store
|
||||
*
|
||||
* @dev: class device that is converted into a Scsi_host.
|
||||
* @attr: device attribute, not used.
|
||||
* @buf: unused string
|
||||
* @count: unused variable.
|
||||
*
|
||||
* Description:
|
||||
* Force the switch to send a RSCN to all other NPorts in our zone
|
||||
* If we are direct connect pt2pt, build the RSCN command ourself
|
||||
* and send to the other NPort. Not supported for private loop.
|
||||
*
|
||||
* Returns:
|
||||
* 0 - on success
|
||||
* -EIO - if command is not sent
|
||||
**/
|
||||
static ssize_t
|
||||
lpfc_force_rscn_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
|
||||
int i;
|
||||
|
||||
i = lpfc_issue_els_rscn(vport, 0);
|
||||
if (i)
|
||||
return -EIO;
|
||||
return strlen(buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* lpfc_force_rscn: Force an RSCN to be sent to all remote NPorts
|
||||
* connected to the HBA.
|
||||
*
|
||||
* Value range is any ascii value
|
||||
*/
|
||||
static int lpfc_force_rscn;
|
||||
module_param(lpfc_force_rscn, int, 0644);
|
||||
MODULE_PARM_DESC(lpfc_force_rscn,
|
||||
"Force an RSCN to be sent to all remote NPorts");
|
||||
lpfc_param_show(force_rscn)
|
||||
|
||||
/**
|
||||
* lpfc_force_rscn_init - Force an RSCN to be sent to all remote NPorts
|
||||
* @phba: lpfc_hba pointer.
|
||||
* @val: unused value.
|
||||
*
|
||||
* Returns:
|
||||
* zero if val saved.
|
||||
**/
|
||||
static int
|
||||
lpfc_force_rscn_init(struct lpfc_hba *phba, int val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static DEVICE_ATTR_RW(lpfc_force_rscn);
|
||||
|
||||
/**
|
||||
* lpfc_fcp_imax_store
|
||||
*
|
||||
@@ -5958,6 +6016,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
|
||||
&dev_attr_lpfc_nvme_oas,
|
||||
&dev_attr_lpfc_nvme_embed_cmd,
|
||||
&dev_attr_lpfc_fcp_imax,
|
||||
&dev_attr_lpfc_force_rscn,
|
||||
&dev_attr_lpfc_cq_poll_threshold,
|
||||
&dev_attr_lpfc_cq_max_proc_limit,
|
||||
&dev_attr_lpfc_fcp_cpu_map,
|
||||
@@ -7005,6 +7064,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
|
||||
lpfc_nvme_oas_init(phba, lpfc_nvme_oas);
|
||||
lpfc_nvme_embed_cmd_init(phba, lpfc_nvme_embed_cmd);
|
||||
lpfc_fcp_imax_init(phba, lpfc_fcp_imax);
|
||||
lpfc_force_rscn_init(phba, lpfc_force_rscn);
|
||||
lpfc_cq_poll_threshold_init(phba, lpfc_cq_poll_threshold);
|
||||
lpfc_cq_max_proc_limit_init(phba, lpfc_cq_max_proc_limit);
|
||||
lpfc_fcp_cpu_map_init(phba, lpfc_fcp_cpu_map);
|
||||
|
@@ -141,6 +141,7 @@ int lpfc_issue_els_adisc(struct lpfc_vport *, struct lpfc_nodelist *, uint8_t);
|
||||
int lpfc_issue_els_logo(struct lpfc_vport *, struct lpfc_nodelist *, uint8_t);
|
||||
int lpfc_issue_els_npiv_logo(struct lpfc_vport *, struct lpfc_nodelist *);
|
||||
int lpfc_issue_els_scr(struct lpfc_vport *, uint32_t, uint8_t);
|
||||
int lpfc_issue_els_rscn(struct lpfc_vport *vport, uint8_t retry);
|
||||
int lpfc_issue_fabric_reglogin(struct lpfc_vport *);
|
||||
int lpfc_els_free_iocb(struct lpfc_hba *, struct lpfc_iocbq *);
|
||||
int lpfc_ct_free_iocb(struct lpfc_hba *, struct lpfc_iocbq *);
|
||||
@@ -355,6 +356,7 @@ void lpfc_mbox_timeout_handler(struct lpfc_hba *);
|
||||
struct lpfc_nodelist *lpfc_findnode_did(struct lpfc_vport *, uint32_t);
|
||||
struct lpfc_nodelist *lpfc_findnode_wwpn(struct lpfc_vport *,
|
||||
struct lpfc_name *);
|
||||
struct lpfc_nodelist *lpfc_findnode_mapped(struct lpfc_vport *vport);
|
||||
|
||||
int lpfc_sli_issue_mbox_wait(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t);
|
||||
|
||||
@@ -555,6 +557,8 @@ void lpfc_ras_stop_fwlog(struct lpfc_hba *phba);
|
||||
int lpfc_check_fwlog_support(struct lpfc_hba *phba);
|
||||
|
||||
/* NVME interfaces. */
|
||||
void lpfc_nvme_rescan_port(struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp);
|
||||
void lpfc_nvme_unregister_port(struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp);
|
||||
int lpfc_nvme_register_port(struct lpfc_vport *vport,
|
||||
|
@@ -30,6 +30,8 @@
|
||||
#include <scsi/scsi_device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <scsi/scsi_transport_fc.h>
|
||||
#include <uapi/scsi/fc/fc_fs.h>
|
||||
#include <uapi/scsi/fc/fc_els.h>
|
||||
|
||||
#include "lpfc_hw4.h"
|
||||
#include "lpfc_hw.h"
|
||||
@@ -3078,6 +3080,116 @@ lpfc_issue_els_scr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_issue_els_rscn - Issue an RSCN to the Fabric Controller (Fabric)
|
||||
* or the other nport (pt2pt).
|
||||
* @vport: pointer to a host virtual N_Port data structure.
|
||||
* @retry: number of retries to the command IOCB.
|
||||
*
|
||||
* This routine issues a RSCN to the Fabric Controller (DID 0xFFFFFD)
|
||||
* when connected to a fabric, or to the remote port when connected
|
||||
* in point-to-point mode. When sent to the Fabric Controller, it will
|
||||
* replay the RSCN to registered recipients.
|
||||
*
|
||||
* Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
|
||||
* will be incremented by 1 for holding the ndlp and the reference to ndlp
|
||||
* will be stored into the context1 field of the IOCB for the completion
|
||||
* callback function to the RSCN ELS command.
|
||||
*
|
||||
* Return code
|
||||
* 0 - Successfully issued RSCN command
|
||||
* 1 - Failed to issue RSCN command
|
||||
**/
|
||||
int
|
||||
lpfc_issue_els_rscn(struct lpfc_vport *vport, uint8_t retry)
|
||||
{
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_iocbq *elsiocb;
|
||||
struct lpfc_nodelist *ndlp;
|
||||
struct {
|
||||
struct fc_els_rscn rscn;
|
||||
struct fc_els_rscn_page portid;
|
||||
} *event;
|
||||
uint32_t nportid;
|
||||
uint16_t cmdsize = sizeof(*event);
|
||||
|
||||
/* Not supported for private loop */
|
||||
if (phba->fc_topology == LPFC_TOPOLOGY_LOOP &&
|
||||
!(vport->fc_flag & FC_PUBLIC_LOOP))
|
||||
return 1;
|
||||
|
||||
if (vport->fc_flag & FC_PT2PT) {
|
||||
/* find any mapped nport - that would be the other nport */
|
||||
ndlp = lpfc_findnode_mapped(vport);
|
||||
if (!ndlp)
|
||||
return 1;
|
||||
} else {
|
||||
nportid = FC_FID_FCTRL;
|
||||
/* find the fabric controller node */
|
||||
ndlp = lpfc_findnode_did(vport, nportid);
|
||||
if (!ndlp) {
|
||||
/* if one didn't exist, make one */
|
||||
ndlp = lpfc_nlp_init(vport, nportid);
|
||||
if (!ndlp)
|
||||
return 1;
|
||||
lpfc_enqueue_node(vport, ndlp);
|
||||
} else if (!NLP_CHK_NODE_ACT(ndlp)) {
|
||||
ndlp = lpfc_enable_node(vport, ndlp,
|
||||
NLP_STE_UNUSED_NODE);
|
||||
if (!ndlp)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
|
||||
ndlp->nlp_DID, ELS_CMD_RSCN_XMT);
|
||||
|
||||
if (!elsiocb) {
|
||||
/* This will trigger the release of the node just
|
||||
* allocated
|
||||
*/
|
||||
lpfc_nlp_put(ndlp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
event = ((struct lpfc_dmabuf *)elsiocb->context2)->virt;
|
||||
|
||||
event->rscn.rscn_cmd = ELS_RSCN;
|
||||
event->rscn.rscn_page_len = sizeof(struct fc_els_rscn_page);
|
||||
event->rscn.rscn_plen = cpu_to_be16(cmdsize);
|
||||
|
||||
nportid = vport->fc_myDID;
|
||||
/* appears that page flags must be 0 for fabric to broadcast RSCN */
|
||||
event->portid.rscn_page_flags = 0;
|
||||
event->portid.rscn_fid[0] = (nportid & 0x00FF0000) >> 16;
|
||||
event->portid.rscn_fid[1] = (nportid & 0x0000FF00) >> 8;
|
||||
event->portid.rscn_fid[2] = nportid & 0x000000FF;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
"Issue RSCN: did:x%x",
|
||||
ndlp->nlp_DID, 0, 0);
|
||||
|
||||
phba->fc_stat.elsXmitRSCN++;
|
||||
elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
|
||||
if (lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0) ==
|
||||
IOCB_ERROR) {
|
||||
/* The additional lpfc_nlp_put will cause the following
|
||||
* lpfc_els_free_iocb routine to trigger the rlease of
|
||||
* the node.
|
||||
*/
|
||||
lpfc_nlp_put(ndlp);
|
||||
lpfc_els_free_iocb(phba, elsiocb);
|
||||
return 1;
|
||||
}
|
||||
/* This will cause the callback-function lpfc_cmpl_els_cmd to
|
||||
* trigger the release of node.
|
||||
*/
|
||||
if (!(vport->fc_flag & FC_PT2PT))
|
||||
lpfc_nlp_put(ndlp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_issue_els_farpr - Issue a farp to an node on a vport
|
||||
* @vport: pointer to a host virtual N_Port data structure.
|
||||
@@ -6214,6 +6326,8 @@ lpfc_rscn_recovery_check(struct lpfc_vport *vport)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ndlp->nlp_fc4_type & NLP_FC4_NVME)
|
||||
lpfc_nvme_rescan_port(vport, ndlp);
|
||||
|
||||
lpfc_disc_state_machine(vport, ndlp, NULL,
|
||||
NLP_EVT_DEVICE_RECOVERY);
|
||||
@@ -6318,6 +6432,19 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
|
||||
fc_host_post_event(shost, fc_get_event_number(),
|
||||
FCH_EVT_RSCN, lp[i]);
|
||||
|
||||
/* Check if RSCN is coming from a direct-connected remote NPort */
|
||||
if (vport->fc_flag & FC_PT2PT) {
|
||||
/* If so, just ACC it, no other action needed for now */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"2024 pt2pt RSCN %08x Data: x%x x%x\n",
|
||||
*lp, vport->fc_flag, payload_len);
|
||||
lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
|
||||
|
||||
if (ndlp->nlp_fc4_type & NLP_FC4_NVME)
|
||||
lpfc_nvme_rescan_port(vport, ndlp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If we are about to begin discovery, just ACC the RSCN.
|
||||
* Discovery processing will satisfy it.
|
||||
*/
|
||||
|
@@ -5276,6 +5276,41 @@ lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did)
|
||||
return ndlp;
|
||||
}
|
||||
|
||||
struct lpfc_nodelist *
|
||||
lpfc_findnode_mapped(struct lpfc_vport *vport)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_nodelist *ndlp;
|
||||
uint32_t data1;
|
||||
unsigned long iflags;
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, iflags);
|
||||
|
||||
list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
|
||||
if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE ||
|
||||
ndlp->nlp_state == NLP_STE_MAPPED_NODE) {
|
||||
data1 = (((uint32_t)ndlp->nlp_state << 24) |
|
||||
((uint32_t)ndlp->nlp_xri << 16) |
|
||||
((uint32_t)ndlp->nlp_type << 8) |
|
||||
((uint32_t)ndlp->nlp_rpi & 0xff));
|
||||
spin_unlock_irqrestore(shost->host_lock, iflags);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
|
||||
"2025 FIND node DID "
|
||||
"Data: x%p x%x x%x x%x %p\n",
|
||||
ndlp, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, data1,
|
||||
ndlp->active_rrqs_xri_bitmap);
|
||||
return ndlp;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(shost->host_lock, iflags);
|
||||
|
||||
/* FIND node did <did> NOT FOUND */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
|
||||
"2026 FIND mapped did NOT FOUND.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct lpfc_nodelist *
|
||||
lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
{
|
||||
|
@@ -601,6 +601,7 @@ struct fc_vft_header {
|
||||
#define ELS_CMD_RPL 0x57000000
|
||||
#define ELS_CMD_FAN 0x60000000
|
||||
#define ELS_CMD_RSCN 0x61040000
|
||||
#define ELS_CMD_RSCN_XMT 0x61040008
|
||||
#define ELS_CMD_SCR 0x62000000
|
||||
#define ELS_CMD_RNID 0x78000000
|
||||
#define ELS_CMD_LIRR 0x7A000000
|
||||
@@ -642,6 +643,7 @@ struct fc_vft_header {
|
||||
#define ELS_CMD_RPL 0x57
|
||||
#define ELS_CMD_FAN 0x60
|
||||
#define ELS_CMD_RSCN 0x0461
|
||||
#define ELS_CMD_RSCN_XMT 0x08000461
|
||||
#define ELS_CMD_SCR 0x62
|
||||
#define ELS_CMD_RNID 0x78
|
||||
#define ELS_CMD_LIRR 0x7A
|
||||
|
@@ -2402,6 +2402,50 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_nvme_rescan_port - Check to see if we should rescan this remoteport
|
||||
*
|
||||
* If the ndlp represents an NVME Target, that we are logged into,
|
||||
* ping the NVME FC Transport layer to initiate a device rescan
|
||||
* on this remote NPort.
|
||||
*/
|
||||
void
|
||||
lpfc_nvme_rescan_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
#if (IS_ENABLED(CONFIG_NVME_FC))
|
||||
struct lpfc_nvme_rport *rport;
|
||||
struct nvme_fc_remote_port *remoteport;
|
||||
|
||||
rport = ndlp->nrport;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
|
||||
"6170 Rescan NPort DID x%06x type x%x "
|
||||
"state x%x rport %p\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_type, ndlp->nlp_state, rport);
|
||||
if (!rport)
|
||||
goto input_err;
|
||||
remoteport = rport->remoteport;
|
||||
if (!remoteport)
|
||||
goto input_err;
|
||||
|
||||
/* Only rescan if we are an NVME target in the MAPPED state */
|
||||
if (remoteport->port_role & FC_PORT_ROLE_NVME_DISCOVERY &&
|
||||
ndlp->nlp_state == NLP_STE_MAPPED_NODE) {
|
||||
nvme_fc_rescan_remoteport(remoteport);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_NVME_DISC,
|
||||
"6172 NVME rescanned DID x%06x "
|
||||
"port_state x%x\n",
|
||||
ndlp->nlp_DID, remoteport->port_state);
|
||||
}
|
||||
return;
|
||||
input_err:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_NVME_DISC,
|
||||
"6169 State error: lport %p, rport%p FCID x%06x\n",
|
||||
vport->localport, ndlp->rport, ndlp->nlp_DID);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* lpfc_nvme_unregister_port - unbind the DID and port_role from this rport.
|
||||
*
|
||||
* There is no notion of Devloss or rport recovery from the current
|
||||
|
@@ -1139,6 +1139,22 @@ lpfc_nvmet_defer_rcv(struct nvmet_fc_target_port *tgtport,
|
||||
spin_unlock_irqrestore(&ctxp->ctxlock, iflag);
|
||||
}
|
||||
|
||||
static void
|
||||
lpfc_nvmet_discovery_event(struct nvmet_fc_target_port *tgtport)
|
||||
{
|
||||
struct lpfc_nvmet_tgtport *tgtp;
|
||||
struct lpfc_hba *phba;
|
||||
uint32_t rc;
|
||||
|
||||
tgtp = tgtport->private;
|
||||
phba = tgtp->phba;
|
||||
|
||||
rc = lpfc_issue_els_rscn(phba->pport, 0);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_NVME,
|
||||
"6420 NVMET subsystem change: Notification %s\n",
|
||||
(rc) ? "Failed" : "Sent");
|
||||
}
|
||||
|
||||
static struct nvmet_fc_target_template lpfc_tgttemplate = {
|
||||
.targetport_delete = lpfc_nvmet_targetport_delete,
|
||||
.xmt_ls_rsp = lpfc_nvmet_xmt_ls_rsp,
|
||||
@@ -1146,6 +1162,7 @@ static struct nvmet_fc_target_template lpfc_tgttemplate = {
|
||||
.fcp_abort = lpfc_nvmet_xmt_fcp_abort,
|
||||
.fcp_req_release = lpfc_nvmet_xmt_fcp_release,
|
||||
.defer_rcv = lpfc_nvmet_defer_rcv,
|
||||
.discovery_event = lpfc_nvmet_discovery_event,
|
||||
|
||||
.max_hw_queues = 1,
|
||||
.max_sgl_segments = LPFC_NVMET_DEFAULT_SEGS,
|
||||
|
@@ -9398,6 +9398,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
||||
if (if_type >= LPFC_SLI_INTF_IF_TYPE_2) {
|
||||
if (pcmd && (*pcmd == ELS_CMD_FLOGI ||
|
||||
*pcmd == ELS_CMD_SCR ||
|
||||
*pcmd == ELS_CMD_RSCN_XMT ||
|
||||
*pcmd == ELS_CMD_FDISC ||
|
||||
*pcmd == ELS_CMD_LOGO ||
|
||||
*pcmd == ELS_CMD_PLOGI)) {
|
||||
|
Reference in New Issue
Block a user