Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 27 Aug 2011 21:23:22 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r225219 - projects/zfsd/head/sys/cam/scsi
Message-ID:  <201108272123.p7RLNMcg021467@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sat Aug 27 21:23:21 2011
New Revision: 225219
URL: http://svn.freebsd.org/changeset/base/225219

Log:
  Tune destruction sequence, including aborting queued control requests.
  Cover for some edge cases is still ongoing.

Modified:
  projects/zfsd/head/sys/cam/scsi/scsi_enc.c
  projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h
  projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c
  projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c

Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c
==============================================================================
--- projects/zfsd/head/sys/cam/scsi/scsi_enc.c	Sat Aug 27 15:41:48 2011	(r225218)
+++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c	Sat Aug 27 21:23:21 2011	(r225219)
@@ -120,9 +120,11 @@ enc_oninvalidate(struct cam_periph *peri
 
 	enc = periph->softc;
 
+	enc->enc_flags |= ENC_FLAG_INVALID;
+
 	/* If the sub-driver has an invalidate routine, call it */
 	if (enc->enc_vec.softc_invalidate != NULL)
-		enc->enc_vec.softc_invalidate(periph);
+		enc->enc_vec.softc_invalidate(enc);
 
 	/*
 	 * Unregister any async callbacks.
@@ -146,8 +148,6 @@ enc_oninvalidate(struct cam_periph *peri
 	}
 	callout_drain(&enc->status_updater);
 
-	enc->enc_flags |= ENC_FLAG_INVALID;
-
 	xpt_print(periph->path, "lost device\n");
 }
 
@@ -165,7 +165,7 @@ enc_dtor(struct cam_periph *periph)
 
 	/* If the sub-driver has a cleanup routine, call it */
 	if (enc->enc_vec.softc_cleanup != NULL)
-		enc->enc_vec.softc_cleanup(periph);
+		enc->enc_vec.softc_cleanup(enc);
 
 	if (enc->enc_boot_hold_ch.ich_func != NULL) {
 		config_intrhook_disestablish(&enc->enc_boot_hold_ch);
@@ -916,11 +916,11 @@ enc_ctor(struct cam_periph *periph, void
 	case ENC_SES_SCSI2:
 	case ENC_SES_PASSTHROUGH:
 	case ENC_SEMB_SES:
-		err = ses_softc_init(enc, 1);
+		err = ses_softc_init(enc);
 		break;
 	case ENC_SAFT:
 	case ENC_SEMB_SAFT:
-		err = safte_softc_init(enc, 1);
+		err = safte_softc_init(enc);
 		break;
 	case ENC_SEN:
 	case ENC_NONE:

Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h
==============================================================================
--- projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h	Sat Aug 27 15:41:48 2011	(r225218)
+++ projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h	Sat Aug 27 21:23:21 2011	(r225219)
@@ -84,9 +84,9 @@ struct enc_fsm_state {
 	fsm_error_handler_t *error;
 };
 
-typedef int (enc_softc_init_t)(enc_softc_t *, int);
-typedef void (enc_softc_invalidate_t)(struct cam_periph *); 
-typedef void (enc_softc_cleanup_t)(struct cam_periph *);
+typedef int (enc_softc_init_t)(enc_softc_t *);
+typedef void (enc_softc_invalidate_t)(enc_softc_t *);
+typedef void (enc_softc_cleanup_t)(enc_softc_t *);
 typedef int (enc_init_enc_t)(enc_softc_t *); 
 typedef int (enc_get_enc_status_t)(enc_softc_t *, int);
 typedef int (enc_set_enc_status_t)(enc_softc_t *, encioc_enc_status_t, int);

Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c
==============================================================================
--- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c	Sat Aug 27 15:41:48 2011	(r225218)
+++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c	Sat Aug 27 21:23:21 2011	(r225219)
@@ -162,6 +162,18 @@ enum {
 	SES_SETSTATUS_ENC_IDX = -1
 };
 
+static void
+safte_terminate_control_requests(safte_control_reqlist_t *reqlist, int result)
+{
+	safte_control_request_t *req;
+
+	while ((req = TAILQ_FIRST(reqlist)) != NULL) {
+		TAILQ_REMOVE(reqlist, req, links);
+		req->result = result;
+		wakeup(req);
+	}
+}
+
 struct scfg {
 	/*
 	 * Cached Configuration
@@ -977,11 +989,18 @@ safte_process_control_request(enc_softc_
 }
 
 static void
-safte_softc_cleanup(struct cam_periph *periph)
+safte_softc_invalidate(enc_softc_t *enc)
+{
+	struct scfg *cfg;
+
+	cfg = enc->enc_private;
+	safte_terminate_control_requests(&cfg->requests, ENXIO);
+}
+
+static void
+safte_softc_cleanup(enc_softc_t *enc)
 {
-	enc_softc_t *enc;
 
-	enc = periph->softc;
 	ENC_FREE_AND_NULL(enc->enc_cache.elm_map);
 	ENC_FREE_AND_NULL(enc->enc_private);
 	enc->enc_cache.nelms = 0;
@@ -1084,6 +1103,7 @@ safte_poll_status(enc_softc_t *enc)
 
 static struct enc_vec safte_enc_vec =
 {
+	.softc_invalidate	= safte_softc_invalidate,
 	.softc_cleanup	= safte_softc_cleanup,
 	.init_enc	= safte_init_enc,
 	.get_enc_status	= safte_get_enc_status,
@@ -1094,15 +1114,10 @@ static struct enc_vec safte_enc_vec =
 };
 
 int
-safte_softc_init(enc_softc_t *enc, int doinit)
+safte_softc_init(enc_softc_t *enc)
 {
 	struct scfg *cfg;
 
-	if (doinit == 0) {
-		safte_softc_cleanup(enc->periph);
-		return (0);
-	}
-
 	enc->enc_vec = safte_enc_vec;
 	enc->enc_fsm_states = enc_fsm_states;
 

Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c
==============================================================================
--- projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c	Sat Aug 27 15:41:48 2011	(r225218)
+++ projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c	Sat Aug 27 21:23:21 2011	(r225219)
@@ -1477,7 +1477,7 @@ ses_process_config(enc_softc_t *enc, str
 
 out:
 	if (err)
-		ses_softc_cleanup(enc->periph);
+		ses_softc_cleanup(enc);
 	else {
 		enc_update_request(enc, SES_UPDATE_GETSTATUS);
 		enc_update_request(enc, SES_UPDATE_GETELMDESCS);
@@ -2538,18 +2538,18 @@ out:
 }
 
 static void
-ses_softc_invalidate(struct cam_periph *periph)
+ses_softc_invalidate(enc_softc_t *enc)
 {
+	ses_softc_t *ses;
+
+	ses = enc->enc_private;
+	ses_terminate_control_requests(&ses->ses_requests, ENXIO);
 }
 
 static void
-ses_softc_cleanup(struct cam_periph *periph)
+ses_softc_cleanup(enc_softc_t *enc)
 {
-	enc_softc_t *enc;
 
-	CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE,
-	    ("entering ses_softc_cleanup(%p)\n", periph));
-	enc = periph->softc;
 	ses_cache_free(enc, &enc->enc_cache);
 	ses_cache_free(enc, &enc->enc_daemon_cache);
 	ENC_FREE_AND_NULL(enc->enc_private);
@@ -2767,16 +2767,12 @@ static struct enc_vec ses_enc_vec =
  * \return		0 on success, errno otherwise.
  */
 int
-ses_softc_init(enc_softc_t *enc, int doinit)
+ses_softc_init(enc_softc_t *enc)
 {
 	ses_softc_t *ses_softc;
 
 	CAM_DEBUG(enc->periph->path, CAM_DEBUG_SUBTRACE,
 	    ("entering enc_softc_init(%p)\n", enc));
-	if (doinit == 0) {
-		ses_softc_cleanup(enc->periph);
-		return (0);
-	}
 
 	enc->enc_vec = ses_enc_vec;
 	enc->enc_fsm_states = enc_fsm_states;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108272123.p7RLNMcg021467>