Message ID | 20211125232549.3333746-3-shr@fb.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | io_uring: add getdents64 support | expand |
Hi Stefan, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on de5de0813b7dbbb71fb5d677ed823505a0e685c5] url: https://github.com/0day-ci/linux/commits/Stefan-Roesch/io_uring-add-getdents64-support/20211126-072952 base: de5de0813b7dbbb71fb5d677ed823505a0e685c5 config: mips-buildonly-randconfig-r003-20211125 (https://download.01.org/0day-ci/archive/20211126/202111261416.mniOvY08-lkp@intel.com/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 0332d105b9ad7f1f0ffca7e78b71de8b3a48f158) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install mips cross compiling tool for clang build # apt-get install binutils-mips-linux-gnu # https://github.com/0day-ci/linux/commit/018019be0b26997402fe7ba8367e5260ec2aa8c8 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Stefan-Roesch/io_uring-add-getdents64-support/20211126-072952 git checkout 018019be0b26997402fe7ba8367e5260ec2aa8c8 # save the config file to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=mips If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> fs/readdir.c:379:5: warning: no previous prototype for function 'vfs_getdents' [-Wmissing-prototypes] int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, ^ fs/readdir.c:379:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, ^ static 1 warning generated. vim +/vfs_getdents +379 fs/readdir.c 370 371 /** 372 * vfs_getdents - getdents without fdget 373 * @file : pointer to file struct of directory 374 * @dirent : pointer to user directory structure 375 * @count : size of buffer 376 * @ctx_pos : if file pos is used, pass -1, 377 * if ctx pos is used, pass ctx pos 378 */ > 379 int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, 380 unsigned int count, s64 ctx_pos) 381 { 382 struct getdents_callback64 buf = { 383 .ctx.actor = filldir64, 384 .ctx.pos = ctx_pos, 385 .count = count, 386 .current_dir = dirent 387 }; 388 int error; 389 390 error = do_iterate_dir(file, &buf.ctx, ctx_pos < 0); 391 if (error >= 0) 392 error = buf.error; 393 if (buf.prev_reclen) { 394 struct linux_dirent64 __user * lastdirent; 395 typeof(lastdirent->d_off) d_off = buf.ctx.pos; 396 397 lastdirent = (void __user *) buf.current_dir - buf.prev_reclen; 398 if (put_user(d_off, &lastdirent->d_off)) 399 error = -EFAULT; 400 else 401 error = count - buf.count; 402 } 403 404 return error; 405 } 406 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Stefan, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on de5de0813b7dbbb71fb5d677ed823505a0e685c5] url: https://github.com/0day-ci/linux/commits/Stefan-Roesch/io_uring-add-getdents64-support/20211126-072952 base: de5de0813b7dbbb71fb5d677ed823505a0e685c5 config: um-i386_defconfig (https://download.01.org/0day-ci/archive/20211126/202111261631.wvcMUeXO-lkp@intel.com/config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce (this is a W=1 build): # https://github.com/0day-ci/linux/commit/018019be0b26997402fe7ba8367e5260ec2aa8c8 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Stefan-Roesch/io_uring-add-getdents64-support/20211126-072952 git checkout 018019be0b26997402fe7ba8367e5260ec2aa8c8 # save the config file to linux build tree make W=1 ARCH=um SUBARCH=i386 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> fs/readdir.c:379:5: warning: no previous prototype for 'vfs_getdents' [-Wmissing-prototypes] 379 | int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, | ^~~~~~~~~~~~ vim +/vfs_getdents +379 fs/readdir.c 370 371 /** 372 * vfs_getdents - getdents without fdget 373 * @file : pointer to file struct of directory 374 * @dirent : pointer to user directory structure 375 * @count : size of buffer 376 * @ctx_pos : if file pos is used, pass -1, 377 * if ctx pos is used, pass ctx pos 378 */ > 379 int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, 380 unsigned int count, s64 ctx_pos) 381 { 382 struct getdents_callback64 buf = { 383 .ctx.actor = filldir64, 384 .ctx.pos = ctx_pos, 385 .count = count, 386 .current_dir = dirent 387 }; 388 int error; 389 390 error = do_iterate_dir(file, &buf.ctx, ctx_pos < 0); 391 if (error >= 0) 392 error = buf.error; 393 if (buf.prev_reclen) { 394 struct linux_dirent64 __user * lastdirent; 395 typeof(lastdirent->d_off) d_off = buf.ctx.pos; 396 397 lastdirent = (void __user *) buf.current_dir - buf.prev_reclen; 398 if (put_user(d_off, &lastdirent->d_off)) 399 error = -EFAULT; 400 else 401 error = count - buf.count; 402 } 403 404 return error; 405 } 406 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/fs/internal.h b/fs/internal.h index 7979ff8d168c..355be993b9f1 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -194,3 +194,11 @@ long splice_file_to_pipe(struct file *in, struct pipe_inode_info *opipe, loff_t *offset, size_t len, unsigned int flags); + +/* + * fs/readdir.c + */ +struct linux_dirent64; + +int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, + unsigned int count, s64 pos); diff --git a/fs/readdir.c b/fs/readdir.c index e9c197edf73a..c9ee066cd677 100644 --- a/fs/readdir.c +++ b/fs/readdir.c @@ -368,22 +368,26 @@ static int filldir64(struct dir_context *ctx, const char *name, int namlen, return -EFAULT; } -SYSCALL_DEFINE3(getdents64, unsigned int, fd, - struct linux_dirent64 __user *, dirent, unsigned int, count) +/** + * vfs_getdents - getdents without fdget + * @file : pointer to file struct of directory + * @dirent : pointer to user directory structure + * @count : size of buffer + * @ctx_pos : if file pos is used, pass -1, + * if ctx pos is used, pass ctx pos + */ +int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, + unsigned int count, s64 ctx_pos) { - struct fd f; struct getdents_callback64 buf = { .ctx.actor = filldir64, + .ctx.pos = ctx_pos, .count = count, .current_dir = dirent }; int error; - f = fdget_pos(fd); - if (!f.file) - return -EBADF; - - error = iterate_dir(f.file, &buf.ctx); + error = do_iterate_dir(file, &buf.ctx, ctx_pos < 0); if (error >= 0) error = buf.error; if (buf.prev_reclen) { @@ -396,6 +400,22 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd, else error = count - buf.count; } + + return error; +} + +SYSCALL_DEFINE3(getdents64, unsigned int, fd, + struct linux_dirent64 __user *, dirent, unsigned int, count) +{ + struct fd f; + int error; + + f = fdget_pos(fd); + if (!f.file) + return -EBADF; + + error = vfs_getdents(f.file, dirent, count, -1); + fdput_pos(f); return error; }
This splits off the vfs_getdents function from the getdents64 system call. This allows io_uring to call the function. Signed-off-by: Stefan Roesch <shr@fb.com> --- fs/internal.h | 8 ++++++++ fs/readdir.c | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 8 deletions(-)