Add "no BKL needed" comments to several drivers
[safe/jmp/linux-2.6] / drivers / scsi / 3w-9xxx.c
index b4912d1..2239d16 100644 (file)
@@ -140,9 +140,10 @@ static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
 /* Functions */
 
 /* Show some statistics about the card */
-static ssize_t twa_show_stats(struct class_device *class_dev, char *buf)
+static ssize_t twa_show_stats(struct device *dev,
+                             struct device_attribute *attr, char *buf)
 {
-       struct Scsi_Host *host = class_to_shost(class_dev);
+       struct Scsi_Host *host = class_to_shost(dev);
        TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
        unsigned long flags = 0;
        ssize_t len;
@@ -184,7 +185,7 @@ static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth)
 } /* End twa_change_queue_depth() */
 
 /* Create sysfs 'stats' entry */
-static struct class_device_attribute twa_host_stats_attr = {
+static struct device_attribute twa_host_stats_attr = {
        .attr = {
                .name =         "stats",
                .mode =         S_IRUGO,
@@ -193,7 +194,7 @@ static struct class_device_attribute twa_host_stats_attr = {
 };
 
 /* Host attributes initializer */
-static struct class_device_attribute *twa_host_attrs[] = {
+static struct device_attribute *twa_host_attrs[] = {
        &twa_host_stats_attr,
        NULL,
 };
@@ -861,6 +862,8 @@ out:
 } /* End twa_chrdev_ioctl() */
 
 /* This function handles open for the character device */
+/* NOTE that this function will race with remove; adding BKL
+   will not help. */
 static int twa_chrdev_open(struct inode *inode, struct file *file)
 {
        unsigned int minor_number;
@@ -1838,12 +1841,11 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
                if (scsi_sg_count(srb)) {
                        if ((scsi_sg_count(srb) == 1) &&
                            (scsi_bufflen(srb) < TW_MIN_SGL_LENGTH)) {
-                               if (srb->sc_data_direction == DMA_TO_DEVICE || srb->sc_data_direction == DMA_BIDIRECTIONAL) {
-                                       struct scatterlist *sg = scsi_sglist(srb);
-                                       char *buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
-                                       memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length);
-                                       kunmap_atomic(buf - sg->offset, KM_IRQ0);
-                               }
+                               if (srb->sc_data_direction == DMA_TO_DEVICE ||
+                                   srb->sc_data_direction == DMA_BIDIRECTIONAL)
+                                       scsi_sg_copy_to_buffer(srb,
+                                                              tw_dev->generic_buffer_virt[request_id],
+                                                              TW_SECTOR_SIZE);
                                command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
                                command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH);
                        } else {
@@ -1915,13 +1917,11 @@ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int re
            (cmd->sc_data_direction == DMA_FROM_DEVICE ||
             cmd->sc_data_direction == DMA_BIDIRECTIONAL)) {
                if (scsi_sg_count(cmd) == 1) {
-                       struct scatterlist *sg = scsi_sglist(tw_dev->srb[request_id]);
-                       char *buf;
-                       unsigned long flags = 0;
+                       unsigned long flags;
+                       void *buf = tw_dev->generic_buffer_virt[request_id];
+
                        local_irq_save(flags);
-                       buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
-                       memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length);
-                       kunmap_atomic(buf - sg->offset, KM_IRQ0);
+                       scsi_sg_copy_from_buffer(cmd, buf, TW_SECTOR_SIZE);
                        local_irq_restore(flags);
                }
        }
@@ -2028,8 +2028,6 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id
        }
        tw_dev = (TW_Device_Extension *)host->hostdata;
 
-       memset(tw_dev, 0, sizeof(TW_Device_Extension));
-
        /* Save values to device extension */
        tw_dev->host = host;
        tw_dev->tw_pci_dev = pdev;