From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 21:23:22 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 51AE1106566B; Sat, 27 Aug 2011 21:23:22 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4182C8FC0A; Sat, 27 Aug 2011 21:23:22 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p7RLNMPo021472; Sat, 27 Aug 2011 21:23:22 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7RLNMcg021467; Sat, 27 Aug 2011 21:23:22 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108272123.p7RLNMcg021467@svn.freebsd.org> From: Alexander Motin Date: Sat, 27 Aug 2011 21:23:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r225219 - projects/zfsd/head/sys/cam/scsi X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 27 Aug 2011 21:23:22 -0000 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;