#include <linux/uio.h>
 #include <linux/idr.h>
 #include <linux/bsg.h>
-#include <linux/smp_lock.h>
 #include <linux/slab.h>
 
 #include <scsi/scsi.h>
 {
        struct bsg_device *bd;
 
-       lock_kernel();
        bd = bsg_get_device(inode, file);
-       unlock_kernel();
 
        if (IS_ERR(bd))
                return PTR_ERR(bd);
 
 #include <linux/ioport.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/reboot.h>
 #define DAC960_GAM_MINOR       252
 
 
+static DEFINE_MUTEX(DAC960_mutex);
 static DAC960_Controller_T *DAC960_Controllers[DAC960_MaxControllers];
 static int DAC960_ControllerCount;
 static struct proc_dir_entry *DAC960_ProcDirectoryEntry;
        int drive_nr = (long)disk->private_data;
        int ret = -ENXIO;
 
-       lock_kernel();
+       mutex_lock(&DAC960_mutex);
        if (p->FirmwareType == DAC960_V1_Controller) {
                if (p->V1.LogicalDriveInformation[drive_nr].
                    LogicalDriveState == DAC960_V1_LogicalDrive_Offline)
                goto out;
        ret = 0;
 out:
-       unlock_kernel();
+       mutex_unlock(&DAC960_mutex);
        return ret;
 }
 
   long ErrorCode = 0;
   if (!capable(CAP_SYS_ADMIN)) return -EACCES;
 
-  lock_kernel();
+  mutex_lock(&DAC960_mutex);
   switch (Request)
     {
     case DAC960_IOCTL_GET_CONTROLLER_COUNT:
       default:
        ErrorCode = -ENOTTY;
     }
-  unlock_kernel();
+  mutex_unlock(&DAC960_mutex);
   return ErrorCode;
 }
 
 
 #include <linux/hdreg.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/amifdreg.h>
 #include <linux/amifd.h>
 #include <linux/buffer_head.h>
 #define FD_HD_3        0x55555555  /* high-density 3.5" (1760K) drive */
 #define FD_DD_5        0xaaaaaaaa  /* double-density 5.25" (440K) drive */
 
+static DEFINE_MUTEX(amiflop_mutex);
 static unsigned long int fd_def_df0 = FD_DD_3;     /* default for df0 if it doesn't identify */
 
 module_param(fd_def_df0, ulong, 0);
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&amiflop_mutex);
        ret = fd_locked_ioctl(bdev, mode, cmd, param);
-       unlock_kernel();
+       mutex_unlock(&amiflop_mutex);
 
        return ret;
 }
        int old_dev;
        unsigned long flags;
 
-       lock_kernel();
+       mutex_lock(&amiflop_mutex);
        old_dev = fd_device[drive];
 
        if (fd_ref[drive] && old_dev != system) {
-               unlock_kernel();
+               mutex_unlock(&amiflop_mutex);
                return -EBUSY;
        }
 
                        rel_fdc();
 
                        if (wrprot) {
-                               unlock_kernel();
+                               mutex_unlock(&amiflop_mutex);
                                return -EROFS;
                        }
                }
        printk(KERN_INFO "fd%d: accessing %s-disk with %s-layout\n",drive,
               unit[drive].type->name, data_types[system].name);
 
-       unlock_kernel();
+       mutex_unlock(&amiflop_mutex);
        return 0;
 }
 
        struct amiga_floppy_struct *p = disk->private_data;
        int drive = p - unit;
 
-       lock_kernel();
+       mutex_lock(&amiflop_mutex);
        if (unit[drive].dirty == 1) {
                del_timer (flush_track_timer + drive);
                non_int_flush_track (drive);
 /* the mod_use counter is handled this way */
        floppy_off (drive | 0x40000000);
 #endif
-       unlock_kernel();
+       mutex_unlock(&amiflop_mutex);
        return 0;
 }
 
 
 #include <linux/slab.h>
 #include <linux/genhd.h>
 #include <linux/netdevice.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include "aoe.h"
 
+static DEFINE_MUTEX(aoeblk_mutex);
 static struct kmem_cache *buf_pool_cache;
 
 static ssize_t aoedisk_show_state(struct device *dev,
        struct aoedev *d = bdev->bd_disk->private_data;
        ulong flags;
 
-       lock_kernel();
+       mutex_lock(&aoeblk_mutex);
        spin_lock_irqsave(&d->lock, flags);
        if (d->flags & DEVFL_UP) {
                d->nopen++;
                spin_unlock_irqrestore(&d->lock, flags);
-               unlock_kernel();
+               mutex_unlock(&aoeblk_mutex);
                return 0;
        }
        spin_unlock_irqrestore(&d->lock, flags);
-       unlock_kernel();
+       mutex_unlock(&aoeblk_mutex);
        return -ENODEV;
 }
 
 
 #include <linux/completion.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/skbuff.h>
 #include "aoe.h"
 
        char *msg;
 };
 
+static DEFINE_MUTEX(aoechr_mutex);
 static struct ErrMsg emsgs[NMSG];
 static int emsgs_head_idx, emsgs_tail_idx;
 static struct completion emsgs_comp;
 {
        int n, i;
 
-       lock_kernel();
+       mutex_lock(&aoechr_mutex);
        n = iminor(inode);
        filp->private_data = (void *) (unsigned long) n;
 
        for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
                if (chardevs[i].minor == n) {
-                       unlock_kernel();
+                       mutex_unlock(&aoechr_mutex);
                        return 0;
                }
-       unlock_kernel();
+       mutex_unlock(&aoechr_mutex);
        return -EINVAL;
 }
 
 
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/blkdev.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 
 #include <asm/atafd.h>
 #include <asm/atafdreg.h>
 
 #undef DEBUG
 
+static DEFINE_MUTEX(ataflop_mutex);
 static struct request_queue *floppy_queue;
 static struct request *fd_request;
 
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ataflop_mutex);
        ret = fd_locked_ioctl(bdev, mode, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&ataflop_mutex);
 
        return ret;
 }
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ataflop_mutex);
        ret = floppy_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&ataflop_mutex);
 
        return ret;
 }
 static int floppy_release(struct gendisk *disk, fmode_t mode)
 {
        struct atari_floppy_struct *p = disk->private_data;
-       lock_kernel();
+       mutex_lock(&ataflop_mutex);
        if (p->ref < 0)
                p->ref = 0;
        else if (!p->ref--) {
                printk(KERN_ERR "floppy_release with fd_ref == 0");
                p->ref = 0;
        }
-       unlock_kernel();
+       mutex_unlock(&ataflop_mutex);
        return 0;
 }
 
 
 #include <linux/blkdev.h>
 #include <linux/bio.h>
 #include <linux/highmem.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/radix-tree.h>
 #include <linux/buffer_head.h> /* invalidate_bh_lrus() */
 #include <linux/slab.h>
 /*
  * Look up and return a brd's page for a given sector.
  */
