Loading drivers/scsi/dpt_i2o.c +8 −1 Original line number Diff line number Diff line Loading @@ -907,9 +907,13 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev raptorFlag = TRUE; } if (pci_request_regions(pDev, "dpt_i2o")) { PERROR("dpti: adpt_config_hba: pci request region failed\n"); return -EINVAL; } base_addr_virt = ioremap(base_addr0_phys,hba_map0_area_size); if (!base_addr_virt) { pci_release_regions(pDev); PERROR("dpti: adpt_config_hba: io remap failed\n"); return -EINVAL; } Loading @@ -919,6 +923,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev if (!msg_addr_virt) { PERROR("dpti: adpt_config_hba: io remap failed on BAR1\n"); iounmap(base_addr_virt); pci_release_regions(pDev); return -EINVAL; } } else { Loading @@ -932,6 +937,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev iounmap(msg_addr_virt); } iounmap(base_addr_virt); pci_release_regions(pDev); return -ENOMEM; } memset(pHba, 0, sizeof(adpt_hba)); Loading Loading @@ -1027,6 +1033,7 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba) up(&adpt_configuration_lock); iounmap(pHba->base_addr_virt); pci_release_regions(pHba->pDev); if(pHba->msg_addr_virt != pHba->base_addr_virt){ iounmap(pHba->msg_addr_virt); } Loading drivers/scsi/scsi_scan.c +15 −1 Original line number Diff line number Diff line Loading @@ -336,9 +336,23 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, unsigned long flags; const int size = sizeof(struct scsi_target) + shost->transportt->target_size; struct scsi_target *starget = kmalloc(size, GFP_ATOMIC); struct scsi_target *starget; struct scsi_target *found_target; /* * Obtain the real parent from the transport. The transport * is allowed to fail (no error) if there is nothing at that * target id. */ if (shost->transportt->target_parent) { spin_lock_irqsave(shost->host_lock, flags); parent = shost->transportt->target_parent(shost, channel, id); spin_unlock_irqrestore(shost->host_lock, flags); if (!parent) return NULL; } starget = kmalloc(size, GFP_KERNEL); if (!starget) { printk(KERN_ERR "%s: allocation failure\n", __FUNCTION__); return NULL; Loading drivers/scsi/scsi_transport_fc.c +19 −0 Original line number Diff line number Diff line Loading @@ -1022,6 +1022,23 @@ static int fc_rport_match(struct attribute_container *cont, return &i->rport_attr_cont.ac == cont; } /* * Must be called with shost->host_lock held */ static struct device *fc_target_parent(struct Scsi_Host *shost, int channel, uint id) { struct fc_rport *rport; list_for_each_entry(rport, &fc_host_rports(shost), peers) if ((rport->channel == channel) && (rport->scsi_target_id == id)) return &rport->dev; return NULL; } struct scsi_transport_template * fc_attach_transport(struct fc_function_template *ft) { Loading Loading @@ -1058,6 +1075,8 @@ fc_attach_transport(struct fc_function_template *ft) /* Transport uses the shost workq for scsi scanning */ i->t.create_work_queue = 1; i->t.target_parent = fc_target_parent; /* * Setup SCSI Target Attributes. */ Loading include/scsi/scsi_transport.h +8 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,14 @@ struct scsi_transport_template { struct transport_container target_attrs; struct transport_container device_attrs; /* * If set, call target_parent prior to allocating a scsi_target, * so we get the appropriate parent for the target. This function * is required for transports like FC and iSCSI that do not put the * scsi_target under scsi_host. */ struct device *(*target_parent)(struct Scsi_Host *, int, uint); /* The size of the specific transport attribute structure (a * space of this size will be left at the end of the * scsi_* structure */ Loading Loading
drivers/scsi/dpt_i2o.c +8 −1 Original line number Diff line number Diff line Loading @@ -907,9 +907,13 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev raptorFlag = TRUE; } if (pci_request_regions(pDev, "dpt_i2o")) { PERROR("dpti: adpt_config_hba: pci request region failed\n"); return -EINVAL; } base_addr_virt = ioremap(base_addr0_phys,hba_map0_area_size); if (!base_addr_virt) { pci_release_regions(pDev); PERROR("dpti: adpt_config_hba: io remap failed\n"); return -EINVAL; } Loading @@ -919,6 +923,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev if (!msg_addr_virt) { PERROR("dpti: adpt_config_hba: io remap failed on BAR1\n"); iounmap(base_addr_virt); pci_release_regions(pDev); return -EINVAL; } } else { Loading @@ -932,6 +937,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev iounmap(msg_addr_virt); } iounmap(base_addr_virt); pci_release_regions(pDev); return -ENOMEM; } memset(pHba, 0, sizeof(adpt_hba)); Loading Loading @@ -1027,6 +1033,7 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba) up(&adpt_configuration_lock); iounmap(pHba->base_addr_virt); pci_release_regions(pHba->pDev); if(pHba->msg_addr_virt != pHba->base_addr_virt){ iounmap(pHba->msg_addr_virt); } Loading
drivers/scsi/scsi_scan.c +15 −1 Original line number Diff line number Diff line Loading @@ -336,9 +336,23 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, unsigned long flags; const int size = sizeof(struct scsi_target) + shost->transportt->target_size; struct scsi_target *starget = kmalloc(size, GFP_ATOMIC); struct scsi_target *starget; struct scsi_target *found_target; /* * Obtain the real parent from the transport. The transport * is allowed to fail (no error) if there is nothing at that * target id. */ if (shost->transportt->target_parent) { spin_lock_irqsave(shost->host_lock, flags); parent = shost->transportt->target_parent(shost, channel, id); spin_unlock_irqrestore(shost->host_lock, flags); if (!parent) return NULL; } starget = kmalloc(size, GFP_KERNEL); if (!starget) { printk(KERN_ERR "%s: allocation failure\n", __FUNCTION__); return NULL; Loading
drivers/scsi/scsi_transport_fc.c +19 −0 Original line number Diff line number Diff line Loading @@ -1022,6 +1022,23 @@ static int fc_rport_match(struct attribute_container *cont, return &i->rport_attr_cont.ac == cont; } /* * Must be called with shost->host_lock held */ static struct device *fc_target_parent(struct Scsi_Host *shost, int channel, uint id) { struct fc_rport *rport; list_for_each_entry(rport, &fc_host_rports(shost), peers) if ((rport->channel == channel) && (rport->scsi_target_id == id)) return &rport->dev; return NULL; } struct scsi_transport_template * fc_attach_transport(struct fc_function_template *ft) { Loading Loading @@ -1058,6 +1075,8 @@ fc_attach_transport(struct fc_function_template *ft) /* Transport uses the shost workq for scsi scanning */ i->t.create_work_queue = 1; i->t.target_parent = fc_target_parent; /* * Setup SCSI Target Attributes. */ Loading
include/scsi/scsi_transport.h +8 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,14 @@ struct scsi_transport_template { struct transport_container target_attrs; struct transport_container device_attrs; /* * If set, call target_parent prior to allocating a scsi_target, * so we get the appropriate parent for the target. This function * is required for transports like FC and iSCSI that do not put the * scsi_target under scsi_host. */ struct device *(*target_parent)(struct Scsi_Host *, int, uint); /* The size of the specific transport attribute structure (a * space of this size will be left at the end of the * scsi_* structure */ Loading