1414#include <linux/pagemap.h>
1515#include <linux/sched/mm.h>
1616#include <linux/fsnotify.h>
17+ #include <linux/uio.h>
1718
1819#include "kernfs-internal.h"
1920
@@ -180,11 +181,10 @@ static const struct seq_operations kernfs_seq_ops = {
180181 * it difficult to use seq_file. Implement simplistic custom buffering for
181182 * bin files.
182183 */
183- static ssize_t kernfs_file_direct_read (struct kernfs_open_file * of ,
184- char __user * user_buf , size_t count ,
185- loff_t * ppos )
184+ static ssize_t kernfs_file_read_iter (struct kiocb * iocb , struct iov_iter * iter )
186185{
187- ssize_t len = min_t (size_t , count , PAGE_SIZE );
186+ struct kernfs_open_file * of = kernfs_of (iocb -> ki_filp );
187+ ssize_t len = min_t (size_t , iov_iter_count (iter ), PAGE_SIZE );
188188 const struct kernfs_ops * ops ;
189189 char * buf ;
190190
@@ -210,7 +210,7 @@ static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
210210 of -> event = atomic_read (& of -> kn -> attr .open -> event );
211211 ops = kernfs_ops (of -> kn );
212212 if (ops -> read )
213- len = ops -> read (of , buf , len , * ppos );
213+ len = ops -> read (of , buf , len , iocb -> ki_pos );
214214 else
215215 len = - EINVAL ;
216216
@@ -220,12 +220,12 @@ static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
220220 if (len < 0 )
221221 goto out_free ;
222222
223- if (copy_to_user ( user_buf , buf , len ) ) {
223+ if (copy_to_iter ( buf , len , iter ) != len ) {
224224 len = - EFAULT ;
225225 goto out_free ;
226226 }
227227
228- * ppos += len ;
228+ iocb -> ki_pos += len ;
229229
230230 out_free :
231231 if (buf == of -> prealloc_buf )
@@ -235,22 +235,11 @@ static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
235235 return len ;
236236}
237237
238- /**
239- * kernfs_fop_read - kernfs vfs read callback
240- * @file: file pointer
241- * @user_buf: data to write
242- * @count: number of bytes
243- * @ppos: starting offset
244- */
245- static ssize_t kernfs_fop_read (struct file * file , char __user * user_buf ,
246- size_t count , loff_t * ppos )
238+ static ssize_t kernfs_fop_read_iter (struct kiocb * iocb , struct iov_iter * iter )
247239{
248- struct kernfs_open_file * of = kernfs_of (file );
249-
250- if (of -> kn -> flags & KERNFS_HAS_SEQ_SHOW )
251- return seq_read (file , user_buf , count , ppos );
252- else
253- return kernfs_file_direct_read (of , user_buf , count , ppos );
240+ if (kernfs_of (iocb -> ki_filp )-> kn -> flags & KERNFS_HAS_SEQ_SHOW )
241+ return seq_read_iter (iocb , iter );
242+ return kernfs_file_read_iter (iocb , iter );
254243}
255244
256245/**
@@ -960,7 +949,7 @@ void kernfs_notify(struct kernfs_node *kn)
960949EXPORT_SYMBOL_GPL (kernfs_notify );
961950
962951const struct file_operations kernfs_file_fops = {
963- .read = kernfs_fop_read ,
952+ .read_iter = kernfs_fop_read_iter ,
964953 .write = kernfs_fop_write ,
965954 .llseek = generic_file_llseek ,
966955 .mmap = kernfs_fop_mmap ,
0 commit comments