On 30/04/2020 14:18, Hannes Reinecke wrote:
k *sas_alloc_slow_task(gfp_t flags)
+struct sas_task *sas_alloc_slow_task(struct sas_ha_struct *ha,
+ struct domain_device *dev,
+ struct scsi_lun *lun, gfp_t flags)
{
struct sas_task *task = sas_alloc_task(flags);
- struct sas_task_slow *slow = kmalloc(sizeof(*slow), flags);
+ struct Scsi_Host *shost = ha->core.shost;
+ struct sas_task_slow *slow;
- if (!task || !slow) {
- if (task)
- kmem_cache_free(sas_task_cache, task);
- kfree(slow);
+ if (!task)
return NULL;
+
+ slow = kzalloc(sizeof(*slow), flags);
+ if (!slow)
+ goto out_err_slow;
+
+ if (shost->nr_reserved_cmds) {
+ struct scsi_device *sdev;
+
+ if (dev && dev->starget) {
+ sdev = scsi_device_lookup_by_target(dev->starget,
+ scsilun_to_int(lun));
+ if (!sdev)
+ goto out_err_scmd;
+ } else
+ sdev = ha->core.shost_dev;
Could we always just use the ha->core.shost_dev? I feel that it would
make the code neater.
Thanks,
John
+ slow->scmd = scsi_get_reserved_cmd(sdev, DMA_NONE, false);
+ if (!slow->scmd)
+ goto out_err_scmd;
+ ASSIGN_SAS_TASK(slow->scmd, task);
}