static void channel_rescan(void *data) { struct rescan_wrapper* rescan = (struct rescan_wrapper*)data; struct Scsi_Host *host; struct scsi_device *sdev = NULL; MV_U16 target; if (rescan->pAdapter->host[rescan->channelIndex] == NULL) { kfree(rescan); return; } host = rescan->pAdapter->host[rescan->channelIndex]->scsihost; down(&rescan->pAdapter->rescan_mutex); if (atomic_read(&rescan->pAdapter->stopped) > 0) { up(&rescan->pAdapter->rescan_mutex); kfree(rescan); return; } mvLogMsg(MV_IAL_LOG_ID, MV_DEBUG, "[%d %d] channel_rescan(): " "targets to add 0x%X, targets to remove 0x%X\n", rescan->pAdapter->mvSataAdapter.adapterId, rescan->channelIndex, rescan->targetsToRemove, rescan->targetsToAdd); for (target = 0; (rescan->targetsToRemove != 0) && (target < host->max_id); target++) { if (rescan->targetsToRemove & (1 << target)) { sdev = scsi_device_lookup(host, 0, target, 0); if (sdev != NULL) { scsi_device_cancel(sdev, 0); scsi_remove_device(sdev); scsi_device_put(sdev); } } } sdev = NULL; for (target = 0; (rescan->targetsToAdd != 0) && (target < host->max_id); target++) { if (rescan->targetsToAdd & (1 << target)) { sdev = scsi_add_device(host, 0, target, 0); if (NULL == sdev) { mvLogMsg(MV_IAL_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d] Error adding scsi device\n", rescan->pAdapter->mvSataAdapter.adapterId, rescan->channelIndex, target); } } } up(&rescan->pAdapter->rescan_mutex); kfree(rescan); }
/** * scsi_host_cancel - cancel outstanding IO to this host * @shost: pointer to struct Scsi_Host * recovery: recovery requested to run. **/ void scsi_host_cancel(struct Scsi_Host *shost, int recovery) { struct scsi_device *sdev; set_bit(SHOST_CANCEL, &shost->shost_state); shost_for_each_device(sdev, shost) { scsi_device_cancel(sdev, recovery); }