Print this page
NEX-18203 fcp should call mdi_pi_offline() without NDI_DEVI_REMOVE
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Dan Fields <dan.fields@nexenta.com>
NEX-17944 HBA drivers don't need the redundant devfs_clean step
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
NEX-3153 fcp unable to offline paths to drives behind ATTO Fibrebridge 6500
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Dan Fields <dan.fields@nexenta.com>
*** 16,28 ****
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
! *
* Fibre Channel SCSI ULP Mapping driver
*/
#include <sys/scsi/scsi.h>
#include <sys/types.h>
--- 16,35 ----
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
+
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
! */
!
! /*
! * Copyright 2018 Nexenta Systems, Inc.
! */
!
! /*
* Fibre Channel SCSI ULP Mapping driver
*/
#include <sys/scsi/scsi.h>
#include <sys/types.h>
*** 38,48 ****
#include <sys/time.h>
#include <sys/utsname.h>
#include <sys/scsi/impl/scsi_reset_notify.h>
#include <sys/ndi_impldefs.h>
#include <sys/byteorder.h>
- #include <sys/fs/dv_node.h>
#include <sys/ctype.h>
#include <sys/sunmdi.h>
#include <sys/fibre-channel/fc.h>
#include <sys/fibre-channel/impl/fc_ulpif.h>
--- 45,54 ----
*** 3864,3873 ****
--- 3870,3881 ----
tcount = plun->lun_tgt->tgt_change_cnt;
mutex_exit(&pptr->port_mutex);
if (cmd == DEVCTL_DEVICE_REMOVE) {
flag = NDI_DEVI_REMOVE;
+ if (is_mpxio)
+ flag |= NDI_USER_REQ;
}
if (is_mpxio) {
mdi_devi_exit(pptr->port_dip, circ);
} else {
*** 8149,8160 ****
int rval = NDI_FAILURE;
int circ;
child_info_t *ccip;
struct fcp_port *pptr = plun->lun_tgt->tgt_port;
int is_mpxio = pptr->port_mpxio;
- dev_info_t *cdip, *pdip;
- char *devname;
if ((old_mpxio != 0) && (plun->lun_mpxio != old_mpxio)) {
/*
* When this event gets serviced, lun_cip and lun_mpxio
* has changed, so it should be invalidated now.
--- 8157,8166 ----
*** 8190,8238 ****
rval = NDI_SUCCESS;
}
return (rval);
}
- /*
- * Explicit devfs_clean() due to ndi_devi_offline() not
- * executing devfs_clean() if parent lock is held.
- */
- ASSERT(!servicing_interrupt());
- if (online == FCP_OFFLINE) {
- if (plun->lun_mpxio == 0) {
- if (plun->lun_cip == cip) {
- cdip = DIP(plun->lun_cip);
- } else {
- cdip = DIP(cip);
- }
- } else if ((plun->lun_cip == cip) && plun->lun_cip) {
- cdip = mdi_pi_get_client(PIP(plun->lun_cip));
- } else if ((plun->lun_cip != cip) && cip) {
- /*
- * This means a DTYPE/GUID change, we shall get the
- * dip of the old cip instead of the current lun_cip.
- */
- cdip = mdi_pi_get_client(PIP(cip));
- }
- if (cdip) {
- if (i_ddi_devi_attached(cdip)) {
- pdip = ddi_get_parent(cdip);
- devname = kmem_alloc(MAXNAMELEN + 1, KM_SLEEP);
- ndi_devi_enter(pdip, &circ);
- (void) ddi_deviname(cdip, devname);
- /*
- * Release parent lock before calling
- * devfs_clean().
- */
- ndi_devi_exit(pdip, circ);
- (void) devfs_clean(pdip, devname + 1,
- DV_CLEAN_FORCE);
- kmem_free(devname, MAXNAMELEN + 1);
- }
- }
- }
-
if (fc_ulp_busy_port(pptr->port_fp_handle) != 0) {
return (NDI_FAILURE);
}
if (is_mpxio) {
--- 8196,8205 ----
*** 13068,13086 ****
fcp_wwn_to_ascii(plun->lun_tgt->tgt_port_wwn.raw_wwn, buf);
(void) snprintf(uaddr, MAXNAMELEN, "w%s,%x", buf, plun->lun_num);
! if (plun->lun_old_guid) {
! if (mdi_pi_find(pdip, plun->lun_old_guid, uaddr) == pip) {
rval = FC_SUCCESS;
}
! } else {
! if (mdi_pi_find(pdip, plun->lun_guid, uaddr) == pip) {
! rval = FC_SUCCESS;
! }
! }
return (rval);
}
static mdi_pathinfo_t *
fcp_find_existing_pip(struct fcp_lun *plun, dev_info_t *pdip)
--- 13035,13048 ----
fcp_wwn_to_ascii(plun->lun_tgt->tgt_port_wwn.raw_wwn, buf);
(void) snprintf(uaddr, MAXNAMELEN, "w%s,%x", buf, plun->lun_num);
! if (mdi_pi_find(pdip, NULL, uaddr) == pip) {
rval = FC_SUCCESS;
}
!
return (rval);
}
static mdi_pathinfo_t *
fcp_find_existing_pip(struct fcp_lun *plun, dev_info_t *pdip)
*** 13310,13320 ****
if (lun_mpxio == 0) {
cdip = DIP(cip);
mutex_exit(&plun->lun_mutex);
mutex_exit(&pptr->port_mutex);
! rval = ndi_devi_offline(DIP(cip), flags);
if (rval != NDI_SUCCESS) {
FCP_TRACE(fcp_logq, pptr->port_instbuf,
fcp_trace, FCP_BUF_LEVEL_3, 0,
"fcp_offline_child: ndi_devi_offline failed "
"rval=%x cip=%p", rval, cip);
--- 13272,13282 ----
if (lun_mpxio == 0) {
cdip = DIP(cip);
mutex_exit(&plun->lun_mutex);
mutex_exit(&pptr->port_mutex);
! rval = ndi_devi_offline(DIP(cip), NDI_DEVFS_CLEAN | flags);
if (rval != NDI_SUCCESS) {
FCP_TRACE(fcp_logq, pptr->port_instbuf,
fcp_trace, FCP_BUF_LEVEL_3, 0,
"fcp_offline_child: ndi_devi_offline failed "
"rval=%x cip=%p", rval, cip);
*** 13329,13339 ****
* during mdi_pi_offline
*/
mdi_hold_path(PIP(cip));
mdi_devi_exit_phci(pptr->port_dip, *circ);
! rval = mdi_pi_offline(PIP(cip), flags);
mdi_devi_enter_phci(pptr->port_dip, circ);
mdi_rele_path(PIP(cip));
rval = (rval == MDI_SUCCESS) ? NDI_SUCCESS : NDI_FAILURE;
--- 13291,13301 ----
* during mdi_pi_offline
*/
mdi_hold_path(PIP(cip));
mdi_devi_exit_phci(pptr->port_dip, *circ);
! rval = mdi_pi_offline(PIP(cip), flags & ~NDI_DEVI_REMOVE);
mdi_devi_enter_phci(pptr->port_dip, circ);
mdi_rele_path(PIP(cip));
rval = (rval == MDI_SUCCESS) ? NDI_SUCCESS : NDI_FAILURE;
*** 13429,13456 ****
mutex_exit(&plun->lun_mutex);
mutex_exit(&plun->lun_tgt->tgt_mutex);
mutex_exit(&plun->lun_tgt->tgt_port->port_mutex);
! mdi_devi_enter(
! plun->lun_tgt->tgt_port->port_dip, &circ);
/*
* Exit phci to avoid deadlock with power management
* code during mdi_pi_offline
*/
mdi_hold_path(PIP(cip));
! mdi_devi_exit_phci(
! plun->lun_tgt->tgt_port->port_dip, circ);
! (void) mdi_pi_offline(PIP(cip),
! NDI_DEVI_REMOVE);
! mdi_devi_enter_phci(
! plun->lun_tgt->tgt_port->port_dip, &circ);
mdi_rele_path(PIP(cip));
! mdi_devi_exit(
! plun->lun_tgt->tgt_port->port_dip, circ);
FCP_TRACE(fcp_logq,
plun->lun_tgt->tgt_port->port_instbuf,
fcp_trace, FCP_BUF_LEVEL_3, 0,
"lun=%p pip freed %p", plun, cip);
--- 13391,13416 ----
mutex_exit(&plun->lun_mutex);
mutex_exit(&plun->lun_tgt->tgt_mutex);
mutex_exit(&plun->lun_tgt->tgt_port->port_mutex);
! mdi_devi_enter(plun->lun_tgt->tgt_port->port_dip,
! &circ);
/*
* Exit phci to avoid deadlock with power management
* code during mdi_pi_offline
*/
mdi_hold_path(PIP(cip));
! mdi_devi_exit_phci(plun->lun_tgt->tgt_port->port_dip,
! circ);
! (void) mdi_pi_offline(PIP(cip), 0);
! mdi_devi_enter_phci(plun->lun_tgt->tgt_port->port_dip,
! &circ);
mdi_rele_path(PIP(cip));
! mdi_devi_exit(plun->lun_tgt->tgt_port->port_dip, circ);
FCP_TRACE(fcp_logq,
plun->lun_tgt->tgt_port->port_instbuf,
fcp_trace, FCP_BUF_LEVEL_3, 0,
"lun=%p pip freed %p", plun, cip);