+static DEFINE_MUTEX(brd_mutex);
 static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector)
 {
        pgoff_t idx;
         * ram device BLKFLSBUF has special semantics, we want to actually
         * release and destroy the ramdisk data.
         */
-       lock_kernel();
+       mutex_lock(&brd_mutex);
        mutex_lock(&bdev->bd_mutex);
        error = -EBUSY;
        if (bdev->bd_openers <= 1) {
                error = 0;
        }
        mutex_unlock(&bdev->bd_mutex);
-       unlock_kernel();
+       mutex_unlock(&brd_mutex);
 
        return error;
 }
 
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
 #include <linux/delay.h>
 #include <linux/major.h>
 #include <linux/fs.h>
 MODULE_VERSION("3.6.26");
 MODULE_LICENSE("GPL");
 
+static DEFINE_MUTEX(cciss_mutex);
 static int cciss_allow_hpsa;
 module_param(cciss_allow_hpsa, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(cciss_allow_hpsa,
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&cciss_mutex);
        ret = cciss_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&cciss_mutex);
 
        return ret;
 }
        ctlr_info_t *h;
        drive_info_struct *drv;
 
-       lock_kernel();
+       mutex_lock(&cciss_mutex);
        h = get_host(disk);
        drv = get_drv(disk);
        dev_dbg(&h->pdev->dev, "cciss_release %s\n", disk->disk_name);
        drv->usage_count--;
        h->usage_count--;
-       unlock_kernel();
+       mutex_unlock(&cciss_mutex);
        return 0;
 }
 
                    unsigned cmd, unsigned long arg)
 {
        int ret;
-       lock_kernel();
+       mutex_lock(&cciss_mutex);
        ret = cciss_ioctl(bdev, mode, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&cciss_mutex);
        return ret;
 }
 
 
 #include <linux/seq_file.h>
 #include <linux/init.h>
 #include <linux/hdreg.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/spinlock.h>
 #include <linux/blkdev.h>
 #include <linux/genhd.h>
 
 #define CPQARRAY_DMA_MASK      0xFFFFFFFF      /* 32 bit DMA */
 
+static DEFINE_MUTEX(cpqarray_mutex);
 static int nr_ctlr;
 static ctlr_info_t *hba[MAX_CTLR];
 
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&cpqarray_mutex);
        ret = ida_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&cpqarray_mutex);
 
        return ret;
 }
 {
        ctlr_info_t *host;
 
-       lock_kernel();
+       mutex_lock(&cpqarray_mutex);
        host = get_host(disk);
        host->usage_count--;
-       unlock_kernel();
+       mutex_unlock(&cpqarray_mutex);
 
        return 0;
 }
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&cpqarray_mutex);
        ret = ida_locked_ioctl(bdev, mode, cmd, param);
-       unlock_kernel();
+       mutex_unlock(&cpqarray_mutex);
 
        return ret;
 }
 
 #include <asm/types.h>
 #include <net/sock.h>
 #include <linux/ctype.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/fs.h>
 #include <linux/file.h>
 #include <linux/proc_fs.h>
        struct completion *done;
 };
 
+static DEFINE_MUTEX(drbd_main_mutex);
 int drbdd_init(struct drbd_thread *);
 int drbd_worker(struct drbd_thread *);
 int drbd_asender(struct drbd_thread *);
        unsigned long flags;
        int rv = 0;
 
-       lock_kernel();
+       mutex_lock(&drbd_main_mutex);
        spin_lock_irqsave(&mdev->req_lock, flags);
        /* to have a stable mdev->state.role
         * and no race with updating open_cnt */
        if (!rv)
                mdev->open_cnt++;
        spin_unlock_irqrestore(&mdev->req_lock, flags);
-       unlock_kernel();
+       mutex_unlock(&drbd_main_mutex);
 
        return rv;
 }
 static int drbd_release(struct gendisk *gd, fmode_t mode)
 {
        struct drbd_conf *mdev = gd->private_data;
-       lock_kernel();
+       mutex_lock(&drbd_main_mutex);
        mdev->open_cnt--;
-       unlock_kernel();
+       mutex_unlock(&drbd_main_mutex);
        return 0;
 }
 
 
 #include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/bio.h>
-#include <linux/smp_lock.h>
 #include <linux/string.h>
 #include <linux/jiffies.h>
 #include <linux/fcntl.h>
  * It's been recommended that take about 1/4 of the default speed
  * in some more extreme cases.
  */
+static DEFINE_MUTEX(floppy_mutex);
 static int slow_floppy;
 
 #include <asm/dma.h>
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&floppy_mutex);
        ret = fd_locked_ioctl(bdev, mode, cmd, param);
-       unlock_kernel();
+       mutex_unlock(&floppy_mutex);
 
        return ret;
 }
 {
        int drive = (long)disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&floppy_mutex);
        mutex_lock(&open_lock);
        if (UDRS->fd_ref < 0)
                UDRS->fd_ref = 0;
        if (!UDRS->fd_ref)
                opened_bdev[drive] = NULL;
        mutex_unlock(&open_lock);
-       unlock_kernel();
+       mutex_unlock(&floppy_mutex);
 
        return 0;
 }
        int res = -EBUSY;
        char *tmp;
 
-       lock_kernel();
+       mutex_lock(&floppy_mutex);
        mutex_lock(&open_lock);
        old_dev = UDRS->fd_device;
        if (opened_bdev[drive] && opened_bdev[drive] != bdev)
                        goto out;
        }
        mutex_unlock(&open_lock);
-       unlock_kernel();
+       mutex_unlock(&floppy_mutex);
        return 0;
 out:
        if (UDRS->fd_ref < 0)
                opened_bdev[drive] = NULL;
 out2:
        mutex_unlock(&open_lock);
-       unlock_kernel();
+       mutex_unlock(&floppy_mutex);
        return res;
 }
 
 
 #include <linux/compat.h>
 #include <linux/suspend.h>
 #include <linux/freezer.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/writeback.h>
 #include <linux/buffer_head.h>         /* for invalidate_bdev() */
 #include <linux/completion.h>
 
 #include <asm/uaccess.h>
 
