block: make blkdev_get/put() handle exclusive access
[pandora-kernel.git] / drivers / block / pktcdvd.c
index 19b3568..77d70ee 100644 (file)
@@ -2296,15 +2296,12 @@ static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write)
         * so bdget() can't fail.
         */
        bdget(pd->bdev->bd_dev);
-       if ((ret = blkdev_get(pd->bdev, FMODE_READ)))
+       if ((ret = blkdev_get(pd->bdev, FMODE_READ | FMODE_EXCL, pd)))
                goto out;
 
-       if ((ret = bd_claim(pd->bdev, pd)))
-               goto out_putdev;
-
        if ((ret = pkt_get_last_written(pd, &lba))) {
                printk(DRIVER_NAME": pkt_get_last_written failed\n");
-               goto out_unclaim;
+               goto out_putdev;
        }
 
        set_capacity(pd->disk, lba << 2);
@@ -2314,7 +2311,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write)
        q = bdev_get_queue(pd->bdev);
        if (write) {
                if ((ret = pkt_open_write(pd)))
-                       goto out_unclaim;
+                       goto out_putdev;
                /*
                 * Some CDRW drives can not handle writes larger than one packet,
                 * even if the size is a multiple of the packet size.
@@ -2329,23 +2326,21 @@ static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write)
        }
 
        if ((ret = pkt_set_segment_merging(pd, q)))
-               goto out_unclaim;
+               goto out_putdev;
 
        if (write) {
                if (!pkt_grow_pktlist(pd, CONFIG_CDROM_PKTCDVD_BUFFERS)) {
                        printk(DRIVER_NAME": not enough memory for buffers\n");
                        ret = -ENOMEM;
-                       goto out_unclaim;
+                       goto out_putdev;
                }
                printk(DRIVER_NAME": %lukB available on disc\n", lba << 1);
        }
 
        return 0;
 
-out_unclaim:
-       bd_release(pd->bdev);
 out_putdev:
-       blkdev_put(pd->bdev, FMODE_READ);
+       blkdev_put(pd->bdev, FMODE_READ | FMODE_EXCL);
 out:
        return ret;
 }
@@ -2362,8 +2357,7 @@ static void pkt_release_dev(struct pktcdvd_device *pd, int flush)
        pkt_lock_door(pd, 0);
 
        pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
-       bd_release(pd->bdev);
-       blkdev_put(pd->bdev, FMODE_READ);
+       blkdev_put(pd->bdev, FMODE_READ | FMODE_EXCL);
 
        pkt_shrink_pktlist(pd);
 }
@@ -2733,7 +2727,7 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
        bdev = bdget(dev);
        if (!bdev)
                return -ENOMEM;
-       ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY);
+       ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY, NULL);
        if (ret)
                return ret;