]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/sg.c
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi...
[linux-2.6-omap-h63xx.git] / drivers / scsi / sg.c
index f7abccaffaec47c73465b7698bb0c6cdf47ae84e..fccd2e88d6000292d8494f1d4b1ccd688497958f 100644 (file)
@@ -49,6 +49,7 @@ static int sg_version_num = 30534;    /* 2 digits for each component */
 #include <linux/delay.h>
 #include <linux/scatterlist.h>
 #include <linux/blktrace_api.h>
+#include <linux/smp_lock.h>
 
 #include "scsi.h"
 #include <scsi/scsi_dbg.h>
@@ -227,19 +228,26 @@ sg_open(struct inode *inode, struct file *filp)
        int res;
        int retval;
 
+       lock_kernel();
        nonseekable_open(inode, filp);
        SCSI_LOG_TIMEOUT(3, printk("sg_open: dev=%d, flags=0x%x\n", dev, flags));
        sdp = sg_get_dev(dev);
-       if ((!sdp) || (!sdp->device))
+       if ((!sdp) || (!sdp->device)) {
+               unlock_kernel();
                return -ENXIO;
-       if (sdp->detached)
+       }
+       if (sdp->detached) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        /* This driver's module count bumped by fops_get in <linux/fs.h> */
        /* Prevent the device driver from vanishing while we sleep */
        retval = scsi_device_get(sdp->device);
-       if (retval)
+       if (retval) {
+               unlock_kernel();
                return retval;
+       }
 
        if (!((flags & O_NONBLOCK) ||
              scsi_block_when_processing_errors(sdp->device))) {
@@ -295,10 +303,12 @@ sg_open(struct inode *inode, struct file *filp)
                retval = -ENOMEM;
                goto error_out;
        }
+       unlock_kernel();
        return 0;
 
       error_out:
        scsi_device_put(sdp->device);
+       unlock_kernel();
        return retval;
 }
 
@@ -679,7 +689,7 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf,
                sg_remove_request(sfp, srp);
                return -EFAULT;
        }
-       if (read_only && (!blk_verify_command(file, cmnd))) {
+       if (read_only && !blk_verify_command(file, cmnd)) {
                sg_remove_request(sfp, srp);
                return -EPERM;
        }
@@ -2502,10 +2512,6 @@ sg_page_free(struct page *page, int size)
        __free_pages(page, order);
 }
 
-#ifndef MAINTENANCE_IN_CMD
-#define MAINTENANCE_IN_CMD 0xa3
-#endif
-
 #ifdef CONFIG_SCSI_PROC_FS
 static int
 sg_idr_max_id(int id, void *p, void *data)