+static DEFINE_MUTEX(loop_mutex);
 static LIST_HEAD(loop_devices);
 static DEFINE_MUTEX(loop_devices_mutex);
 
 {
        struct loop_device *lo = bdev->bd_disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&loop_mutex);
        mutex_lock(&lo->lo_ctl_mutex);
        lo->lo_refcnt++;
        mutex_unlock(&lo->lo_ctl_mutex);
-       unlock_kernel();
+       mutex_unlock(&loop_mutex);
 
        return 0;
 }
        struct loop_device *lo = disk->private_data;
        int err;
 
-       lock_kernel();
+       mutex_lock(&loop_mutex);
        mutex_lock(&lo->lo_ctl_mutex);
 
        if (--lo->lo_refcnt)
 out:
        mutex_unlock(&lo->lo_ctl_mutex);
 out_unlocked:
-       lock_kernel();
+       mutex_unlock(&loop_mutex);
        return 0;
 }
 
 
 #include <linux/errno.h>
 #include <linux/file.h>
 #include <linux/ioctl.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/compiler.h>
 #include <linux/err.h>
 #include <linux/kernel.h>
 #define DBG_BLKDEV      0x0100
 #define DBG_RX          0x0200
 #define DBG_TX          0x0400
+static DEFINE_MUTEX(nbd_mutex);
 static unsigned int debugflags;
 #endif /* NDEBUG */
 
        dprintk(DBG_IOCTL, "%s: nbd_ioctl cmd=%s(0x%x) arg=%lu\n",
                        lo->disk->disk_name, ioctl_cmd_to_ascii(cmd), cmd, arg);
 
-       lock_kernel();
+       mutex_lock(&nbd_mutex);
        mutex_lock(&lo->tx_lock);
        error = __nbd_ioctl(bdev, lo, cmd, arg);
        mutex_unlock(&lo->tx_lock);
-       unlock_kernel();
+       mutex_unlock(&nbd_mutex);
 
        return error;
 }
 
 #include <linux/cdrom.h>
 #include <linux/spinlock.h>
 #include <linux/blkdev.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <asm/uaccess.h>
 
+static DEFINE_MUTEX(pcd_mutex);
 static DEFINE_SPINLOCK(pcd_lock);
 
 module_param(verbose, bool, 0644);
        struct pcd_unit *cd = bdev->bd_disk->private_data;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&pcd_mutex);
        ret = cdrom_open(&cd->info, bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&pcd_mutex);
 
        return ret;
 }
 static int pcd_block_release(struct gendisk *disk, fmode_t mode)
 {
        struct pcd_unit *cd = disk->private_data;
-       lock_kernel();
+       mutex_lock(&pcd_mutex);
        cdrom_release(&cd->info, mode);
-       unlock_kernel();
+       mutex_unlock(&pcd_mutex);
        return 0;
 }
 
        struct pcd_unit *cd = bdev->bd_disk->private_data;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&pcd_mutex);
        ret = cdrom_ioctl(&cd->info, bdev, mode, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&pcd_mutex);
 
        return ret;
 }
 
 #include <linux/blkdev.h>
 #include <linux/blkpg.h>
 #include <linux/kernel.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <asm/uaccess.h>
 #include <linux/workqueue.h>
 
+static DEFINE_MUTEX(pd_mutex);
 static DEFINE_SPINLOCK(pd_lock);
 
 module_param(verbose, bool, 0);
 {
        struct pd_unit *disk = bdev->bd_disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&pd_mutex);
        disk->access++;
 
        if (disk->removable) {
                pd_special_command(disk, pd_media_check);
                pd_special_command(disk, pd_door_lock);
        }
-       unlock_kernel();
+       mutex_unlock(&pd_mutex);
        return 0;
 }
 
 
        switch (cmd) {
        case CDROMEJECT:
-               lock_kernel();
+               mutex_lock(&pd_mutex);
                if (disk->access == 1)
                        pd_special_command(disk, pd_eject);
-               unlock_kernel();
+               mutex_unlock(&pd_mutex);
                return 0;
        default:
                return -EINVAL;
 {
        struct pd_unit *disk = p->private_data;
 
-       lock_kernel();
+       mutex_lock(&pd_mutex);
        if (!--disk->access && disk->removable)
                pd_special_command(disk, pd_door_unlock);
-       unlock_kernel();
+       mutex_unlock(&pd_mutex);
 
        return 0;
 }
 
 #include <linux/spinlock.h>
 #include <linux/blkdev.h>
 #include <linux/blkpg.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <asm/uaccess.h>
 
+static DEFINE_MUTEX(pf_mutex);
 static DEFINE_SPINLOCK(pf_spin_lock);
 
 module_param(verbose, bool, 0644);
        struct pf_unit *pf = bdev->bd_disk->private_data;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&pf_mutex);
        pf_identify(pf);
 
        ret = -ENODEV;
        if (pf->removable)
                pf_lock(pf, 1);
 out:
-       unlock_kernel();
+       mutex_unlock(&pf_mutex);
        return ret;
 }
 
 
        if (pf->access != 1)
                return -EBUSY;
-       lock_kernel();
+       mutex_lock(&pf_mutex);
        pf_eject(pf);
-       unlock_kernel();
+       mutex_unlock(&pf_mutex);
 
        return 0;
 }
 {
        struct pf_unit *pf = disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&pf_mutex);
        if (pf->access <= 0) {
-               unlock_kernel();
+               mutex_unlock(&pf_mutex);
                return -EINVAL;
        }
 
        if (!pf->access && pf->removable)
                pf_lock(pf, 0);
 
-       unlock_kernel();
+       mutex_unlock(&pf_mutex);
        return 0;
 
 }
 
 #include <linux/seq_file.h>
 #include <linux/miscdevice.h>
 #include <linux/freezer.h>
-#include <linux/smp_lock.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <scsi/scsi_cmnd.h>
 
 #define ZONE(sector, pd) (((sector) + (pd)->offset) & ~((pd)->settings.size - 1))
 
+static DEFINE_MUTEX(pktcdvd_mutex);
 static struct pktcdvd_device *pkt_devs[MAX_WRITERS];
 static struct proc_dir_entry *pkt_proc;
 static int pktdev_major;
 
        VPRINTK(DRIVER_NAME": entering open\n");
 
-       lock_kernel();
+       mutex_lock(&pktcdvd_mutex);
        mutex_lock(&ctl_mutex);
        pd = pkt_find_dev_from_minor(MINOR(bdev->bd_dev));
        if (!pd) {
        }
 
        mutex_unlock(&ctl_mutex);
