@@ -3034,57 +3034,56 @@ static int io_read(struct io_kiocb *req, bool force_nonblock,
3034
3034
struct kiocb * kiocb = & req -> rw .kiocb ;
3035
3035
struct iov_iter iter ;
3036
3036
size_t iov_count ;
3037
- ssize_t io_size , ret ;
3037
+ ssize_t io_size , ret , ret2 ;
3038
+ unsigned long nr_segs ;
3038
3039
3039
3040
ret = io_import_iovec (READ , req , & iovec , & iter , !force_nonblock );
3040
3041
if (ret < 0 )
3041
3042
return ret ;
3043
+ io_size = ret ;
3044
+ req -> result = io_size ;
3042
3045
3043
3046
/* Ensure we clear previously set non-block flag */
3044
3047
if (!force_nonblock )
3045
3048
kiocb -> ki_flags &= ~IOCB_NOWAIT ;
3046
3049
3047
- io_size = ret ;
3048
- req -> result = io_size ;
3049
-
3050
3050
/* If the file doesn't support async, just async punt */
3051
3051
if (force_nonblock && !io_file_supports_async (req -> file , READ ))
3052
3052
goto copy_iov ;
3053
3053
3054
3054
iov_count = iov_iter_count (& iter );
3055
+ nr_segs = iter .nr_segs ;
3055
3056
ret = rw_verify_area (READ , req -> file , & kiocb -> ki_pos , iov_count );
3056
- if (!ret ) {
3057
- unsigned long nr_segs = iter .nr_segs ;
3058
- ssize_t ret2 = 0 ;
3057
+ if (unlikely (ret ))
3058
+ goto out_free ;
3059
3059
3060
- ret2 = io_iter_do_read (req , & iter );
3060
+ ret2 = io_iter_do_read (req , & iter );
3061
3061
3062
- /* Catch -EAGAIN return for forced non-blocking submission */
3063
- if (!force_nonblock || (ret2 != - EAGAIN && ret2 != - EIO )) {
3064
- kiocb_done (kiocb , ret2 , cs );
3065
- } else {
3066
- iter .count = iov_count ;
3067
- iter .nr_segs = nr_segs ;
3062
+ /* Catch -EAGAIN return for forced non-blocking submission */
3063
+ if (!force_nonblock || (ret2 != - EAGAIN && ret2 != - EIO )) {
3064
+ kiocb_done (kiocb , ret2 , cs );
3065
+ } else {
3066
+ iter .count = iov_count ;
3067
+ iter .nr_segs = nr_segs ;
3068
3068
copy_iov :
3069
- ret = io_setup_async_rw (req , io_size , iovec ,
3070
- inline_vecs , & iter );
3071
- if (ret )
3069
+ ret = io_setup_async_rw (req , io_size , iovec , inline_vecs ,
3070
+ & iter );
3071
+ if (ret )
3072
+ goto out_free ;
3073
+ /* it's copied and will be cleaned with ->io */
3074
+ iovec = NULL ;
3075
+ /* if we can retry, do so with the callbacks armed */
3076
+ if (io_rw_should_retry (req )) {
3077
+ ret2 = io_iter_do_read (req , & iter );
3078
+ if (ret2 == - EIOCBQUEUED ) {
3079
+ goto out_free ;
3080
+ } else if (ret2 != - EAGAIN ) {
3081
+ kiocb_done (kiocb , ret2 , cs );
3072
3082
goto out_free ;
3073
- /* it's copied and will be cleaned with ->io */
3074
- iovec = NULL ;
3075
- /* if we can retry, do so with the callbacks armed */
3076
- if (io_rw_should_retry (req )) {
3077
- ret2 = io_iter_do_read (req , & iter );
3078
- if (ret2 == - EIOCBQUEUED ) {
3079
- goto out_free ;
3080
- } else if (ret2 != - EAGAIN ) {
3081
- kiocb_done (kiocb , ret2 , cs );
3082
- goto out_free ;
3083
- }
3084
3083
}
3085
- kiocb -> ki_flags &= ~IOCB_WAITQ ;
3086
- return - EAGAIN ;
3087
3084
}
3085
+ kiocb -> ki_flags &= ~IOCB_WAITQ ;
3086
+ return - EAGAIN ;
3088
3087
}
3089
3088
out_free :
3090
3089
if (iovec )
@@ -3117,19 +3116,19 @@ static int io_write(struct io_kiocb *req, bool force_nonblock,
3117
3116
struct kiocb * kiocb = & req -> rw .kiocb ;
3118
3117
struct iov_iter iter ;
3119
3118
size_t iov_count ;
3120
- ssize_t ret , io_size ;
3119
+ ssize_t ret , ret2 , io_size ;
3120
+ unsigned long nr_segs ;
3121
3121
3122
3122
ret = io_import_iovec (WRITE , req , & iovec , & iter , !force_nonblock );
3123
3123
if (ret < 0 )
3124
3124
return ret ;
3125
+ io_size = ret ;
3126
+ req -> result = io_size ;
3125
3127
3126
3128
/* Ensure we clear previously set non-block flag */
3127
3129
if (!force_nonblock )
3128
3130
req -> rw .kiocb .ki_flags &= ~IOCB_NOWAIT ;
3129
3131
3130
- io_size = ret ;
3131
- req -> result = io_size ;
3132
-
3133
3132
/* If the file doesn't support async, just async punt */
3134
3133
if (force_nonblock && !io_file_supports_async (req -> file , WRITE ))
3135
3134
goto copy_iov ;
@@ -3140,51 +3139,50 @@ static int io_write(struct io_kiocb *req, bool force_nonblock,
3140
3139
goto copy_iov ;
3141
3140
3142
3141
iov_count = iov_iter_count (& iter );
3142
+ nr_segs = iter .nr_segs ;
3143
3143
ret = rw_verify_area (WRITE , req -> file , & kiocb -> ki_pos , iov_count );
3144
- if (!ret ) {
3145
- unsigned long nr_segs = iter .nr_segs ;
3146
- ssize_t ret2 ;
3144
+ if (unlikely (ret ))
3145
+ goto out_free ;
3147
3146
3148
- /*
3149
- * Open-code file_start_write here to grab freeze protection,
3150
- * which will be released by another thread in
3151
- * io_complete_rw(). Fool lockdep by telling it the lock got
3152
- * released so that it doesn't complain about the held lock when
3153
- * we return to userspace.
3154
- */
3155
- if (req -> flags & REQ_F_ISREG ) {
3156
- __sb_start_write (file_inode (req -> file )-> i_sb ,
3157
- SB_FREEZE_WRITE , true);
3158
- __sb_writers_release (file_inode (req -> file )-> i_sb ,
3159
- SB_FREEZE_WRITE );
3160
- }
3161
- kiocb -> ki_flags |= IOCB_WRITE ;
3147
+ /*
3148
+ * Open-code file_start_write here to grab freeze protection,
3149
+ * which will be released by another thread in
3150
+ * io_complete_rw(). Fool lockdep by telling it the lock got
3151
+ * released so that it doesn't complain about the held lock when
3152
+ * we return to userspace.
3153
+ */
3154
+ if (req -> flags & REQ_F_ISREG ) {
3155
+ __sb_start_write (file_inode (req -> file )-> i_sb ,
3156
+ SB_FREEZE_WRITE , true);
3157
+ __sb_writers_release (file_inode (req -> file )-> i_sb ,
3158
+ SB_FREEZE_WRITE );
3159
+ }
3160
+ kiocb -> ki_flags |= IOCB_WRITE ;
3162
3161
3163
- if (req -> file -> f_op -> write_iter )
3164
- ret2 = call_write_iter (req -> file , kiocb , & iter );
3165
- else
3166
- ret2 = loop_rw_iter (WRITE , req -> file , kiocb , & iter );
3162
+ if (req -> file -> f_op -> write_iter )
3163
+ ret2 = call_write_iter (req -> file , kiocb , & iter );
3164
+ else
3165
+ ret2 = loop_rw_iter (WRITE , req -> file , kiocb , & iter );
3167
3166
3168
- /*
3169
- * Raw bdev writes will return -EOPNOTSUPP for IOCB_NOWAIT. Just
3170
- * retry them without IOCB_NOWAIT.
3171
- */
3172
- if (ret2 == - EOPNOTSUPP && (kiocb -> ki_flags & IOCB_NOWAIT ))
3173
- ret2 = - EAGAIN ;
3174
- if (!force_nonblock || ret2 != - EAGAIN ) {
3175
- kiocb_done (kiocb , ret2 , cs );
3176
- } else {
3177
- iter .count = iov_count ;
3178
- iter .nr_segs = nr_segs ;
3167
+ /*
3168
+ * Raw bdev writes will return -EOPNOTSUPP for IOCB_NOWAIT. Just
3169
+ * retry them without IOCB_NOWAIT.
3170
+ */
3171
+ if (ret2 == - EOPNOTSUPP && (kiocb -> ki_flags & IOCB_NOWAIT ))
3172
+ ret2 = - EAGAIN ;
3173
+ if (!force_nonblock || ret2 != - EAGAIN ) {
3174
+ kiocb_done (kiocb , ret2 , cs );
3175
+ } else {
3176
+ iter .count = iov_count ;
3177
+ iter .nr_segs = nr_segs ;
3179
3178
copy_iov :
3180
- ret = io_setup_async_rw (req , io_size , iovec ,
3181
- inline_vecs , & iter );
3182
- if (ret )
3183
- goto out_free ;
3184
- /* it's copied and will be cleaned with ->io */
3185
- iovec = NULL ;
3186
- return - EAGAIN ;
3187
- }
3179
+ ret = io_setup_async_rw (req , io_size , iovec , inline_vecs ,
3180
+ & iter );
3181
+ if (ret )
3182
+ goto out_free ;
3183
+ /* it's copied and will be cleaned with ->io */
3184
+ iovec = NULL ;
3185
+ return - EAGAIN ;
3188
3186
}
3189
3187
out_free :
3190
3188
if (iovec )
0 commit comments