summaryrefslogtreecommitdiff
path: root/fs/incfs/pseudo_files.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/incfs/pseudo_files.c')
-rw-r--r--fs/incfs/pseudo_files.c24
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;
}