-       unlock_kernel();
+       mutex_unlock(&pktcdvd_mutex);
        return 0;
 
 out_dec:
 out:
        VPRINTK(DRIVER_NAME": failed open (%d)\n", ret);
        mutex_unlock(&ctl_mutex);
-       unlock_kernel();
+       mutex_unlock(&pktcdvd_mutex);
        return ret;
 }
 
        struct pktcdvd_device *pd = disk->private_data;
        int ret = 0;
 
-       lock_kernel();
+       mutex_lock(&pktcdvd_mutex);
        mutex_lock(&ctl_mutex);
        pd->refcnt--;
        BUG_ON(pd->refcnt < 0);
                pkt_release_dev(pd, flush);
        }
        mutex_unlock(&ctl_mutex);
-       unlock_kernel();
+       mutex_unlock(&pktcdvd_mutex);
        return ret;
 }
 
        VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd,
                MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev));
 
-       lock_kernel();
+       mutex_lock(&pktcdvd_mutex);
        switch (cmd) {
        case CDROMEJECT:
                /*
                VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd);
                ret = -ENOTTY;
        }
-       unlock_kernel();
+       mutex_unlock(&pktcdvd_mutex);
 
        return ret;
 }
 
 #include <linux/fd.h>
 #include <linux/slab.h>
 #include <linux/blkdev.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/hdreg.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
 extern int swim_read_sector_data(struct swim __iomem *base,
                                 unsigned char *data);
 
+static DEFINE_MUTEX(swim_mutex);
 static inline void set_swim_mode(struct swim __iomem *base, int enable)
 {
        struct iwm __iomem *iwm_base;
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&swim_mutex);
        ret = floppy_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&swim_mutex);
 
        return ret;
 }
        struct floppy_state *fs = disk->private_data;
        struct swim __iomem *base = fs->swd->base;
 
-       lock_kernel();
+       mutex_lock(&swim_mutex);
        if (fs->ref_count < 0)
                fs->ref_count = 0;
        else if (fs->ref_count > 0)
 
        if (fs->ref_count == 0)
                swim_motor(base, OFF);
-       unlock_kernel();
+       mutex_unlock(&swim_mutex);
 
        return 0;
 }
        case FDEJECT:
                if (fs->ref_count != 1)
                        return -EBUSY;
-               lock_kernel();
+               mutex_lock(&swim_mutex);
                err = floppy_eject(fs);
-               unlock_kernel();
+               mutex_unlock(&swim_mutex);
                return err;
 
        case FDGETPRM:
 
 #include <linux/ioctl.h>
 #include <linux/blkdev.h>
 #include <linux/interrupt.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <asm/io.h>
 #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;
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&swim3_mutex);
        ret = floppy_locked_ioctl(bdev, mode, cmd, param);
-       unlock_kernel();
+       mutex_unlock(&swim3_mutex);
 
        return ret;
 }
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&swim3_mutex);
        ret = floppy_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&swim3_mutex);
 
        return ret;
 }
 {
        struct floppy_state *fs = disk->private_data;
        struct swim3 __iomem *sw = fs->swim3;
-       lock_kernel();
+       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);
        }
-       unlock_kernel();
+       mutex_unlock(&swim3_mutex);
        return 0;
 }
 
 
 #include <linux/timer.h>
 #include <linux/scatterlist.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <scsi/scsi.h>
 
 #define DRV_NAME "ub"
        spinlock_t lock;
 };
 
+static DEFINE_MUTEX(ub_mutex);
 static inline void ub_init_completion(struct ub_completion *x)
 {
        x->done = 0;
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ub_mutex);
        ret = ub_bd_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&ub_mutex);
 
        return ret;
 }
        struct ub_lun *lun = disk->private_data;
        struct ub_dev *sc = lun->udev;
 
-       lock_kernel();
+       mutex_lock(&ub_mutex);
        ub_put(sc);
-       unlock_kernel();
+       mutex_unlock(&ub_mutex);
 
        return 0;
 }
        void __user *usermem = (void __user *) arg;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ub_mutex);
        ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem);
-       unlock_kernel();
+       mutex_unlock(&ub_mutex);
 
        return ret;
 }
 
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/string.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/dma-mapping.h>
 #include <linux/completion.h>
 #include <linux/device.h>
        MAX_DISK_NAME = FIELD_SIZEOF(struct gendisk, disk_name)
 };
 
+static DEFINE_MUTEX(viodasd_mutex);
 static DEFINE_SPINLOCK(viodasd_spinlock);
 
 #define VIOMAXREQ              16
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&viodasd_mutex);
        ret = viodasd_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&viodasd_mutex);
 
        return ret;
 }
        struct viodasd_device *d = disk->private_data;
        HvLpEvent_Rc hvrc;
 
-       lock_kernel();
+       mutex_lock(&viodasd_mutex);
        /* Send the event to OS/400.  We DON'T expect a response */
        hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
                        HvLpEvent_Type_VirtualIo,
        if (hvrc != 0)
                pr_warning("HV close call failed %d\n", (int)hvrc);
 
-       unlock_kernel();
+       mutex_unlock(&viodasd_mutex);
 
        return 0;
 }
 
 #include <linux/init.h>
 #include <linux/wait.h>
 #include <linux/blkdev.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/blkpg.h>
 #include <linux/delay.h>
 #include <linux/io.h>
 
 #include "xd.h"
 
+static DEFINE_MUTEX(xd_mutex);
 static void __init do_xd_setup (int *integers);
 #ifdef MODULE
 static int xd[5] = { -1,-1,-1,-1, };
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&xd_mutex);
        ret = xd_locked_ioctl(bdev, mode, cmd, param);
-       unlock_kernel();
+       mutex_unlock(&xd_mutex);
 
        return ret;
 }
 
 #include <linux/cdrom.h>
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/scatterlist.h>
 
 #include <xen/xen.h>
        unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 };
 
+static DEFINE_MUTEX(blkfront_mutex);
 static const struct block_device_operations xlvbd_block_fops;
 
 #define BLK_RING_SIZE __RING_SIZE((struct blkif_sring *)0, PAGE_SIZE)
        struct blkfront_info *info;
        int err = 0;
 
-       lock_kernel();
+       mutex_lock(&blkfront_mutex);
 
        info = disk->private_data;
        if (!info) {
        mutex_unlock(&info->mutex);
 
 out:
-       unlock_kernel();
+       mutex_unlock(&blkfront_mutex);
        return err;
 }
 
        struct block_device *bdev;
        struct xenbus_device *xbdev;
 
