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>