Merge branch 'for-2.6.36' of git://git.kernel.dk/linux-2.6-block
[pandora-kernel.git] / drivers / ata / libata-scsi.c
index cfa9dd3..a89172c 100644 (file)
@@ -414,6 +414,35 @@ int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
        return 0;
 }
 
+/**
+ *     ata_scsi_unlock_native_capacity - unlock native capacity
+ *     @sdev: SCSI device to adjust device capacity for
+ *
+ *     This function is called if a partition on @sdev extends beyond
+ *     the end of the device.  It requests EH to unlock HPA.
+ *
+ *     LOCKING:
+ *     Defined by the SCSI layer.  Might sleep.
+ */
+void ata_scsi_unlock_native_capacity(struct scsi_device *sdev)
+{
+       struct ata_port *ap = ata_shost_to_port(sdev->host);
+       struct ata_device *dev;
+       unsigned long flags;
+
+       spin_lock_irqsave(ap->lock, flags);
+
+       dev = ata_scsi_find_dev(ap, sdev);
+       if (dev && dev->n_sectors < dev->n_native_sectors) {
+               dev->flags |= ATA_DFLAG_UNLOCK_HPA;
+               dev->link->eh_info.action |= ATA_EH_RESET;
+               ata_port_schedule_eh(ap);
+       }
+
+       spin_unlock_irqrestore(ap->lock, flags);
+       ata_port_wait_eh(ap);
+}
+
 /**
  *     ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
  *     @ap: target port
@@ -1082,10 +1111,10 @@ static void ata_scsi_sdev_config(struct scsi_device *sdev)
  */
 static int atapi_drain_needed(struct request *rq)
 {
-       if (likely(!blk_pc_request(rq)))
+       if (likely(rq->cmd_type != REQ_TYPE_BLOCK_PC))
                return 0;
 
-       if (!blk_rq_bytes(rq) || (rq->cmd_flags & REQ_RW))
+       if (!blk_rq_bytes(rq) || (rq->cmd_flags & REQ_WRITE))
                return 0;
 
        return atapi_cmd_type(rq->cmd[0]) == ATAPI_MISC;
@@ -3406,7 +3435,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
                                "                  switching to async\n");
        }
 
-       queue_delayed_work(ata_aux_wq, &ap->hotplug_task,
+       queue_delayed_work(system_long_wq, &ap->hotplug_task,
                           round_jiffies_relative(HZ));
 }
 
@@ -3553,6 +3582,7 @@ void ata_scsi_hotplug(struct work_struct *work)
        }
 
        DPRINTK("ENTER\n");
+       mutex_lock(&ap->scsi_scan_mutex);
 
        /* Unplug detached devices.  We cannot use link iterator here
         * because PMP links have to be scanned even if PMP is
@@ -3566,6 +3596,7 @@ void ata_scsi_hotplug(struct work_struct *work)
        /* scan for new ones */
        ata_scsi_scan_host(ap, 0);
 
+       mutex_unlock(&ap->scsi_scan_mutex);
        DPRINTK("EXIT\n");
 }
 
@@ -3644,9 +3675,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
  *     @work: Pointer to ATA port to perform scsi_rescan_device()
  *
  *     After ATA pass thru (SAT) commands are executed successfully,
- *     libata need to propagate the changes to SCSI layer.  This
- *     function must be executed from ata_aux_wq such that sdev
- *     attach/detach don't race with rescan.
+ *     libata need to propagate the changes to SCSI layer.
  *
  *     LOCKING:
  *     Kernel thread context (may sleep).
@@ -3659,6 +3688,7 @@ void ata_scsi_dev_rescan(struct work_struct *work)
        struct ata_device *dev;
        unsigned long flags;
 
+       mutex_lock(&ap->scsi_scan_mutex);
        spin_lock_irqsave(ap->lock, flags);
 
        ata_for_each_link(link, ap, EDGE) {
@@ -3678,6 +3708,7 @@ void ata_scsi_dev_rescan(struct work_struct *work)
        }
 
        spin_unlock_irqrestore(ap->lock, flags);
+       mutex_unlock(&ap->scsi_scan_mutex);
 }
 
 /**