]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/memstick/core/mspro_block.c
block: autoconvert trivial BKL users to private mutex
[net-next-2.6.git] / drivers / memstick / core / mspro_block.c
index 8327e248520ac654596b41560fb51f4d913eedcb..02362eccc58866e1757f63c3776ec7993de4c3d4 100644 (file)
 #include <linux/kthread.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
+#include <linux/mutex.h>
 #include <linux/memstick.h>
 
 #define DRIVER_NAME "mspro_block"
 
+static DEFINE_MUTEX(mspro_block_mutex);
 static int major;
 module_param(major, int, 0644);
 
@@ -179,6 +181,7 @@ static int mspro_block_bd_open(struct block_device *bdev, fmode_t mode)
        struct mspro_block_data *msb = disk->private_data;
        int rc = -ENXIO;
 
+       mutex_lock(&mspro_block_mutex);
        mutex_lock(&mspro_block_disk_lock);
 
        if (msb && msb->card) {
@@ -190,6 +193,7 @@ static int mspro_block_bd_open(struct block_device *bdev, fmode_t mode)
        }
 
        mutex_unlock(&mspro_block_disk_lock);
+       mutex_unlock(&mspro_block_mutex);
 
        return rc;
 }
@@ -221,7 +225,11 @@ static int mspro_block_disk_release(struct gendisk *disk)
 
 static int mspro_block_bd_release(struct gendisk *disk, fmode_t mode)
 {
-       return mspro_block_disk_release(disk);
+       int ret;
+       mutex_lock(&mspro_block_mutex);
+       ret = mspro_block_disk_release(disk);
+       mutex_unlock(&mspro_block_mutex);
+       return ret;
 }
 
 static int mspro_block_bd_getgeo(struct block_device *bdev,
@@ -805,7 +813,8 @@ static void mspro_block_start(struct memstick_dev *card)
 
 static int mspro_block_prepare_req(struct request_queue *q, struct request *req)
 {
-       if (!blk_fs_request(req) && !blk_pc_request(req)) {
+       if (req->cmd_type != REQ_TYPE_FS &&
+           req->cmd_type != REQ_TYPE_BLOCK_PC) {
                blk_dump_rq_flags(req, "MSPro unsupported request");
                return BLKPREP_KILL;
        }
@@ -1040,6 +1049,7 @@ static int mspro_block_read_attributes(struct memstick_dev *card)
                        snprintf(s_attr->name, sizeof(s_attr->name),
                                 "attr_x%02x", attr->entries[cnt].id);
 
+               sysfs_attr_init(&s_attr->dev_attr.attr);
                s_attr->dev_attr.attr.name = s_attr->name;
                s_attr->dev_attr.attr.mode = S_IRUGO;
                s_attr->dev_attr.show = mspro_block_attr_show(s_attr->id);
@@ -1330,13 +1340,14 @@ static void mspro_block_remove(struct memstick_dev *card)
        struct mspro_block_data *msb = memstick_get_drvdata(card);
        unsigned long flags;
 
-       del_gendisk(msb->disk);
-       dev_dbg(&card->dev, "mspro block remove\n");
        spin_lock_irqsave(&msb->q_lock, flags);
        msb->eject = 1;
        blk_start_queue(msb->queue);
        spin_unlock_irqrestore(&msb->q_lock, flags);
 
+       del_gendisk(msb->disk);
+       dev_dbg(&card->dev, "mspro block remove\n");
+
        blk_cleanup_queue(msb->queue);
        msb->queue = NULL;