Print this page
9702 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>
*** 16,34 ****
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* iSCSI logical unit interfaces
*/
#include "iscsi.h"
- #include <sys/fs/dv_node.h> /* devfs_clean */
#include <sys/bootprops.h>
#include <sys/sysevent/eventdefs.h>
#include <sys/sysevent/dev.h>
/* tpgt bytes in string form */
--- 16,41 ----
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
+
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
+ */
+
+ /*
+ * Copyright 2018 Nexenta Systems, Inc.
+ */
+
+ /*
* iSCSI logical unit interfaces
*/
#include "iscsi.h"
#include <sys/bootprops.h>
#include <sys/sysevent/eventdefs.h>
#include <sys/sysevent/dev.h>
/* tpgt bytes in string form */
*** 639,718 ****
iscsi_status_t
iscsi_lun_offline(iscsi_hba_t *ihp, iscsi_lun_t *ilp, boolean_t lun_free)
{
iscsi_status_t status = ISCSI_STATUS_SUCCESS;
int circ = 0;
! dev_info_t *cdip, *pdip;
! char *devname = NULL;
char *pathname = NULL;
- int rval;
boolean_t offline = B_FALSE;
nvlist_t *attr_list = NULL;
ASSERT(ilp != NULL);
ASSERT((ilp->lun_pip != NULL) || (ilp->lun_dip != NULL));
! /*
! * Since we carry the logical units parent
! * lock across the offline call it will not
! * issue devfs_clean() and may fail with a
! * devi_ref count > 0.
! */
! if (ilp->lun_pip == NULL) {
cdip = ilp->lun_dip;
! } else {
cdip = mdi_pi_get_client(ilp->lun_pip);
- }
- if ((cdip != NULL) &&
- (lun_free == B_TRUE) &&
- (ilp->lun_state & ISCSI_LUN_STATE_ONLINE)) {
- /*
- * Make sure node is attached otherwise
- * it won't have related cache nodes to
- * clean up. i_ddi_devi_attached is
- * similiar to i_ddi_node_state(cdip) >=
- * DS_ATTACHED. We should clean up only
- * when lun_free is set.
- */
- if (i_ddi_devi_attached(cdip)) {
-
- /* Get parent dip */
- pdip = ddi_get_parent(cdip);
-
- /* Get full devname */
- devname = kmem_alloc(MAXNAMELEN + 1, KM_SLEEP);
- ndi_devi_enter(pdip, &circ);
- (void) ddi_deviname(cdip, devname);
- /* Release lock before devfs_clean() */
- ndi_devi_exit(pdip, circ);
-
- /* Clean cache */
- (void) devfs_clean(pdip, devname + 1, DV_CLEAN_FORCE);
- kmem_free(devname, MAXNAMELEN + 1);
- }
- }
-
if (cdip != NULL && ilp->lun_type == DTYPE_DIRECT) {
pathname = kmem_zalloc(MAXNAMELEN + 1, KM_SLEEP);
(void) ddi_pathname(cdip, pathname);
}
/* Attempt to offline the logical units */
if (ilp->lun_pip != NULL) {
-
/* virt/mdi */
ndi_devi_enter(scsi_vhci_dip, &circ);
! if ((lun_free == B_TRUE) &&
! (ilp->lun_state & ISCSI_LUN_STATE_ONLINE)) {
! rval = mdi_pi_offline(ilp->lun_pip,
! NDI_DEVI_REMOVE);
! } else {
! rval = mdi_pi_offline(ilp->lun_pip, 0);
! }
!
! if (rval == MDI_SUCCESS) {
ilp->lun_state &= ISCSI_LUN_STATE_CLEAR;
ilp->lun_state |= ISCSI_LUN_STATE_OFFLINE;
if (lun_free == B_TRUE) {
(void) mdi_prop_remove(ilp->lun_pip, NULL);
(void) mdi_pi_free(ilp->lun_pip, 0);
--- 646,678 ----
iscsi_status_t
iscsi_lun_offline(iscsi_hba_t *ihp, iscsi_lun_t *ilp, boolean_t lun_free)
{
iscsi_status_t status = ISCSI_STATUS_SUCCESS;
int circ = 0;
! dev_info_t *cdip;
char *pathname = NULL;
boolean_t offline = B_FALSE;
nvlist_t *attr_list = NULL;
ASSERT(ilp != NULL);
ASSERT((ilp->lun_pip != NULL) || (ilp->lun_dip != NULL));
! if (ilp->lun_pip == NULL)
cdip = ilp->lun_dip;
! else
cdip = mdi_pi_get_client(ilp->lun_pip);
if (cdip != NULL && ilp->lun_type == DTYPE_DIRECT) {
pathname = kmem_zalloc(MAXNAMELEN + 1, KM_SLEEP);
(void) ddi_pathname(cdip, pathname);
}
/* Attempt to offline the logical units */
if (ilp->lun_pip != NULL) {
/* virt/mdi */
ndi_devi_enter(scsi_vhci_dip, &circ);
! if (mdi_pi_offline(ilp->lun_pip, 0) == MDI_SUCCESS) {
ilp->lun_state &= ISCSI_LUN_STATE_CLEAR;
ilp->lun_state |= ISCSI_LUN_STATE_OFFLINE;
if (lun_free == B_TRUE) {
(void) mdi_prop_remove(ilp->lun_pip, NULL);
(void) mdi_pi_free(ilp->lun_pip, 0);
*** 726,747 ****
}
}
ndi_devi_exit(scsi_vhci_dip, circ);
} else {
-
/* phys/ndi */
ndi_devi_enter(ihp->hba_dip, &circ);
! if ((lun_free == B_TRUE) &&
! (ilp->lun_state & ISCSI_LUN_STATE_ONLINE)) {
! rval = ndi_devi_offline(
! ilp->lun_dip, NDI_DEVI_REMOVE);
! } else {
! rval = ndi_devi_offline(
! ilp->lun_dip, 0);
! }
! if (rval != NDI_SUCCESS) {
status = ISCSI_STATUS_BUSY;
if (lun_free == B_FALSE) {
ilp->lun_state |= ISCSI_LUN_STATE_INVALID;
offline = B_TRUE;
}
--- 686,703 ----
}
}
ndi_devi_exit(scsi_vhci_dip, circ);
} else {
/* phys/ndi */
+ int flags = NDI_DEVFS_CLEAN;
+
ndi_devi_enter(ihp->hba_dip, &circ);
! if (lun_free == B_TRUE &&
! (ilp->lun_state & ISCSI_LUN_STATE_ONLINE))
! flags |= NDI_DEVI_REMOVE;
! if (ndi_devi_offline(ilp->lun_dip, flags) != NDI_SUCCESS) {
status = ISCSI_STATUS_BUSY;
if (lun_free == B_FALSE) {
ilp->lun_state |= ISCSI_LUN_STATE_INVALID;
offline = B_TRUE;
}