BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Amir Goldstein tree: https://github.com/amir73il/linux sb_write_barrier head: 8d20f02c9b77b14aa0a4221c38a9d9e1ee282612 commit: 4e3fa2e567acf8f672bc009cb106a529073a0903 [21/28] vfs: prepare for pre-modify permission events on aio write :::::: branch date: 30 hours ago :::::: commit date: 30 hours ago config: x86_64-randconfig-m001 compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot | Reported-by: Dan Carpenter smatch warnings: io_uring/rw.c:975 io_write() error: uninitialized symbol 'idx'. vim +/idx +975 io_uring/rw.c f3b44f92e59a80 Jens Axboe 2022-06-13 843 f3b44f92e59a80 Jens Axboe 2022-06-13 844 int io_write(struct io_kiocb *req, unsigned int issue_flags) f3b44f92e59a80 Jens Axboe 2022-06-13 845 { f2ccb5aed7bce1 Stefan Metzmacher 2022-08-11 846 struct io_rw *rw = io_kiocb_to_cmd(req, struct io_rw); f3b44f92e59a80 Jens Axboe 2022-06-13 847 struct io_rw_state __s, *s = &__s; f3b44f92e59a80 Jens Axboe 2022-06-13 848 struct iovec *iovec; f3b44f92e59a80 Jens Axboe 2022-06-13 849 struct kiocb *kiocb = &rw->kiocb; f3b44f92e59a80 Jens Axboe 2022-06-13 850 bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK; f3b44f92e59a80 Jens Axboe 2022-06-13 851 ssize_t ret, ret2; f3b44f92e59a80 Jens Axboe 2022-06-13 852 loff_t *ppos; 4e3fa2e567acf8 Amir Goldstein 2022-11-22 853 int idx; f3b44f92e59a80 Jens Axboe 2022-06-13 854 f3b44f92e59a80 Jens Axboe 2022-06-13 855 if (!req_has_async_data(req)) { f3b44f92e59a80 Jens Axboe 2022-06-13 856 ret = io_import_iovec(WRITE, req, &iovec, s, issue_flags); f3b44f92e59a80 Jens Axboe 2022-06-13 857 if (unlikely(ret < 0)) f3b44f92e59a80 Jens Axboe 2022-06-13 858 return ret; f3b44f92e59a80 Jens Axboe 2022-06-13 859 } else { f3b44f92e59a80 Jens Axboe 2022-06-13 860 struct io_async_rw *io = req->async_data; f3b44f92e59a80 Jens Axboe 2022-06-13 861 f3b44f92e59a80 Jens Axboe 2022-06-13 862 s = &io->s; f3b44f92e59a80 Jens Axboe 2022-06-13 863 iov_iter_restore(&s->iter, &s->iter_state); f3b44f92e59a80 Jens Axboe 2022-06-13 864 iovec = NULL; f3b44f92e59a80 Jens Axboe 2022-06-13 865 } f3b44f92e59a80 Jens Axboe 2022-06-13 866 ret = io_rw_init_file(req, FMODE_WRITE); f3b44f92e59a80 Jens Axboe 2022-06-13 867 if (unlikely(ret)) { f3b44f92e59a80 Jens Axboe 2022-06-13 868 kfree(iovec); f3b44f92e59a80 Jens Axboe 2022-06-13 869 return ret; f3b44f92e59a80 Jens Axboe 2022-06-13 870 } f3b44f92e59a80 Jens Axboe 2022-06-13 871 req->cqe.res = iov_iter_count(&s->iter); f3b44f92e59a80 Jens Axboe 2022-06-13 872 f3b44f92e59a80 Jens Axboe 2022-06-13 873 if (force_nonblock) { f3b44f92e59a80 Jens Axboe 2022-06-13 874 /* If the file doesn't support async, just async punt */ f3b44f92e59a80 Jens Axboe 2022-06-13 875 if (unlikely(!io_file_supports_nowait(req))) f3b44f92e59a80 Jens Axboe 2022-06-13 876 goto copy_iov; f3b44f92e59a80 Jens Axboe 2022-06-13 877 4e17aaab54359f Stefan Roesch 2022-06-16 878 /* File path supports NOWAIT for non-direct_IO only for block devices. */ 4e17aaab54359f Stefan Roesch 2022-06-16 879 if (!(kiocb->ki_flags & IOCB_DIRECT) && 4e17aaab54359f Stefan Roesch 2022-06-16 880 !(kiocb->ki_filp->f_mode & FMODE_BUF_WASYNC) && f3b44f92e59a80 Jens Axboe 2022-06-13 881 (req->flags & REQ_F_ISREG)) f3b44f92e59a80 Jens Axboe 2022-06-13 882 goto copy_iov; f3b44f92e59a80 Jens Axboe 2022-06-13 883 f3b44f92e59a80 Jens Axboe 2022-06-13 884 kiocb->ki_flags |= IOCB_NOWAIT; f3b44f92e59a80 Jens Axboe 2022-06-13 885 } else { f3b44f92e59a80 Jens Axboe 2022-06-13 886 /* Ensure we clear previously set non-block flag */ f3b44f92e59a80 Jens Axboe 2022-06-13 887 kiocb->ki_flags &= ~IOCB_NOWAIT; f3b44f92e59a80 Jens Axboe 2022-06-13 888 } f3b44f92e59a80 Jens Axboe 2022-06-13 889 f3b44f92e59a80 Jens Axboe 2022-06-13 890 ppos = io_kiocb_update_pos(req); f3b44f92e59a80 Jens Axboe 2022-06-13 891 f3b44f92e59a80 Jens Axboe 2022-06-13 892 ret = rw_verify_area(WRITE, req->file, ppos, req->cqe.res); df9830d883b914 Pavel Begunkov 2022-06-16 893 if (unlikely(ret)) { df9830d883b914 Pavel Begunkov 2022-06-16 894 kfree(iovec); df9830d883b914 Pavel Begunkov 2022-06-16 895 return ret; df9830d883b914 Pavel Begunkov 2022-06-16 896 } f3b44f92e59a80 Jens Axboe 2022-06-13 897 f3b44f92e59a80 Jens Axboe 2022-06-13 898 /* 4e3fa2e567acf8 Amir Goldstein 2022-11-22 899 * Open-code file_start_write_area() to grab freeze protection, f3b44f92e59a80 Jens Axboe 2022-06-13 900 * which will be released by another thread in f3b44f92e59a80 Jens Axboe 2022-06-13 901 * io_complete_rw(). Fool lockdep by telling it the lock got f3b44f92e59a80 Jens Axboe 2022-06-13 902 * released so that it doesn't complain about the held lock when f3b44f92e59a80 Jens Axboe 2022-06-13 903 * we return to userspace. f3b44f92e59a80 Jens Axboe 2022-06-13 904 */ 4e3fa2e567acf8 Amir Goldstein 2022-11-22 905 idx = __file_start_aio_write_srcu(req->file); 4e3fa2e567acf8 Amir Goldstein 2022-11-22 906 ret = fsnotify_file_perm(req->file, MAY_WRITE, ppos, req->cqe.res); 4e3fa2e567acf8 Amir Goldstein 2022-11-22 907 if (ret) { 4e3fa2e567acf8 Amir Goldstein 2022-11-22 908 __file_end_aio_write_srcu(req->file, idx); 4e3fa2e567acf8 Amir Goldstein 2022-11-22 909 return ret; 4e3fa2e567acf8 Amir Goldstein 2022-11-22 910 } f3b44f92e59a80 Jens Axboe 2022-06-13 911 if (req->flags & REQ_F_ISREG) { f3b44f92e59a80 Jens Axboe 2022-06-13 912 sb_start_write(file_inode(req->file)->i_sb); f3b44f92e59a80 Jens Axboe 2022-06-13 913 __sb_writers_release(file_inode(req->file)->i_sb, f3b44f92e59a80 Jens Axboe 2022-06-13 914 SB_FREEZE_WRITE); f3b44f92e59a80 Jens Axboe 2022-06-13 915 } f3b44f92e59a80 Jens Axboe 2022-06-13 916 kiocb->ki_flags |= IOCB_WRITE; 4e3fa2e567acf8 Amir Goldstein 2022-11-22 917 kiocb->ki_idx = idx; f3b44f92e59a80 Jens Axboe 2022-06-13 918 f3b44f92e59a80 Jens Axboe 2022-06-13 919 if (likely(req->file->f_op->write_iter)) f3b44f92e59a80 Jens Axboe 2022-06-13 920 ret2 = call_write_iter(req->file, kiocb, &s->iter); f3b44f92e59a80 Jens Axboe 2022-06-13 921 else if (req->file->f_op->write) f3b44f92e59a80 Jens Axboe 2022-06-13 922 ret2 = loop_rw_iter(WRITE, rw, &s->iter); f3b44f92e59a80 Jens Axboe 2022-06-13 923 else f3b44f92e59a80 Jens Axboe 2022-06-13 924 ret2 = -EINVAL; f3b44f92e59a80 Jens Axboe 2022-06-13 925 f3b44f92e59a80 Jens Axboe 2022-06-13 926 if (req->flags & REQ_F_REISSUE) { f3b44f92e59a80 Jens Axboe 2022-06-13 927 req->flags &= ~REQ_F_REISSUE; f3b44f92e59a80 Jens Axboe 2022-06-13 928 ret2 = -EAGAIN; f3b44f92e59a80 Jens Axboe 2022-06-13 929 } f3b44f92e59a80 Jens Axboe 2022-06-13 930 f3b44f92e59a80 Jens Axboe 2022-06-13 931 /* f3b44f92e59a80 Jens Axboe 2022-06-13 932 * Raw bdev writes will return -EOPNOTSUPP for IOCB_NOWAIT. Just f3b44f92e59a80 Jens Axboe 2022-06-13 933 * retry them without IOCB_NOWAIT. f3b44f92e59a80 Jens Axboe 2022-06-13 934 */ f3b44f92e59a80 Jens Axboe 2022-06-13 935 if (ret2 == -EOPNOTSUPP && (kiocb->ki_flags & IOCB_NOWAIT)) f3b44f92e59a80 Jens Axboe 2022-06-13 936 ret2 = -EAGAIN; f3b44f92e59a80 Jens Axboe 2022-06-13 937 /* no retry on NONBLOCK nor RWF_NOWAIT */ f3b44f92e59a80 Jens Axboe 2022-06-13 938 if (ret2 == -EAGAIN && (req->flags & REQ_F_NOWAIT)) f3b44f92e59a80 Jens Axboe 2022-06-13 939 goto done; f3b44f92e59a80 Jens Axboe 2022-06-13 940 if (!force_nonblock || ret2 != -EAGAIN) { f3b44f92e59a80 Jens Axboe 2022-06-13 941 /* IOPOLL retry should happen for io-wq threads */ f3b44f92e59a80 Jens Axboe 2022-06-13 942 if (ret2 == -EAGAIN && (req->ctx->flags & IORING_SETUP_IOPOLL)) f3b44f92e59a80 Jens Axboe 2022-06-13 943 goto copy_iov; 4e17aaab54359f Stefan Roesch 2022-06-16 944 4e17aaab54359f Stefan Roesch 2022-06-16 945 if (ret2 != req->cqe.res && ret2 >= 0 && need_complete_io(req)) { c86416c6ff5ba7 Stefan Roesch 2022-10-10 946 struct io_async_rw *io; 4e17aaab54359f Stefan Roesch 2022-06-16 947 1c849b481b3e4f Stefan Roesch 2022-06-16 948 trace_io_uring_short_write(req->ctx, kiocb->ki_pos - ret2, 1c849b481b3e4f Stefan Roesch 2022-06-16 949 req->cqe.res, ret2); 1c849b481b3e4f Stefan Roesch 2022-06-16 950 4e17aaab54359f Stefan Roesch 2022-06-16 951 /* This is a partial write. The file pos has already been 4e17aaab54359f Stefan Roesch 2022-06-16 952 * updated, setup the async struct to complete the request 4e17aaab54359f Stefan Roesch 2022-06-16 953 * in the worker. Also update bytes_done to account for 4e17aaab54359f Stefan Roesch 2022-06-16 954 * the bytes already written. 4e17aaab54359f Stefan Roesch 2022-06-16 955 */ 4e17aaab54359f Stefan Roesch 2022-06-16 956 iov_iter_save_state(&s->iter, &s->iter_state); 4e17aaab54359f Stefan Roesch 2022-06-16 957 ret = io_setup_async_rw(req, iovec, s, true); 4e17aaab54359f Stefan Roesch 2022-06-16 958 c86416c6ff5ba7 Stefan Roesch 2022-10-10 959 io = req->async_data; c86416c6ff5ba7 Stefan Roesch 2022-10-10 960 if (io) c86416c6ff5ba7 Stefan Roesch 2022-10-10 961 io->bytes_done += ret2; 4e17aaab54359f Stefan Roesch 2022-06-16 962 e053aaf4da56cb Jens Axboe 2022-06-24 963 if (kiocb->ki_flags & IOCB_WRITE) 4e3fa2e567acf8 Amir Goldstein 2022-11-22 964 kiocb_end_write(req, idx); 4e17aaab54359f Stefan Roesch 2022-06-16 965 return ret ? ret : -EAGAIN; 4e17aaab54359f Stefan Roesch 2022-06-16 966 } f3b44f92e59a80 Jens Axboe 2022-06-13 967 done: df9830d883b914 Pavel Begunkov 2022-06-16 968 ret = kiocb_done(req, ret2, issue_flags); f3b44f92e59a80 Jens Axboe 2022-06-13 969 } else { f3b44f92e59a80 Jens Axboe 2022-06-13 970 copy_iov: f3b44f92e59a80 Jens Axboe 2022-06-13 971 iov_iter_restore(&s->iter, &s->iter_state); f3b44f92e59a80 Jens Axboe 2022-06-13 972 ret = io_setup_async_rw(req, iovec, s, false); e053aaf4da56cb Jens Axboe 2022-06-24 973 if (!ret) { e053aaf4da56cb Jens Axboe 2022-06-24 974 if (kiocb->ki_flags & IOCB_WRITE) 4e3fa2e567acf8 Amir Goldstein 2022-11-22 @975 kiocb_end_write(req, idx); e053aaf4da56cb Jens Axboe 2022-06-24 976 return -EAGAIN; e053aaf4da56cb Jens Axboe 2022-06-24 977 } e053aaf4da56cb Jens Axboe 2022-06-24 978 return ret; f3b44f92e59a80 Jens Axboe 2022-06-13 979 } f3b44f92e59a80 Jens Axboe 2022-06-13 980 /* it's reportedly faster than delegating the null check to kfree() */ f3b44f92e59a80 Jens Axboe 2022-06-13 981 if (iovec) f3b44f92e59a80 Jens Axboe 2022-06-13 982 kfree(iovec); f3b44f92e59a80 Jens Axboe 2022-06-13 983 return ret; f3b44f92e59a80 Jens Axboe 2022-06-13 984 } f3b44f92e59a80 Jens Axboe 2022-06-13 985 -- 0-DAY CI Kernel Test Service https://01.org/lkp