diff options
Diffstat (limited to 'fs/incfs/pseudo_files.c')
-rw-r--r-- | fs/incfs/pseudo_files.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/fs/incfs/pseudo_files.c b/fs/incfs/pseudo_files.c index be5e2b91fec6..8c3980f83703 100644 --- a/fs/incfs/pseudo_files.c +++ b/fs/incfs/pseudo_files.c @@ -993,6 +993,28 @@ out: return error; } +static long ioctl_get_last_read_error(struct mount_info *mi, void __user *arg) +{ + struct incfs_get_last_read_error_args __user *args_usr_ptr = arg; + struct incfs_get_last_read_error_args args = {}; + int error; + + error = mutex_lock_interruptible(&mi->mi_le_mutex); + if (error) + return error; + + args.file_id_out = mi->mi_le_file_id; + args.time_us_out = mi->mi_le_time_us; + args.page_out = mi->mi_le_page; + args.errno_out = mi->mi_le_errno; + + mutex_unlock(&mi->mi_le_mutex); + if (copy_to_user(args_usr_ptr, &args, sizeof(args)) > 0) + error = -EFAULT; + + return error; +} + static long pending_reads_dispatch_ioctl(struct file *f, unsigned int req, unsigned long arg) { @@ -1009,6 +1031,8 @@ static long pending_reads_dispatch_ioctl(struct file *f, unsigned int req, return ioctl_get_read_timeouts(mi, (void __user *)arg); case INCFS_IOC_SET_READ_TIMEOUTS: return ioctl_set_read_timeouts(mi, (void __user *)arg); + case INCFS_IOC_GET_LAST_READ_ERROR: + return ioctl_get_last_read_error(mi, (void __user *)arg); default: return -EINVAL; } |