Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
/**
 * 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);
	}