-       lock_kernel();
+       mutex_lock(&blkfront_mutex);
 
        bdev = bdget_disk(disk, 0);
        bdput(bdev);
        }
 
 out:
-       unlock_kernel();
+       mutex_unlock(&blkfront_mutex);
        return 0;
 }
 
 
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/blkdev.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/ata.h>
 #include <linux/hdreg.h>
 #include <linux/platform_device.h>
        u16 cf_id[ATA_ID_WORDS];
 };
 
+static DEFINE_MUTEX(xsysace_mutex);
 static int ace_major;
 
 /* ---------------------------------------------------------------------
 
        dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1);
 
-       lock_kernel();
+       mutex_lock(&xsysace_mutex);
        spin_lock_irqsave(&ace->lock, flags);
        ace->users++;
        spin_unlock_irqrestore(&ace->lock, flags);
 
        check_disk_change(bdev);
-       unlock_kernel();
+       mutex_unlock(&xsysace_mutex);
 
        return 0;
 }
 
        dev_dbg(ace->dev, "ace_release() users=%i\n", ace->users - 1);
 
-       lock_kernel();
+       mutex_lock(&xsysace_mutex);
        spin_lock_irqsave(&ace->lock, flags);
        ace->users--;
        if (ace->users == 0) {
                ace_out(ace, ACE_CTRL, val & ~ACE_CTRL_LOCKREQ);
        }
        spin_unlock_irqrestore(&ace->lock, flags);
-       unlock_kernel();
+       mutex_unlock(&xsysace_mutex);
        return 0;
 }
 
 
 #include <linux/module.h>
 #include <linux/blkdev.h>
 #include <linux/bitops.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/slab.h>
 
 #include <asm/setup.h>
 
 #define Z2RAM_CHUNK1024       ( Z2RAM_CHUNKSIZE >> 10 )
 
+static DEFINE_MUTEX(z2ram_mutex);
 static u_long *z2ram_map    = NULL;
 static u_long z2ram_size    = 0;
 static int z2_count         = 0;
 
     device = MINOR(bdev->bd_dev);
 
-    lock_kernel();
+    mutex_lock(&z2ram_mutex);
     if ( current_device != -1 && current_device != device )
     {
        rc = -EBUSY;
        set_capacity(z2ram_gendisk, z2ram_size >> 9);
     }
 
-    unlock_kernel();
+    mutex_unlock(&z2ram_mutex);
     return 0;
 
 err_out_kfree:
     kfree(z2ram_map);
 err_out:
-    unlock_kernel();
+    mutex_unlock(&z2ram_mutex);
     return rc;
 }
 
 static int
 z2_release(struct gendisk *disk, fmode_t mode)
 {
-    lock_kernel();
+    mutex_lock(&z2ram_mutex);
     if ( current_device == -1 ) {
-       unlock_kernel();
+       mutex_unlock(&z2ram_mutex);
        return 0;
     }
-    unlock_kernel();
+    mutex_unlock(&z2ram_mutex);
     /*
      * FIXME: unmap memory
      */
 
 #include <linux/blkdev.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/wait.h>
 #include <linux/workqueue.h>
 #include <linux/platform_device.h>
 
 #define GDROM_DEFAULT_TIMEOUT  (HZ * 7)
 
+static DEFINE_MUTEX(gdrom_mutex);
 static const struct {
        int sense_key;
        const char * const text;
 static int gdrom_bdops_open(struct block_device *bdev, fmode_t mode)
 {
        int ret;
-       lock_kernel();
+       mutex_lock(&gdrom_mutex);
        ret = cdrom_open(gd.cd_info, bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&gdrom_mutex);
        return ret;
 }
 
 static int gdrom_bdops_release(struct gendisk *disk, fmode_t mode)
 {
-       lock_kernel();
+       mutex_lock(&gdrom_mutex);
        cdrom_release(gd.cd_info, mode);
-       unlock_kernel();
+       mutex_unlock(&gdrom_mutex);
        return 0;
 }
 
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&gdrom_mutex);
        ret = cdrom_ioctl(gd.cd_info, bdev, mode, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&gdrom_mutex);
 
        return ret;
 }
 
 #include <linux/module.h>
 #include <linux/completion.h>
 #include <linux/proc_fs.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/seq_file.h>
 #include <linux/scatterlist.h>
 
  */
 #define VIOCD_MAX_CD   HVMAXARCHITECTEDVIRTUALCDROMS
 
+static DEFINE_MUTEX(viocd_mutex);
 static const struct vio_error_entry viocd_err_table[] = {
        {0x0201, EINVAL, "Invalid Range"},
        {0x0202, EINVAL, "Invalid Token"},
        struct disk_info *di = bdev->bd_disk->private_data;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&viocd_mutex);
        ret = cdrom_open(&di->viocd_info, bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&viocd_mutex);
 
        return ret;
 }
 static int viocd_blk_release(struct gendisk *disk, fmode_t mode)
 {
        struct disk_info *di = disk->private_data;
-       lock_kernel();
+       mutex_lock(&viocd_mutex);
        cdrom_release(&di->viocd_info, mode);
-       unlock_kernel();
+       mutex_unlock(&viocd_mutex);
        return 0;
 }
 
        struct disk_info *di = bdev->bd_disk->private_data;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&viocd_mutex);
        ret = cdrom_ioctl(&di->viocd_info, bdev, mode, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&viocd_mutex);
 
        return ret;
 }
 
 #include <linux/delay.h>
 #include <linux/timer.h>
 #include <linux/seq_file.h>
-#include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/errno.h>
 
 #include "ide-cd.h"
 
+static DEFINE_MUTEX(ide_cd_mutex);
 static DEFINE_MUTEX(idecd_ref_mutex);
 
 static void ide_cd_release(struct device *);
        struct cdrom_info *info;
        int rc = -ENXIO;
 
-       lock_kernel();
+       mutex_lock(&ide_cd_mutex);
        info = ide_cd_get(bdev->bd_disk);
        if (!info)
                goto out;
        if (rc < 0)
                ide_cd_put(info);
 out:
