]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/block/swim3.c
block: autoconvert trivial BKL users to private mutex
[net-next-2.6.git] / drivers / block / swim3.c
index ed6fb91123abb67577f6f309f0171a6d7e0cb142..bf3a5b8592990ccf640b4221973ff84114b893df 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/ioctl.h>
 #include <linux/blkdev.h>
 #include <linux/interrupt.h>
+#include <linux/mutex.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <asm/io.h>
@@ -35,6 +36,7 @@
 #include <asm/machdep.h>
 #include <asm/pmac_feature.h>
 
+static DEFINE_MUTEX(swim3_mutex);
 static struct request_queue *swim3_queue;
 static struct gendisk *disks[2];
 static struct request *fd_req;
@@ -839,7 +841,7 @@ static int fd_eject(struct floppy_state *fs)
 static struct floppy_struct floppy_type =
        { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };    /*  7 1.44MB 3.5"   */
 
-static int floppy_ioctl(struct block_device *bdev, fmode_t mode,
+static int floppy_locked_ioctl(struct block_device *bdev, fmode_t mode,
                        unsigned int cmd, unsigned long param)
 {
        struct floppy_state *fs = bdev->bd_disk->private_data;
@@ -867,6 +869,18 @@ static int floppy_ioctl(struct block_device *bdev, fmode_t mode,
        return -ENOTTY;
 }
 
+static int floppy_ioctl(struct block_device *bdev, fmode_t mode,
+                                unsigned int cmd, unsigned long param)
+{
+       int ret;
+
+       mutex_lock(&swim3_mutex);
+       ret = floppy_locked_ioctl(bdev, mode, cmd, param);
+       mutex_unlock(&swim3_mutex);
+
+       return ret;
+}
+
 static int floppy_open(struct block_device *bdev, fmode_t mode)
 {
        struct floppy_state *fs = bdev->bd_disk->private_data;
@@ -936,15 +950,28 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
        return 0;
 }
 
+static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode)
+{
+       int ret;
+
+       mutex_lock(&swim3_mutex);
+       ret = floppy_open(bdev, mode);
+       mutex_unlock(&swim3_mutex);
+
+       return ret;
+}
+
 static int floppy_release(struct gendisk *disk, fmode_t mode)
 {
        struct floppy_state *fs = disk->private_data;
        struct swim3 __iomem *sw = fs->swim3;
+       mutex_lock(&swim3_mutex);
        if (fs->ref_count > 0 && --fs->ref_count == 0) {
                swim3_action(fs, MOTOR_OFF);
                out_8(&sw->control_bic, 0xff);
                swim3_select(fs, RELAX);
        }
+       mutex_unlock(&swim3_mutex);
        return 0;
 }
 
@@ -995,9 +1022,9 @@ static int floppy_revalidate(struct gendisk *disk)
 }
 
 static const struct block_device_operations floppy_fops = {
-       .open           = floppy_open,
+       .open           = floppy_unlocked_open,
        .release        = floppy_release,
-       .locked_ioctl   = floppy_ioctl,
+       .ioctl          = floppy_ioctl,
        .media_changed  = floppy_check_change,
        .revalidate_disk= floppy_revalidate,
 };