svn commit: r225219 - projects/zfsd/head/sys/cam/scsi
Alexander Motin
mav at FreeBSD.org
Sat Aug 27 21:23:22 UTC 2011
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;
More information about the svn-src-projects
mailing list