]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - block/ioctl.c
fat: Cleanup msdos_lookup()
[linux-2.6-omap-h63xx.git] / block / ioctl.c
index bd214cb37f2b892bff799207d269a33a5762fb27..c832d639b6e254eb375d9c69504172182ab14c4d 100644 (file)
@@ -230,20 +230,13 @@ EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl);
  * always keep this in sync with compat_blkdev_ioctl() and
  * compat_blkdev_locked_ioctl()
  */
-int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
+int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
                        unsigned long arg)
 {
-       struct block_device *bdev = inode->i_bdev;
        struct gendisk *disk = bdev->bd_disk;
        struct backing_dev_info *bdi;
        loff_t size;
        int ret, n;
-       fmode_t mode = 0;
-       if (file) {
-               mode = file->f_mode;
-               if (file->f_flags & O_NDELAY)
-                       mode |= FMODE_NDELAY_NOW;
-       }
 
        switch(cmd) {
        case BLKFLSBUF:
@@ -343,10 +336,11 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
                        return -EINVAL;
                if (get_user(n, (int __user *) arg))
                        return -EFAULT;
-               if (bd_claim(bdev, file) < 0)
+               if (!(mode & FMODE_EXCL) && bd_claim(bdev, &bdev) < 0)
                        return -EBUSY;
                ret = set_blocksize(bdev, n);
-               bd_release(bdev);
+               if (!(mode & FMODE_EXCL))
+                       bd_release(bdev);
                return ret;
        case BLKPG:
                lock_kernel();