From owner-svn-src-head@freebsd.org Wed Dec 21 15:17:48 2016 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B57D9C8A9FC; Wed, 21 Dec 2016 15:17:48 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 82C5514AB; Wed, 21 Dec 2016 15:17:48 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id uBLFHlDn012204; Wed, 21 Dec 2016 15:17:47 GMT (envelope-from mav@FreeBSD.org) Received: (from mav@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id uBLFHl02012201; Wed, 21 Dec 2016 15:17:47 GMT (envelope-from mav@FreeBSD.org) Message-Id: <201612211517.uBLFHl02012201@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mav set sender to mav@FreeBSD.org using -f From: Alexander Motin Date: Wed, 21 Dec 2016 15:17:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r310366 - head/sys/cam/ctl X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Dec 2016 15:17:48 -0000 Author: mav Date: Wed Dec 21 15:17:47 2016 New Revision: 310366 URL: https://svnweb.freebsd.org/changeset/base/310366 Log: Add support for SITUA bit in Logical Block Provisioning mode page. VMware tries to enable this bit to avoid multiple threshold notifications in case of multiple initiators connected to the same LUN. Unfortunately their code sends MODE SELECT(6) request with parameter length hardcoded for the page without any thresholds. Since we have four threshold and our page is bigger, this attempt fails, that is correct in my understanding. So all we can do about this now is to report proper error code and hope VMware fix their code one day. MFC after: 2 weeks Modified: head/sys/cam/ctl/ctl.c head/sys/cam/ctl/ctl_error.c head/sys/cam/ctl/ctl_private.h Modified: head/sys/cam/ctl/ctl.c ============================================================================== --- head/sys/cam/ctl/ctl.c Wed Dec 21 14:06:44 2016 (r310365) +++ head/sys/cam/ctl/ctl.c Wed Dec 21 15:17:47 2016 (r310366) @@ -332,7 +332,7 @@ const static struct ctl_logical_block_pr /*page_code*/SMS_INFO_EXCEPTIONS_PAGE | SMPH_SPF, /*subpage_code*/0x02, /*page_length*/{CTL_LBPM_LEN >> 8, CTL_LBPM_LEN}, - /*flags*/0, + /*flags*/SLBPP_SITUA, /*reserved*/{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*descr*/{}}, {{/*flags*/0, @@ -6075,11 +6075,7 @@ do_next_page: * the mode page header, or if they didn't specify enough data in * the CDB to avoid truncating this page, kick out the request. */ - if ((page_len != (page_index->page_len - page_len_offset - - page_len_size)) - || (*len_left < page_index->page_len)) { - - + if (page_len != page_index->page_len - page_len_offset - page_len_size) { ctl_set_invalid_field(ctsio, /*sks_valid*/ 1, /*command*/ 0, @@ -6090,6 +6086,12 @@ do_next_page: ctl_done((union ctl_io *)ctsio); return (CTL_RETVAL_COMPLETE); } + if (*len_left < page_index->page_len) { + free(ctsio->kern_data_ptr, M_CTL); + ctl_set_param_len_error(ctsio); + ctl_done((union ctl_io *)ctsio); + return (CTL_RETVAL_COMPLETE); + } /* * Run through the mode page, checking to make sure that the bits @@ -9326,13 +9328,6 @@ ctl_request_sense(struct ctl_scsiio *cts ua_type = ctl_build_ua(lun, initidx, sense_ptr, sense_format); if (ua_type != CTL_UA_NONE) have_error = 1; - if (ua_type == CTL_UA_LUN_CHANGE) { - mtx_unlock(&lun->lun_lock); - mtx_lock(&softc->ctl_lock); - ctl_clr_ua_allluns(softc, initidx, ua_type); - mtx_unlock(&softc->ctl_lock); - mtx_lock(&lun->lun_lock); - } } if (have_error == 0) { /* Modified: head/sys/cam/ctl/ctl_error.c ============================================================================== --- head/sys/cam/ctl/ctl_error.c Wed Dec 21 14:06:44 2016 (r310365) +++ head/sys/cam/ctl/ctl_error.c Wed Dec 21 15:17:47 2016 (r310366) @@ -515,6 +515,7 @@ ctl_build_ua(struct ctl_lun *lun, uint32 uint32_t p, i; mtx_assert(&lun->lun_lock, MA_OWNED); + mtx_assert(&lun->ctl_softc->ctl_lock, MA_NOTOWNED); p = initidx / CTL_MAX_INIT_PER_PORT; if ((ua = lun->pending_ua[p]) == NULL) { mtx_unlock(&lun->lun_lock); @@ -547,6 +548,17 @@ ctl_build_ua(struct ctl_lun *lun, uint32 /* We're reporting this UA, so clear it */ ua[i] &= ~ua_to_clear; + if (ua_to_build == CTL_UA_LUN_CHANGE) { + mtx_unlock(&lun->lun_lock); + mtx_lock(&lun->ctl_softc->ctl_lock); + ctl_clr_ua_allluns(lun->ctl_softc, initidx, ua_to_build); + mtx_unlock(&lun->ctl_softc->ctl_lock); + mtx_lock(&lun->lun_lock); + } else if (ua_to_build == CTL_UA_THIN_PROV_THRES && + (lun->MODE_LBP.main.flags & SLBPP_SITUA) != 0) { + ctl_clr_ua_all(lun, -1, ua_to_build); + } + return (ua_to_build); } Modified: head/sys/cam/ctl/ctl_private.h ============================================================================== --- head/sys/cam/ctl/ctl_private.h Wed Dec 21 14:06:44 2016 (r310365) +++ head/sys/cam/ctl/ctl_private.h Wed Dec 21 15:17:47 2016 (r310366) @@ -290,7 +290,7 @@ static const struct ctl_page_index page_ CTL_PAGE_FLAG_ALL, NULL, ctl_ie_page_handler}, {SMS_INFO_EXCEPTIONS_PAGE | SMPH_SPF, 0x02, sizeof(struct ctl_logical_block_provisioning_page), NULL, - CTL_PAGE_FLAG_DIRECT, NULL, NULL}, + CTL_PAGE_FLAG_DIRECT, NULL, ctl_default_page_handler}, {SMS_CDDVD_CAPS_PAGE, 0, sizeof(struct scsi_cddvd_capabilities_page), NULL, CTL_PAGE_FLAG_CDROM, NULL, NULL},