-       unlock_kernel();
+       mutex_unlock(&ide_cd_mutex);
        return rc;
 }
 
 {
        struct cdrom_info *info = ide_drv_g(disk, cdrom_info);
 
-       lock_kernel();
+       mutex_lock(&ide_cd_mutex);
        cdrom_release(&info->devinfo, mode);
 
        ide_cd_put(info);
-       unlock_kernel();
+       mutex_unlock(&ide_cd_mutex);
 
        return 0;
 }
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ide_cd_mutex);
        ret = idecd_locked_ioctl(bdev, mode, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&ide_cd_mutex);
 
        return ret;
 }
 
 #include <linux/kernel.h>
 #include <linux/ide.h>
 #include <linux/hdreg.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 
 #include "ide-disk.h"
 
+static DEFINE_MUTEX(ide_disk_ioctl_mutex);
 static const struct ide_ioctl_devset ide_disk_ioctl_settings[] = {
 { HDIO_GET_ADDRESS,    HDIO_SET_ADDRESS,   &ide_devset_address   },
 { HDIO_GET_MULTCOUNT,  HDIO_SET_MULTCOUNT, &ide_devset_multcount },
 {
        int err;
 
-       lock_kernel();
+       mutex_lock(&ide_disk_ioctl_mutex);
        err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings);
        if (err != -EOPNOTSUPP)
                goto out;
 
        err = generic_ide_ioctl(drive, bdev, cmd, arg);
 out:
-       unlock_kernel();
+       mutex_unlock(&ide_disk_ioctl_mutex);
        return err;
 }
 
 #include <linux/kernel.h>
 #include <linux/ide.h>
 #include <linux/cdrom.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 
 #include <asm/unaligned.h>
 
  * On exit we set nformats to the number of records we've actually initialized.
  */
 
+static DEFINE_MUTEX(ide_floppy_ioctl_mutex);
 static int ide_floppy_get_format_capacities(ide_drive_t *drive,
                                            struct ide_atapi_pc *pc,
                                            int __user *arg)
        void __user *argp = (void __user *)arg;
        int err;
 
-       lock_kernel();
+       mutex_lock(&ide_floppy_ioctl_mutex);
        if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) {
                err = ide_floppy_lockdoor(drive, &pc, arg, cmd);
                goto out;
                err = generic_ide_ioctl(drive, bdev, cmd, arg);
 
 out:
-       unlock_kernel();
+       mutex_unlock(&ide_floppy_ioctl_mutex);
        return err;
 }
 
-#include <linux/smp_lock.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/string.h>
 #define IDE_GD_VERSION "1.18"
 
 /* module parameters */
+static DEFINE_MUTEX(ide_gd_mutex);
 static unsigned long debug_mask;
 module_param(debug_mask, ulong, 0644);
 
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ide_gd_mutex);
        ret = ide_gd_open(bdev, mode);
-       unlock_kernel();
+       mutex_unlock(&ide_gd_mutex);
 
        return ret;
 }
 
        ide_debug_log(IDE_DBG_FUNC, "enter");
 
-       lock_kernel();
+       mutex_lock(&ide_gd_mutex);
        if (idkp->openers == 1)
                drive->disk_ops->flush(drive);
 
        idkp->openers--;
 
        ide_disk_put(idkp);
-       unlock_kernel();
+       mutex_unlock(&ide_gd_mutex);
 
        return 0;
 }
 
 #include <linux/errno.h>
 #include <linux/genhd.h>
 #include <linux/seq_file.h>
-#include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <linux/pci.h>
 #include <linux/ide.h>
-#include <linux/smp_lock.h>
 #include <linux/completion.h>
 #include <linux/bitops.h>
 #include <linux/mutex.h>
        char write_prot;
 } idetape_tape_t;
 
+static DEFINE_MUTEX(ide_tape_mutex);
 static DEFINE_MUTEX(idetape_ref_mutex);
 
 static DEFINE_MUTEX(idetape_chrdev_mutex);
                                unsigned int cmd, unsigned long arg)
 {
        long ret;
-       lock_kernel();
+       mutex_lock(&ide_tape_mutex);
        ret = do_idetape_chrdev_ioctl(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&ide_tape_mutex);
        return ret;
 }
 
 {
        struct ide_tape_obj *tape;
 
-       lock_kernel();
+       mutex_lock(&ide_tape_mutex);
        tape = ide_tape_get(bdev->bd_disk, false, 0);
-       unlock_kernel();
+       mutex_unlock(&ide_tape_mutex);
 
        if (!tape)
                return -ENXIO;
 {
        struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj);
 
-       lock_kernel();
+       mutex_lock(&ide_tape_mutex);
        ide_tape_put(tape);
-       unlock_kernel();
+       mutex_unlock(&ide_tape_mutex);
 
        return 0;
 }
        ide_drive_t *drive = tape->drive;
        int err;
 
-       lock_kernel();
+       mutex_lock(&ide_tape_mutex);
        err = generic_ide_ioctl(drive, bdev, cmd, arg);
        if (err == -EINVAL)
                err = idetape_blkdev_ioctl(drive, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&ide_tape_mutex);
 
        return err;
 }
 
 #include <linux/blkpg.h>
 #include <linux/bio.h>
 #include <linux/buffer_head.h>
-#include <linux/smp_lock.h>
 #include <linux/mempool.h>
 #include <linux/slab.h>
 #include <linux/idr.h>
 #define DM_COOKIE_ENV_VAR_NAME "DM_COOKIE"
 #define DM_COOKIE_LENGTH 24
 
+static DEFINE_MUTEX(dm_mutex);
 static const char *_name = DM_NAME;
 
 static unsigned int major = 0;
 {
        struct mapped_device *md;
 
-       lock_kernel();
+       mutex_lock(&dm_mutex);
        spin_lock(&_minor_lock);
 
        md = bdev->bd_disk->private_data;
 
 out:
        spin_unlock(&_minor_lock);
-       unlock_kernel();
+       mutex_unlock(&dm_mutex);
 
        return md ? 0 : -ENXIO;
 }
 {
        struct mapped_device *md = disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&dm_mutex);
        atomic_dec(&md->open_count);
        dm_put(md);
-       unlock_kernel();
+       mutex_unlock(&dm_mutex);
 
        return 0;
 }
 
 #include <linux/blkdev.h>
 #include <linux/sysctl.h>
 #include <linux/seq_file.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/buffer_head.h> /* for invalidate_bdev */
 #include <linux/poll.h>
 #include <linux/ctype.h>
 #define DEBUG 0
 #define dprintk(x...) ((void)(DEBUG && printk(x)))
 
+static DEFINE_MUTEX(md_mutex);
 
 #ifndef MODULE
 static void autostart_arrays(int part);
        mddev_t *mddev = mddev_find(bdev->bd_dev);
        int err;
 
