Make ctl_queue_sense() not sleep.
It may be called in non-sleepable frontend context. MFC after: 2 weeks
This commit is contained in:
parent
511d4e58f3
commit
3a13860a1b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=314387
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user