]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/ioctl.c
intel_th: pci: Add Elkhart Lake CPU support
[linux.git] / fs / ioctl.c
index 7c9a5df5a5977b156939f46959d0b65a37ee3c17..282d45be6f453b0ad4ff084d00bc80864157dd25 100644 (file)
@@ -54,19 +54,32 @@ EXPORT_SYMBOL(vfs_ioctl);
 
 static int ioctl_fibmap(struct file *filp, int __user *p)
 {
-       struct address_space *mapping = filp->f_mapping;
-       int res, block;
+       struct inode *inode = file_inode(filp);
+       int error, ur_block;
+       sector_t block;
 
-       /* do we support this mess? */
-       if (!mapping->a_ops->bmap)
-               return -EINVAL;
        if (!capable(CAP_SYS_RAWIO))
                return -EPERM;
-       res = get_user(block, p);
-       if (res)
-               return res;
-       res = mapping->a_ops->bmap(mapping, block);
-       return put_user(res, p);
+
+       error = get_user(ur_block, p);
+       if (error)
+               return error;
+
+       if (ur_block < 0)
+               return -EINVAL;
+
+       block = ur_block;
+       error = bmap(inode, &block);
+
+       if (error)
+               ur_block = 0;
+       else
+               ur_block = block;
+
+       if (put_user(ur_block, p))
+               error = -EFAULT;
+
+       return error;
 }
 
 /**
@@ -523,13 +536,9 @@ static int compat_ioctl_preallocate(struct file *file, int mode,
 
 static int file_ioctl(struct file *filp, unsigned int cmd, int __user *p)
 {
-       struct inode *inode = file_inode(filp);
-
        switch (cmd) {
        case FIBMAP:
                return ioctl_fibmap(filp, p);
-       case FIONREAD:
-               return put_user(i_size_read(inode) - filp->f_pos, p);
        case FS_IOC_RESVSP:
        case FS_IOC_RESVSP64:
                return ioctl_preallocate(filp, 0, p);
@@ -721,6 +730,13 @@ static int do_vfs_ioctl(struct file *filp, unsigned int fd,
        case FIDEDUPERANGE:
                return ioctl_file_dedupe_range(filp, argp);
 
+       case FIONREAD:
+               if (!S_ISREG(inode->i_mode))
+                       return vfs_ioctl(filp, cmd, arg);
+
+               return put_user(i_size_read(inode) - filp->f_pos,
+                               (int __user *)argp);
+
        default:
                if (S_ISREG(inode->i_mode))
                        return file_ioctl(filp, cmd, argp);