]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/block/xen-blkfront.c
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel...
[karo-tx-linux.git] / drivers / block / xen-blkfront.c
index f2ffc46644df11fdcd02b4b9ca3749105a07d5b1..4b33a18c32e0c91959442deab466741b7e245ddf 100644 (file)
@@ -41,7 +41,7 @@
 #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>
@@ -69,6 +69,7 @@ struct blk_shadow {
        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)
@@ -1067,8 +1068,15 @@ static void blkfront_connect(struct blkfront_info *info)
         * If there are barriers, then we use flush.
         */
        info->feature_flush = 0;
+
+       /*
+        * The driver doesn't properly handled empty flushes, so
+        * lets disable barrier support for now.
+        */
+#if 0
        if (!err && barrier)
                info->feature_flush = REQ_FLUSH;
+#endif
 
        err = xlvbd_alloc_gendisk(sectors, info, binfo, sector_size);
        if (err) {
@@ -1180,7 +1188,7 @@ static int blkif_open(struct block_device *bdev, fmode_t mode)
        struct blkfront_info *info;
        int err = 0;
 
-       lock_kernel();
+       mutex_lock(&blkfront_mutex);
 
        info = disk->private_data;
        if (!info) {
@@ -1198,7 +1206,7 @@ static int blkif_open(struct block_device *bdev, fmode_t mode)
        mutex_unlock(&info->mutex);
 
 out:
-       unlock_kernel();
+       mutex_unlock(&blkfront_mutex);
        return err;
 }
 
@@ -1208,7 +1216,7 @@ static int blkif_release(struct gendisk *disk, fmode_t mode)
        struct block_device *bdev;
        struct xenbus_device *xbdev;
 
-       lock_kernel();
+       mutex_lock(&blkfront_mutex);
 
        bdev = bdget_disk(disk, 0);
        bdput(bdev);
@@ -1242,7 +1250,7 @@ static int blkif_release(struct gendisk *disk, fmode_t mode)
        }
 
 out:
-       unlock_kernel();
+       mutex_unlock(&blkfront_mutex);
        return 0;
 }