]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/aacraid/linit.c
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6-omap-h63xx.git] / drivers / scsi / aacraid / linit.c
index 3870bd61f418552573de94ed6514834b6431d8eb..c709dc8ad99dee8e886d8b1bb4ac81749181733f 100644 (file)
@@ -636,6 +636,8 @@ static int aac_cfg_open(struct inode *inode, struct file *file)
 static int aac_cfg_ioctl(struct inode *inode,  struct file *file,
                unsigned int cmd, unsigned long arg)
 {
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
        return aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
 }
 
@@ -689,6 +691,8 @@ static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
 
 static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
        return aac_compat_do_ioctl((struct aac_dev *)file->private_data, cmd, arg);
 }
 #endif
@@ -770,15 +774,21 @@ static ssize_t aac_show_bios_version(struct class_device *class_dev,
        return len;
 }
 
-static ssize_t aac_show_serial_number(struct class_device *class_dev,
-               char *buf)
+ssize_t aac_show_serial_number(struct class_device *class_dev, char *buf)
 {
        struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
        int len = 0;
 
        if (le32_to_cpu(dev->adapter_info.serial[0]) != 0xBAD0)
-               len = snprintf(buf, PAGE_SIZE, "%x\n",
+               len = snprintf(buf, PAGE_SIZE, "%06X\n",
                  le32_to_cpu(dev->adapter_info.serial[0]));
+       if (len &&
+         !memcmp(&dev->supplement_adapter_info.MfgPcbaSerialNo[
+           sizeof(dev->supplement_adapter_info.MfgPcbaSerialNo)+2-len],
+         buf, len))
+               len = snprintf(buf, PAGE_SIZE, "%.*s\n",
+                 (int)sizeof(dev->supplement_adapter_info.MfgPcbaSerialNo),
+                 dev->supplement_adapter_info.MfgPcbaSerialNo);
        return len;
 }
 
@@ -937,6 +947,14 @@ static struct scsi_host_template aac_driver_template = {
        .emulated                       = 1,
 };
 
+static void __aac_shutdown(struct aac_dev * aac)
+{
+       kthread_stop(aac->thread);
+       aac_send_shutdown(aac);
+       aac_adapter_disable_int(aac);
+       free_irq(aac->pdev->irq, aac);
+}
+
 static int __devinit aac_probe_one(struct pci_dev *pdev,
                const struct pci_device_id *id)
 {
@@ -1089,10 +1107,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
        return 0;
 
  out_deinit:
-       kthread_stop(aac->thread);
-       aac_send_shutdown(aac);
-       aac_adapter_disable_int(aac);
-       free_irq(pdev->irq, aac);
+       __aac_shutdown(aac);
  out_unmap:
        aac_fib_map_free(aac);
        pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys);
@@ -1112,7 +1127,8 @@ static void aac_shutdown(struct pci_dev *dev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(dev);
        struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
-       aac_send_shutdown(aac);
+       scsi_block_requests(shost);
+       __aac_shutdown(aac);
 }
 
 static void __devexit aac_remove_one(struct pci_dev *pdev)
@@ -1122,16 +1138,12 @@ static void __devexit aac_remove_one(struct pci_dev *pdev)
 
        scsi_remove_host(shost);
 
-       kthread_stop(aac->thread);
-
-       aac_send_shutdown(aac);
-       aac_adapter_disable_int(aac);
+       __aac_shutdown(aac);
        aac_fib_map_free(aac);
        pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
                        aac->comm_phys);
        kfree(aac->queues);
 
-       free_irq(pdev->irq, aac);
        aac_adapter_ioremap(aac, 0);
        
        kfree(aac->fibs);