-       lock_kernel();
+       mutex_lock(&md_mutex);
        if (mddev->gendisk != bdev->bd_disk) {
                /* we are racing with mddev_put which is discarding this
                 * bd_disk.
                /* Wait until bdev->bd_disk is definitely gone */
                flush_scheduled_work();
                /* Then retry the open from the top */
-               unlock_kernel();
+               mutex_unlock(&md_mutex);
                return -ERESTARTSYS;
        }
        BUG_ON(mddev != bdev->bd_disk->private_data);
 
        check_disk_size_change(mddev->gendisk, bdev);
  out:
-       unlock_kernel();
+       mutex_unlock(&md_mutex);
        return err;
 }
 
        mddev_t *mddev = disk->private_data;
 
        BUG_ON(!mddev);
-       lock_kernel();
+       mutex_lock(&md_mutex);
        atomic_dec(&mddev->openers);
        mddev_put(mddev);
-       unlock_kernel();
+       mutex_unlock(&md_mutex);
 
        return 0;
 }
 
 #include <linux/kthread.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.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);
 
        struct mspro_block_data *msb = disk->private_data;
        int rc = -ENXIO;
 
-       lock_kernel();
+       mutex_lock(&mspro_block_mutex);
        mutex_lock(&mspro_block_disk_lock);
 
        if (msb && msb->card) {
        }
 
        mutex_unlock(&mspro_block_disk_lock);
-       unlock_kernel();
+       mutex_unlock(&mspro_block_mutex);
 
        return rc;
 }
 static int mspro_block_bd_release(struct gendisk *disk, fmode_t mode)
 {
        int ret;
-       lock_kernel();
+       mutex_lock(&mspro_block_mutex);
        ret = mspro_block_disk_release(disk);
-       unlock_kernel();
+       mutex_unlock(&mspro_block_mutex);
        return ret;
 }
 
 
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/i2o.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 
 #include <linux/mempool.h>
 
 #define OSM_VERSION    "1.325"
 #define OSM_DESCRIPTION        "I2O Block Device OSM"
 
+static DEFINE_MUTEX(i2o_block_mutex);
 static struct i2o_driver i2o_block_driver;
 
 /* global Block OSM request mempool */
        if (!dev->i2o_dev)
                return -ENODEV;
 
-       lock_kernel();
+       mutex_lock(&i2o_block_mutex);
        if (dev->power > 0x1f)
                i2o_block_device_power(dev, 0x02);
 
        i2o_block_device_lock(dev->i2o_dev, -1);
 
        osm_debug("Ready.\n");
-       unlock_kernel();
+       mutex_unlock(&i2o_block_mutex);
 
        return 0;
 };
        if (!dev->i2o_dev)
                return 0;
 
-       lock_kernel();
+       mutex_lock(&i2o_block_mutex);
        i2o_block_device_flush(dev->i2o_dev);
 
        i2o_block_device_unlock(dev->i2o_dev, -1);
                operation = 0x24;
 
        i2o_block_device_power(dev, operation);
-       unlock_kernel();
+       mutex_unlock(&i2o_block_mutex);
 
        return 0;
 }
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
 
-       lock_kernel();
+       mutex_lock(&i2o_block_mutex);
        switch (cmd) {
        case BLKI2OGRSTRAT:
                ret = put_user(dev->rcache, (int __user *)arg);
                ret = 0;
                break;
        }
-       unlock_kernel();
+       mutex_unlock(&i2o_block_mutex);
 
        return ret;
 };
 
 #include <linux/kdev_t.h>
 #include <linux/blkdev.h>
 #include <linux/mutex.h>
-#include <linux/smp_lock.h>
 #include <linux/scatterlist.h>
 #include <linux/string_helpers.h>
 
 #define MMC_SHIFT      3
 #define MMC_NUM_MINORS (256 >> MMC_SHIFT)
 
+static DEFINE_MUTEX(block_mutex);
 static DECLARE_BITMAP(dev_use, MMC_NUM_MINORS);
 
 /*
        struct mmc_blk_data *md = mmc_blk_get(bdev->bd_disk);
        int ret = -ENXIO;
 
-       lock_kernel();
+       mutex_lock(&block_mutex);
        if (md) {
                if (md->usage == 2)
                        check_disk_change(bdev);
                        ret = -EROFS;
                }
        }
-       unlock_kernel();
+       mutex_unlock(&block_mutex);
 
        return ret;
 }
 {
        struct mmc_blk_data *md = disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&block_mutex);
        mmc_blk_put(md);
-       unlock_kernel();
+       mutex_unlock(&block_mutex);
        return 0;
 }
 
 
 #include <linux/blkdev.h>
 #include <linux/blkpg.h>
 #include <linux/spinlock.h>
-#include <linux/smp_lock.h>
 #include <linux/hdreg.h>
 #include <linux/init.h>
 #include <linux/mutex.h>
 
 #include "mtdcore.h"
 
+static DEFINE_MUTEX(mtd_blkdevs_mutex);
 static LIST_HEAD(blktrans_majors);
 static DEFINE_MUTEX(blktrans_ref_mutex);
 
        if (!dev)
                return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/
 
-       lock_kernel();
+       mutex_lock(&mtd_blkdevs_mutex);
        mutex_lock(&dev->lock);
 
        if (!dev->mtd) {
 unlock:
        mutex_unlock(&dev->lock);
        blktrans_dev_put(dev);
-       unlock_kernel();
+       mutex_unlock(&mtd_blkdevs_mutex);
        return ret;
 }
 
        if (!dev)
                return ret;
 
-       lock_kernel();
+       mutex_lock(&mtd_blkdevs_mutex);
        mutex_lock(&dev->lock);
 
        /* Release one reference, we sure its not the last one here*/
 unlock:
        mutex_unlock(&dev->lock);
        blktrans_dev_put(dev);
-       unlock_kernel();
+       mutex_unlock(&mtd_blkdevs_mutex);
        return ret;
 }
 
        if (!dev)
                return ret;
 
-       lock_kernel();
+       mutex_lock(&mtd_blkdevs_mutex);
        mutex_lock(&dev->lock);
 
        if (!dev->mtd)
        }
 unlock:
        mutex_unlock(&dev->lock);
-       unlock_kernel();
+       mutex_unlock(&mtd_blkdevs_mutex);
        blktrans_dev_put(dev);
        return ret;
 }
 
 #include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/blkdev.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/interrupt.h>
 #include <linux/buffer_head.h>
 #include <linux/kernel.h>
 /*
  * file operation structure for tape block frontend
  */
