Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Mar 2023 19:45:02 GMT
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 57dc6f5e200b - main - sesutil: fix "fault all" with zoned jbods
Message-ID:  <202303271945.32RJj2YV083614@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by asomers:

URL: https://cgit.FreeBSD.org/src/commit/?id=57dc6f5e200b10d34ccb97ccc18d06b3f0b9b933

commit 57dc6f5e200b10d34ccb97ccc18d06b3f0b9b933
Author:     Alan Somers <asomers@FreeBSD.org>
AuthorDate: 2023-03-10 17:47:08 +0000
Commit:     Alan Somers <asomers@FreeBSD.org>
CommitDate: 2023-03-27 19:43:35 +0000

    sesutil: fix "fault all" with zoned jbods
    
    Some SAS JBODs support zoning.  This feature allows individual SAS
    targets to be accessible by only some initiator ports.  One application
    would be connecting two servers to the same JBOD, but they wouldn't be
    able to see each other's disks.
    
    A zoned JBOD should also prohibit initiators from accessing SES elements
    corresponding to inaccessible SAS targets.  It reports that by setting
    the element's status code to 0x8 (No Access Allowed).
    
    The bug is that when doing "sesutil (fault|locate) all ...", sesutil
    will attempt a ENCIOC_SETELMSTAT ioctl for every single element, even
    the inaccessible ones.  The enclosure will reject the command, the
    kernel will return EINVAL, and sesutil will exit.
    
    The solution is to check the element's status, and skip trying to set it
    if the status is 0x8.  But if the user actually supplied a ses ID, then
    assume that he knows what he's doing and try to set it anyway.
    
    PR:             270093
    MFC after:      1 week
    Sponsored by:   Axcient
    Reviewed by:    mav, trasz
    Differential Revision: https://reviews.freebsd.org/D39017
---
 usr.sbin/sesutil/sesutil.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/usr.sbin/sesutil/sesutil.c b/usr.sbin/sesutil/sesutil.c
index 22bd0127a484..9c546f8ba210 100644
--- a/usr.sbin/sesutil/sesutil.c
+++ b/usr.sbin/sesutil/sesutil.c
@@ -281,6 +281,16 @@ sesled(int argc, char **argv, bool setfault)
 			char devnames[devnames_size];
 
 			if (all) {
+				encioc_elm_status_t es;
+				memset(&es, 0, sizeof(es));
+				es.elm_idx = objp[j].elm_idx;
+				if (ioctl(fd, ENCIOC_GETELMSTAT, &es) < 0) {
+					close(fd);
+					xo_err(EXIT_FAILURE,
+						"ENCIOC_GETELMSTAT");
+				}
+				if ((es.cstat[0] & 0xf) == SES_OBJSTAT_NOACCESS)
+					continue;
 				do_led(fd, objp[j].elm_idx, objp[j].elm_type,
 				    onoff, setfault);
 				continue;



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