PERFORCE change 98524 for review
Matt Jacob
mjacob at FreeBSD.org
Mon Jun 5 06:11:18 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=98524
Change 98524 by mjacob at mjacob_feral on 2006/06/05 06:08:59
Unsnafu an incomplete integration.
Affected files ...
.. //depot/projects/mjscratch/sys/cam/cam_xpt.c#2 integrate
.. //depot/projects/mjscratch/sys/cam/scsi/scsi_target.c#2 integrate
Differences ...
==== //depot/projects/mjscratch/sys/cam/cam_xpt.c#2 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.158 2006/01/20 19:21:38 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.159 2006/05/30 22:44:00 mjacob Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -3502,8 +3502,7 @@
if ((crs->release_flags & RELSIM_ADJUST_OPENINGS) != 0) {
- if ((dev->inq_data.flags & SID_CmdQue) != 0) {
-
+ if (INQ_DATA_TQ_ENABLED(&dev->inq_data)) {
/* Don't ever go below one opening */
if (crs->openings > 0) {
xpt_dev_ccbq_resize(crs->ccb_h.path,
@@ -5991,7 +5990,7 @@
#ifdef CAM_NEW_TRAN_CODE
xpt_devise_transport(path);
#endif /* CAM_NEW_TRAN_CODE */
- if ((inq_buf->flags & SID_CmdQue) != 0)
+ if (INQ_DATA_TQ_ENABLED(inq_buf))
softc->action = PROBE_MODE_SENSE;
else
softc->action = PROBE_SERIAL_NUM;
@@ -6416,7 +6415,7 @@
/* SCSI specific sanity checking */
if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0
- || (inq_data->flags & SID_CmdQue) == 0
+ || (INQ_DATA_TQ_ENABLED(inq_data)) == 0
|| (device->queue_flags & SCP_QUEUE_DQUE) != 0
|| (device->quirk->mintags == 0)) {
/*
@@ -6712,7 +6711,7 @@
}
if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0
- || (inq_data->flags & SID_CmdQue) == 0
+ || (INQ_DATA_TQ_ENABLED(inq_data)) == 0
|| (device->queue_flags & SCP_QUEUE_DQUE) != 0
|| (device->quirk->mintags == 0)) {
/*
==== //depot/projects/mjscratch/sys/cam/scsi/scsi_target.c#2 (text+ko) ====
@@ -28,7 +28,8 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_target.c,v 1.68 2005/08/08 19:55:30 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_target.c,v 1.70 2006/05/24 15:26:07 mjacob Exp $");
+
#include <sys/param.h>
#include <sys/systm.h>
@@ -40,6 +41,7 @@
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/devicestat.h>
+#include <sys/proc.h>
#include <cam/cam.h>
#include <cam/cam_ccb.h>
@@ -89,7 +91,6 @@
targ_state state;
struct selinfo read_select;
struct devstat device_stats;
- struct mtx mtx;
};
static d_open_t targopen;
@@ -157,10 +158,6 @@
};
PERIPHDRIVER_DECLARE(targ, targdriver);
-static struct mtx targ_mtx;
-#define TARG_LOCK(softc) mtx_lock(&(softc)->mtx)
-#define TARG_UNLOCK(softc) mtx_unlock(&(softc)->mtx)
-
static MALLOC_DEFINE(M_TARG, "TARG", "TARG data");
/* Create softc and initialize it. Only one proc can open each targ device. */
@@ -169,15 +166,12 @@
{
struct targ_softc *softc;
- mtx_lock(&targ_mtx);
if (dev->si_drv1 != 0) {
- mtx_unlock(&targ_mtx);
return (EBUSY);
}
/* Mark device busy before any potentially blocking operations */
dev->si_drv1 = (void *)~0;
- mtx_unlock(&targ_mtx);
/* Create the targ device, allocate its softc, initialize it */
if ((dev->si_flags & SI_NAMED) == 0) {
@@ -190,13 +184,12 @@
softc->state = TARG_STATE_OPENED;
softc->periph = NULL;
softc->path = NULL;
- mtx_init(&softc->mtx, devtoname(dev), "targ cdev", MTX_DEF);
TAILQ_INIT(&softc->pending_ccb_queue);
TAILQ_INIT(&softc->work_queue);
TAILQ_INIT(&softc->abort_queue);
TAILQ_INIT(&softc->user_ccb_queue);
- knlist_init(&softc->read_select.si_note, &softc->mtx, NULL, NULL, NULL);
+ knlist_init(&softc->read_select.si_note, NULL, NULL, NULL, NULL);
return (0);
}
@@ -209,22 +202,15 @@
int error;
softc = (struct targ_softc *)dev->si_drv1;
- TARG_LOCK(softc);
error = targdisable(softc);
if (error == CAM_REQ_CMP) {
dev->si_drv1 = 0;
- mtx_lock(&targ_mtx);
if (softc->periph != NULL) {
cam_periph_invalidate(softc->periph);
softc->periph = NULL;
}
- mtx_unlock(&targ_mtx);
- TARG_UNLOCK(softc);
- mtx_destroy(&softc->mtx);
destroy_dev(dev);
FREE(softc, M_TARG);
- } else {
- TARG_UNLOCK(softc);
}
return (error);
}
@@ -253,17 +239,13 @@
printf("Couldn't create path, status %#x\n", status);
break;
}
- TARG_LOCK(softc);
status = targenable(softc, path, new_lun->grp6_len,
new_lun->grp7_len);
- TARG_UNLOCK(softc);
xpt_free_path(path);
break;
}
case TARGIOCDISABLE:
- TARG_LOCK(softc);
status = targdisable(softc);
- TARG_UNLOCK(softc);
break;
case TARGIOCDEBUG:
{
@@ -280,14 +262,11 @@
cdbg.ccb_h.cbfcnp = targdone;
/* If no periph available, disallow debugging changes */
- TARG_LOCK(softc);
if ((softc->state & TARG_STATE_LUN_ENABLED) == 0) {
status = CAM_DEV_NOT_THERE;
- TARG_UNLOCK(softc);
break;
}
xpt_action((union ccb *)&cdbg);
- TARG_UNLOCK(softc);
status = cdbg.ccb_h.status & CAM_STATUS_MASK;
#else
status = CAM_FUNC_NOTAVAIL;
@@ -315,7 +294,6 @@
revents = poll_events & (POLLOUT | POLLWRNORM);
if ((poll_events & (POLLIN | POLLRDNORM)) != 0) {
/* Poll for read() depends on user and abort queues. */
- TARG_LOCK(softc);
if (!TAILQ_EMPTY(&softc->user_ccb_queue) ||
!TAILQ_EMPTY(&softc->abort_queue)) {
revents |= poll_events & (POLLIN | POLLRDNORM);
@@ -323,7 +301,6 @@
/* Only sleep if the user didn't poll for write. */
if (revents == 0)
selrecord(td, &softc->read_select);
- TARG_UNLOCK(softc);
}
return (revents);
@@ -415,7 +392,6 @@
}
/* Destroy any periph on our path if it is disabled */
- mtx_lock(&targ_mtx);
periph = cam_periph_find(path, "targ");
if (periph != NULL) {
struct targ_softc *del_softc;
@@ -427,7 +403,6 @@
} else {
printf("Requested path still in use by targ%d\n",
periph->unit_number);
- mtx_unlock(&targ_mtx);
status = CAM_LUN_ALRDY_ENA;
goto enable_fail;
}
@@ -436,7 +411,6 @@
/* Create a periph instance attached to this path */
status = cam_periph_alloc(targctor, NULL, targdtor, targstart,
"targ", CAM_PERIPH_BIO, path, targasync, 0, softc);
- mtx_unlock(&targ_mtx);
if (status != CAM_REQ_CMP) {
printf("cam_periph_alloc failed, status %#x\n", status);
goto enable_fail;
@@ -566,11 +540,9 @@
CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH,
("Sent ATIO/INOT (%p)\n", user_ccb));
xpt_action(ccb);
- TARG_LOCK(softc);
TAILQ_INSERT_TAIL(&softc->pending_ccb_queue,
&ccb->ccb_h,
periph_links.tqe);
- TARG_UNLOCK(softc);
break;
default:
if ((func_code & XPT_FC_QUEUED) != 0) {
@@ -581,10 +553,8 @@
descr->user_ccb = user_ccb;
descr->priority = priority;
descr->func_code = func_code;
- TARG_LOCK(softc);
TAILQ_INSERT_TAIL(&softc->work_queue,
descr, tqe);
- TARG_UNLOCK(softc);
xpt_schedule(softc->periph, priority);
} else {
CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH,
@@ -629,15 +599,12 @@
softc = (struct targ_softc *)periph->softc;
CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH, ("targstart %p\n", start_ccb));
- TARG_LOCK(softc);
descr = TAILQ_FIRST(&softc->work_queue);
if (descr == NULL) {
- TARG_UNLOCK(softc);
xpt_release_ccb(start_ccb);
} else {
TAILQ_REMOVE(&softc->work_queue, descr, tqe);
next_descr = TAILQ_FIRST(&softc->work_queue);
- TARG_UNLOCK(softc);
/* Initiate a transaction using the descr and supplied CCB */
error = targusermerge(softc, descr, start_ccb);
@@ -649,9 +616,7 @@
xpt_release_ccb(start_ccb);
suword(&descr->user_ccb->ccb_h.status,
CAM_REQ_CMP_ERR);
- TARG_LOCK(softc);
TAILQ_INSERT_TAIL(&softc->abort_queue, descr, tqe);
- TARG_UNLOCK(softc);
notify_user(softc);
}
@@ -694,7 +659,6 @@
struct ccb_hdr *ccb_h;
cab = (struct ccb_abort *)ccb;
- TARG_LOCK(softc);
TAILQ_FOREACH(ccb_h, &softc->pending_ccb_queue,
periph_links.tqe) {
struct targ_cmd_descr *ab_descr;
@@ -708,7 +672,6 @@
break;
}
}
- TARG_UNLOCK(softc);
/* CCB not found, set appropriate status */
if (ccb_h == NULL) {
k_ccbh->status = CAM_PATH_INVALID;
@@ -776,10 +739,8 @@
*/
CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH, ("sendccb %p\n", ccb));
if (XPT_FC_IS_QUEUED(ccb)) {
- TARG_LOCK(softc);
TAILQ_INSERT_TAIL(&softc->pending_ccb_queue, ccb_h,
periph_links.tqe);
- TARG_UNLOCK(softc);
}
xpt_action(ccb);
@@ -795,7 +756,6 @@
CAM_DEBUG(periph->path, CAM_DEBUG_PERIPH, ("targdone %p\n", done_ccb));
softc = (struct targ_softc *)periph->softc;
- TARG_LOCK(softc);
TAILQ_REMOVE(&softc->pending_ccb_queue, &done_ccb->ccb_h,
periph_links.tqe);
status = done_ccb->ccb_h.status & CAM_STATUS_MASK;
@@ -803,7 +763,6 @@
/* If we're no longer enabled, throw away CCB */
if ((softc->state & TARG_STATE_LUN_ENABLED) == 0) {
targfreeccb(softc, done_ccb);
- TARG_UNLOCK(softc);
return;
}
/* abort_all_pending() waits for pending queue to be empty */
@@ -817,7 +776,6 @@
case XPT_CONT_TARGET_IO:
TAILQ_INSERT_TAIL(&softc->user_ccb_queue, &done_ccb->ccb_h,
periph_links.tqe);
- TARG_UNLOCK(softc);
notify_user(softc);
break;
default:
@@ -839,6 +797,8 @@
union ccb *user_ccb;
int read_len, error;
+ mtx_lock(&Giant);
+
error = 0;
read_len = 0;
softc = (struct targ_softc *)dev->si_drv1;
@@ -847,12 +807,11 @@
CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH, ("targread\n"));
/* If no data is available, wait or return immediately */
- TARG_LOCK(softc);
ccb_h = TAILQ_FIRST(user_queue);
user_descr = TAILQ_FIRST(abort_queue);
while (ccb_h == NULL && user_descr == NULL) {
if ((ioflag & IO_NDELAY) == 0) {
- error = msleep(user_queue, &softc->mtx,
+ error = msleep(user_queue, NULL,
PRIBIO | PCATCH, "targrd", 0);
ccb_h = TAILQ_FIRST(user_queue);
user_descr = TAILQ_FIRST(abort_queue);
@@ -860,12 +819,11 @@
if (error == ERESTART) {
continue;
} else {
- TARG_UNLOCK(softc);
goto read_fail;
}
}
} else {
- TARG_UNLOCK(softc);
+ mtx_unlock(&Giant);
return (EAGAIN);
}
}
@@ -877,7 +835,6 @@
if (uio->uio_resid < sizeof(user_ccb))
break;
TAILQ_REMOVE(user_queue, ccb_h, periph_links.tqe);
- TARG_UNLOCK(softc);
descr = (struct targ_cmd_descr *)ccb_h->targ_descr;
user_ccb = descr->user_ccb;
CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH,
@@ -890,7 +847,6 @@
goto read_fail;
read_len += sizeof(user_ccb);
- TARG_LOCK(softc);
ccb_h = TAILQ_FIRST(user_queue);
}
@@ -899,7 +855,6 @@
if (uio->uio_resid < sizeof(user_ccb))
break;
TAILQ_REMOVE(abort_queue, user_descr, tqe);
- TARG_UNLOCK(softc);
user_ccb = user_descr->user_ccb;
CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH,
("targread aborted descr %p (%p)\n",
@@ -910,10 +865,8 @@
goto read_fail;
read_len += sizeof(user_ccb);
- TARG_LOCK(softc);
user_descr = TAILQ_FIRST(abort_queue);
}
- TARG_UNLOCK(softc);
/*
* If we've successfully read some amount of data, don't report an
@@ -924,6 +877,7 @@
error = ENOSPC;
read_fail:
+ mtx_unlock(&Giant);
return (error);
}
@@ -1020,7 +974,6 @@
static void
targinit(void)
{
- mtx_init(&targ_mtx, "targ global", NULL, MTX_DEF);
EVENTHANDLER_REGISTER(dev_clone, targclone, 0, 1000);
}
@@ -1086,7 +1039,7 @@
/* If we aborted at least one pending CCB ok, wait for it. */
if (cab.ccb_h.status == CAM_REQ_CMP) {
- msleep(&softc->pending_ccb_queue, &softc->mtx,
+ msleep(&softc->pending_ccb_queue, NULL,
PRIBIO | PCATCH, "tgabrt", 0);
}
@@ -1105,7 +1058,7 @@
* blocking read().
*/
selwakeuppri(&softc->read_select, PRIBIO);
- KNOTE_LOCKED(&softc->read_select.si_note, 0);
+ KNOTE_UNLOCKED(&softc->read_select.si_note, 0);
wakeup(&softc->user_ccb_queue);
}
More information about the p4-projects
mailing list