+static DEFINE_MUTEX(tape_block_mutex);
 static int tapeblock_open(struct block_device *, fmode_t);
 static int tapeblock_release(struct gendisk *, fmode_t);
 static int tapeblock_medium_changed(struct gendisk *);
        struct tape_device *    device;
        int                     rc;
 
-       lock_kernel();
+       mutex_lock(&tape_block_mutex);
        device = tape_get_device(disk->private_data);
 
        if (device->required_tapemarks) {
         *       is called.
         */
        tape_state_set(device, TS_BLKUSE);
-       unlock_kernel();
+       mutex_unlock(&tape_block_mutex);
        return 0;
 
 release:
        tape_release(device);
  put_device:
        tape_put_device(device);
-       unlock_kernel();
+       mutex_unlock(&tape_block_mutex);
        return rc;
 }
 
 {
        struct tape_device *device = disk->private_data;
  
-       lock_kernel();
+       mutex_lock(&tape_block_mutex);
        tape_state_set(device, TS_IN_USE);
        tape_release(device);
        tape_put_device(device);
-       unlock_kernel();
+       mutex_unlock(&tape_block_mutex);
 
        return 0;
 }
 
 #include <linux/init.h>
 #include <linux/blkdev.h>
 #include <linux/mutex.h>
-#include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <asm/uaccess.h>
 
         CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
         CDC_MRW|CDC_MRW_W|CDC_RAM)
 
+static DEFINE_MUTEX(sr_mutex);
 static int sr_probe(struct device *);
 static int sr_remove(struct device *);
 static int sr_done(struct scsi_cmnd *);
        struct scsi_cd *cd;
        int ret = -ENXIO;
 
-       lock_kernel();
+       mutex_lock(&sr_mutex);
        cd = scsi_cd_get(bdev->bd_disk);
        if (cd) {
                ret = cdrom_open(&cd->cdi, bdev, mode);
                if (ret)
                        scsi_cd_put(cd);
        }
-       unlock_kernel();
+       mutex_unlock(&sr_mutex);
        return ret;
 }
 
 static int sr_block_release(struct gendisk *disk, fmode_t mode)
 {
        struct scsi_cd *cd = scsi_cd(disk);
-       lock_kernel();
+       mutex_lock(&sr_mutex);
        cdrom_release(&cd->cdi, mode);
        scsi_cd_put(cd);
-       unlock_kernel();
+       mutex_unlock(&sr_mutex);
        return 0;
 }
 
        void __user *argp = (void __user *)arg;
        int ret;
 
-       lock_kernel();
+       mutex_lock(&sr_mutex);
 
        /*
         * Send SCSI addressing ioctls directly to mid level, send other
        ret = scsi_ioctl(sdev, cmd, argp);
 
 out:
-       unlock_kernel();
+       mutex_unlock(&sr_mutex);
        return ret;
 }
 
 
 #include <linux/cdev.h>
 #include <linux/delay.h>
 #include <linux/mutex.h>
-#include <linux/smp_lock.h>
 
 #include <asm/uaccess.h>
 #include <asm/dma.h>
 #include "st_options.h"
 #include "st.h"
 
+static DEFINE_MUTEX(st_mutex);
 static int buffer_kbs;
 static int max_sg_segs;
 static int try_direct_io = TRY_DIRECT_IO;
        int dev = TAPE_NR(inode);
        char *name;
 
-       lock_kernel();
+       mutex_lock(&st_mutex);
        /*
         * We really want to do nonseekable_open(inode, filp); here, but some
         * versions of tar incorrectly call lseek on tapes and bail out if that
        filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
 
        if (!(STp = scsi_tape_get(dev))) {
-               unlock_kernel();
+               mutex_unlock(&st_mutex);
                return -ENXIO;
        }
 
        if (STp->in_use) {
                write_unlock(&st_dev_arr_lock);
                scsi_tape_put(STp);
-               unlock_kernel();
+               mutex_unlock(&st_mutex);
                DEB( printk(ST_DEB_MSG "%s: Device already in use.\n", name); )
                return (-EBUSY);
        }
                        retval = (-EIO);
                goto err_out;
        }
-       unlock_kernel();
+       mutex_unlock(&st_mutex);
        return 0;
 
  err_out:
        normalize_buffer(STp->buffer);
        STp->in_use = 0;
        scsi_tape_put(STp);
-       unlock_kernel();
+       mutex_unlock(&st_mutex);
        return retval;
 
 }
 
 #include <linux/major.h>
 #include <linux/delay.h>
 #include <linux/hdreg.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/slab.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
 };
 
 /* Static decl */
+static DEFINE_MUTEX(blkvsc_mutex);
 static int blkvsc_probe(struct device *dev);
 static int blkvsc_remove(struct device *device);
 static void blkvsc_shutdown(struct device *device);
        DPRINT_DBG(BLKVSC_DRV, "- users %d disk %s\n", blkdev->users,
                   blkdev->gd->disk_name);
 
-       lock_kernel();
+       mutex_lock(&blkvsc_mutex);
        spin_lock(&blkdev->lock);
 
        if (!blkdev->users && blkdev->device_type == DVD_TYPE) {
        blkdev->users++;
 
        spin_unlock(&blkdev->lock);
-       unlock_kernel();
+       mutex_unlock(&blkvsc_mutex);
        return 0;
 }
 
        DPRINT_DBG(BLKVSC_DRV, "- users %d disk %s\n", blkdev->users,
                   blkdev->gd->disk_name);
 
-       lock_kernel();
+       mutex_lock(&blkvsc_mutex);
        spin_lock(&blkdev->lock);
        if (blkdev->users == 1) {
                spin_unlock(&blkdev->lock);
        blkdev->users--;
 
        spin_unlock(&blkdev->lock);
-       unlock_kernel();
+       mutex_unlock(&blkvsc_mutex);
        return 0;
 }
 
 
 #include <linux/kthread.h>
 #include <linux/log2.h>
 #include <linux/init.h>
-#include <linux/smp_lock.h>
 #include <linux/slab.h>
 
 /**** Helper functions used for Div, Remainder operation on u64 ****/
        return -ENOTTY;
 }
 
+static DEFINE_MUTEX(ffsport_mutex);
+
 int GLOB_SBD_unlocked_ioctl(struct block_device *bdev, fmode_t mode,
                unsigned int cmd, unsigned long arg)
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ffsport_mutex);
        ret = GLOB_SBD_ioctl(bdev, mode, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&ffsport_mutex);
 
        return ret;
 }