block: remove i_bdev
[linux-2.6-microblaze.git] / block / ioctl.c
index 3fbc382..a6d8171 100644 (file)
@@ -35,15 +35,6 @@ static int blkpg_do_ioctl(struct block_device *bdev,
        start = p.start >> SECTOR_SHIFT;
        length = p.length >> SECTOR_SHIFT;
 
-       /* check for fit in a hd_struct */
-       if (sizeof(sector_t) < sizeof(long long)) {
-               long pstart = start, plength = length;
-
-               if (pstart != start || plength != length || pstart < 0 ||
-                   plength < 0 || p.pno > 65535)
-                       return -EINVAL;
-       }
-
        switch (op) {
        case BLKPG_ADD_PARTITION:
                /* check if partition is aligned to blocksize */
@@ -219,23 +210,6 @@ static int compat_put_ulong(compat_ulong_t __user *argp, compat_ulong_t val)
 }
 #endif
 
-int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
-                       unsigned cmd, unsigned long arg)
-{
-       struct gendisk *disk = bdev->bd_disk;
-
-       if (disk->fops->ioctl)
-               return disk->fops->ioctl(bdev, mode, cmd, arg);
-
-       return -ENOTTY;
-}
-/*
- * For the record: _GPL here is only because somebody decided to slap it
- * on the previous export.  Sheer idiocy, since it wasn't copyrightable
- * at all and could be open-coded without any exports by anybody who cares.
- */
-EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl);
-
 #ifdef CONFIG_COMPAT
 /*
  * This is the equivalent of compat_ptr_ioctl(), to be used by block
@@ -346,38 +320,11 @@ static int blkdev_pr_clear(struct block_device *bdev,
        return ops->pr_clear(bdev, c.key);
 }
 
-/*
- * Is it an unrecognized ioctl? The correct returns are either
- * ENOTTY (final) or ENOIOCTLCMD ("I don't know this one, try a
- * fallback"). ENOIOCTLCMD gets turned into ENOTTY by the ioctl
- * code before returning.
- *
- * Confused drivers sometimes return EINVAL, which is wrong. It
- * means "I understood the ioctl command, but the parameters to
- * it were wrong".
- *
- * We should aim to just fix the broken drivers, the EINVAL case
- * should go away.
- */
-static inline int is_unrecognized_ioctl(int ret)
-{
-       return  ret == -EINVAL ||
-               ret == -ENOTTY ||
-               ret == -ENOIOCTLCMD;
-}
-
 static int blkdev_flushbuf(struct block_device *bdev, fmode_t mode,
                unsigned cmd, unsigned long arg)
 {
-       int ret;
-
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
-
-       ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
-       if (!is_unrecognized_ioctl(ret))
-               return ret;
-
        fsync_bdev(bdev);
        invalidate_bdev(bdev);
        return 0;
@@ -391,12 +338,14 @@ static int blkdev_roset(struct block_device *bdev, fmode_t mode,
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
 
-       ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
-       if (!is_unrecognized_ioctl(ret))
-               return ret;
        if (get_user(n, (int __user *)arg))
                return -EFAULT;
-       set_device_ro(bdev, n);
+       if (bdev->bd_disk->fops->set_read_only) {
+               ret = bdev->bd_disk->fops->set_read_only(bdev, n);
+               if (ret)
+                       return ret;
+       }
+       bdev->bd_part->policy = n;
        return 0;
 }
 
@@ -619,10 +568,12 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
        }
 
        ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp);
-       if (ret == -ENOIOCTLCMD)
-               return __blkdev_driver_ioctl(bdev, mode, cmd, arg);
+       if (ret != -ENOIOCTLCMD)
+               return ret;
 
-       return ret;
+       if (!bdev->bd_disk->fops->ioctl)
+               return -ENOTTY;
+       return bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg);
 }
 EXPORT_SYMBOL_GPL(blkdev_ioctl); /* for /dev/raw */
 
@@ -639,8 +590,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
        int ret;
        void __user *argp = compat_ptr(arg);
-       struct inode *inode = file->f_mapping->host;
-       struct block_device *bdev = inode->i_bdev;
+       struct block_device *bdev = I_BDEV(file->f_mapping->host);
        struct gendisk *disk = bdev->bd_disk;
        fmode_t mode = file->f_mode;
        loff_t size;