@@ -1170,17 +1170,16 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1170
1170
blkbits = blksize_bits (bdev_logical_block_size (bdev ));
1171
1171
blocksize_mask = (1 << blkbits ) - 1 ;
1172
1172
if (align & blocksize_mask )
1173
- goto out ;
1173
+ return - EINVAL ;
1174
1174
}
1175
1175
1176
1176
/* watch out for a 0 len io from a tricksy fs */
1177
1177
if (iov_iter_rw (iter ) == READ && !count )
1178
1178
return 0 ;
1179
1179
1180
1180
dio = kmem_cache_alloc (dio_cache , GFP_KERNEL );
1181
- retval = - ENOMEM ;
1182
1181
if (!dio )
1183
- goto out ;
1182
+ return - ENOMEM ;
1184
1183
/*
1185
1184
* Believe it or not, zeroing out the page array caused a .5%
1186
1185
* performance regression in a database benchmark. So, we take
@@ -1199,22 +1198,16 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1199
1198
1200
1199
retval = filemap_write_and_wait_range (mapping , offset ,
1201
1200
end - 1 );
1202
- if (retval ) {
1203
- inode_unlock (inode );
1204
- kmem_cache_free (dio_cache , dio );
1205
- goto out ;
1206
- }
1201
+ if (retval )
1202
+ goto fail_dio ;
1207
1203
}
1208
1204
}
1209
1205
1210
1206
/* Once we sampled i_size check for reads beyond EOF */
1211
1207
dio -> i_size = i_size_read (inode );
1212
1208
if (iov_iter_rw (iter ) == READ && offset >= dio -> i_size ) {
1213
- if (dio -> flags & DIO_LOCKING )
1214
- inode_unlock (inode );
1215
- kmem_cache_free (dio_cache , dio );
1216
1209
retval = 0 ;
1217
- goto out ;
1210
+ goto fail_dio ;
1218
1211
}
1219
1212
1220
1213
/*
@@ -1258,14 +1251,8 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1258
1251
*/
1259
1252
retval = sb_init_dio_done_wq (dio -> inode -> i_sb );
1260
1253
}
1261
- if (retval ) {
1262
- /*
1263
- * We grab i_mutex only for reads so we don't have
1264
- * to release it here
1265
- */
1266
- kmem_cache_free (dio_cache , dio );
1267
- goto out ;
1268
- }
1254
+ if (retval )
1255
+ goto fail_dio ;
1269
1256
}
1270
1257
1271
1258
/*
@@ -1368,7 +1355,13 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1368
1355
} else
1369
1356
BUG_ON (retval != - EIOCBQUEUED );
1370
1357
1371
- out :
1358
+ return retval ;
1359
+
1360
+ fail_dio :
1361
+ if (dio -> flags & DIO_LOCKING && iov_iter_rw (iter ) == READ )
1362
+ inode_unlock (inode );
1363
+
1364
+ kmem_cache_free (dio_cache , dio );
1372
1365
return retval ;
1373
1366
}
1374
1367
0 commit comments