From owner-p4-projects@FreeBSD.ORG Sat Jun 17 06:29:29 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DE0B716A53F; Sat, 17 Jun 2006 06:29:28 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 73E2B16A482 for ; Sat, 17 Jun 2006 06:29:27 +0000 (UTC) (envelope-from scottl@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 47BFD43D45 for ; Sat, 17 Jun 2006 06:29:27 +0000 (GMT) (envelope-from scottl@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5H6TR9X000437 for ; Sat, 17 Jun 2006 06:29:27 GMT (envelope-from scottl@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5H6TQlo000434 for perforce@freebsd.org; Sat, 17 Jun 2006 06:29:26 GMT (envelope-from scottl@freebsd.org) Date: Sat, 17 Jun 2006 06:29:26 GMT Message-Id: <200606170629.k5H6TQlo000434@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to scottl@freebsd.org using -f From: Scott Long To: Perforce Change Reviews Cc: Subject: PERFORCE change 99404 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 17 Jun 2006 06:29:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=99404 Change 99404 by scottl@scottl-wv1u on 2006/06/17 06:29:15 Provide minimal locking for ses(4). Affected files ... .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.c#6 edit Differences ... ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.c#6 (text+ko) ==== @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -182,7 +183,7 @@ .d_close = sesclose, .d_ioctl = sesioctl, .d_name = "ses", - .d_flags = D_NEEDGIANT, + .d_flags = 0, }; static void @@ -419,14 +420,17 @@ splx(s); return (ENXIO); } + mtx_lock(periph->sim->mtx); if ((error = cam_periph_lock(periph, PRIBIO | PCATCH)) != 0) { splx(s); + mtx_unlock(periph->sim->mtx); return (error); } splx(s); if (cam_periph_acquire(periph) != CAM_REQ_CMP) { cam_periph_unlock(periph); + mtx_unlock(periph->sim->mtx); return (ENXIO); } @@ -459,6 +463,7 @@ cam_periph_release(periph); } cam_periph_unlock(periph); + mtx_unlock(periph->sim->mtx); return (error); } @@ -477,13 +482,17 @@ softc = (struct ses_softc *)periph->softc; - if ((error = cam_periph_lock(periph, PRIBIO)) != 0) + mtx_lock(periph->sim->mtx); + if ((error = cam_periph_lock(periph, PRIBIO)) != 0) { + mtx_unlock(periph->sim->mtx); return (error); + } softc->ses_flags &= ~SES_FLAG_OPEN; cam_periph_unlock(periph); cam_periph_release(periph); + mtx_unlock(periph->sim->mtx); return (0); } @@ -541,14 +550,17 @@ CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering sesioctl\n")); + mtx_lock(periph->sim->mtx); ssc = (struct ses_softc *)periph->softc; /* * Now check to see whether we're initialized or not. */ if ((ssc->ses_flags & SES_FLAG_INITIALIZED) == 0) { + mtx_unlock(periph->sim->mtx); return (ENXIO); } + mtx_unlock(periph->sim->mtx); error = 0; @@ -578,22 +590,34 @@ break; case SESIOC_GETOBJMAP: + /* + * XXX Dropping the lock while copying multiple segments is + * bogus. + */ + mtx_lock(periph->sim->mtx); for (uobj = addr, i = 0; i != ssc->ses_nobjects; i++, uobj++) { obj.obj_id = i; obj.subencid = ssc->ses_objmap[i].subenclosure; obj.object_type = ssc->ses_objmap[i].enctype; + mtx_unlock(periph->sim->mtx); error = copyout(&obj, uobj, sizeof (ses_object)); + mtx_lock(periph->sim->mtx); if (error) { break; } } + mtx_unlock(periph->sim->mtx); break; case SESIOC_GETENCSTAT: + mtx_lock(periph->sim->mtx); error = (*ssc->ses_vec.get_encstat)(ssc, 1); - if (error) + if (error) { + mtx_unlock(periph->sim->mtx); break; + } tmp = ssc->ses_encstat & ~ENCI_SVALID; + mtx_unlock(periph->sim->mtx); error = copyout(&tmp, addr, sizeof (ses_encstat)); ssc->ses_encstat = tmp; break; @@ -602,7 +626,9 @@ error = copyin(addr, &tmp, sizeof (ses_encstat)); if (error) break; + mtx_lock(periph->sim->mtx); error = (*ssc->ses_vec.set_encstat)(ssc, tmp, 1); + mtx_unlock(periph->sim->mtx); break; case SESIOC_GETOBJSTAT: @@ -613,7 +639,9 @@ error = EINVAL; break; } + mtx_lock(periph->sim->mtx); error = (*ssc->ses_vec.get_objstat)(ssc, &objs, 1); + mtx_unlock(periph->sim->mtx); if (error) break; error = copyout(&objs, addr, sizeof (ses_objstat)); @@ -632,7 +660,9 @@ error = EINVAL; break; } + mtx_lock(periph->sim->mtx); error = (*ssc->ses_vec.set_objstat)(ssc, &objs, 1); + mtx_unlock(periph->sim->mtx); /* * Always (for now) invalidate entry. @@ -642,11 +672,15 @@ case SESIOC_INIT: + mtx_lock(periph->sim->mtx); error = (*ssc->ses_vec.init_enc)(ssc); + mtx_unlock(periph->sim->mtx); break; default: + mtx_lock(periph->sim->mtx); error = cam_periph_ioctl(periph, cmd, arg_addr, seserror); + mtx_unlock(periph->sim->mtx); break; } return (error);