Make ctl_queue_sense() not sleep.

It may be called in non-sleepable frontend context.

MFC after:	2 weeks
This commit is contained in:
Alexander Motin 2017-02-28 11:56:17 +00:00
parent 511d4e58f3
commit 3a13860a1b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=314387

View File

@ -13146,21 +13146,15 @@ ctl_queue_sense(union ctl_io *io)
initidx = ctl_get_initindex(&io->io_hdr.nexus);
p = initidx / CTL_MAX_INIT_PER_PORT;
if ((ps = lun->pending_sense[p]) == NULL) {
mtx_unlock(&lun->lun_lock);
ps = malloc(sizeof(*ps) * CTL_MAX_INIT_PER_PORT, M_CTL,
M_WAITOK | M_ZERO);
mtx_lock(&lun->lun_lock);
if (lun->pending_sense[p] == NULL) {
lun->pending_sense[p] = ps;
} else {
free(ps, M_CTL);
ps = lun->pending_sense[p];
}
if (lun->pending_sense[p] == NULL) {
lun->pending_sense[p] = malloc(sizeof(*ps) * CTL_MAX_INIT_PER_PORT,
M_CTL, M_NOWAIT | M_ZERO);
}
if ((ps = lun->pending_sense[p]) != NULL) {
ps += initidx % CTL_MAX_INIT_PER_PORT;
memset(ps, 0, sizeof(*ps));
memcpy(ps, &io->scsiio.sense_data, io->scsiio.sense_len);
}
ps += initidx % CTL_MAX_INIT_PER_PORT;
memset(ps, 0, sizeof(*ps));
memcpy(ps, &io->scsiio.sense_data, io->scsiio.sense_len);
mtx_unlock(&lun->lun_lock);
bailout: