@@ -190,14 +190,15 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
190
190
struct blkdev_dio * dio ;
191
191
struct bio * bio ;
192
192
bool is_read = (iov_iter_rw (iter ) == READ ), is_sync ;
193
+ unsigned int opf = is_read ? REQ_OP_READ : dio_bio_write_op (iocb );
193
194
loff_t pos = iocb -> ki_pos ;
194
195
int ret = 0 ;
195
196
196
197
if ((pos | iov_iter_alignment (iter )) &
197
198
(bdev_logical_block_size (bdev ) - 1 ))
198
199
return - EINVAL ;
199
200
200
- bio = bio_alloc_kiocb (iocb , nr_pages , & blkdev_dio_pool );
201
+ bio = bio_alloc_kiocb (iocb , bdev , nr_pages , opf , & blkdev_dio_pool );
201
202
202
203
dio = container_of (bio , struct blkdev_dio , bio );
203
204
atomic_set (& dio -> ref , 1 );
@@ -223,7 +224,6 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
223
224
blk_start_plug (& plug );
224
225
225
226
for (;;) {
226
- bio_set_dev (bio , bdev );
227
227
bio -> bi_iter .bi_sector = pos >> SECTOR_SHIFT ;
228
228
bio -> bi_write_hint = iocb -> ki_hint ;
229
229
bio -> bi_private = dio ;
@@ -238,11 +238,9 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
238
238
}
239
239
240
240
if (is_read ) {
241
- bio -> bi_opf = REQ_OP_READ ;
242
241
if (dio -> flags & DIO_SHOULD_DIRTY )
243
242
bio_set_pages_dirty (bio );
244
243
} else {
245
- bio -> bi_opf = dio_bio_write_op (iocb );
246
244
task_io_account_write (bio -> bi_iter .bi_size );
247
245
}
248
246
if (iocb -> ki_flags & IOCB_NOWAIT )
@@ -259,6 +257,8 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
259
257
atomic_inc (& dio -> ref );
260
258
submit_bio (bio );
261
259
bio = bio_alloc (GFP_KERNEL , nr_pages );
260
+ bio_set_dev (bio , bdev );
261
+ bio -> bi_opf = opf ;
262
262
}
263
263
264
264
blk_finish_plug (& plug );
@@ -311,6 +311,8 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb,
311
311
unsigned int nr_pages )
312
312
{
313
313
struct block_device * bdev = iocb -> ki_filp -> private_data ;
314
+ bool is_read = iov_iter_rw (iter ) == READ ;
315
+ unsigned int opf = is_read ? REQ_OP_READ : dio_bio_write_op (iocb );
314
316
struct blkdev_dio * dio ;
315
317
struct bio * bio ;
316
318
loff_t pos = iocb -> ki_pos ;
@@ -320,11 +322,10 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb,
320
322
(bdev_logical_block_size (bdev ) - 1 ))
321
323
return - EINVAL ;
322
324
323
- bio = bio_alloc_kiocb (iocb , nr_pages , & blkdev_dio_pool );
325
+ bio = bio_alloc_kiocb (iocb , bdev , nr_pages , opf , & blkdev_dio_pool );
324
326
dio = container_of (bio , struct blkdev_dio , bio );
325
327
dio -> flags = 0 ;
326
328
dio -> iocb = iocb ;
327
- bio_set_dev (bio , bdev );
328
329
bio -> bi_iter .bi_sector = pos >> SECTOR_SHIFT ;
329
330
bio -> bi_write_hint = iocb -> ki_hint ;
330
331
bio -> bi_end_io = blkdev_bio_end_io_async ;
@@ -347,14 +348,12 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb,
347
348
}
348
349
dio -> size = bio -> bi_iter .bi_size ;
349
350
350
- if (iov_iter_rw (iter ) == READ ) {
351
- bio -> bi_opf = REQ_OP_READ ;
351
+ if (is_read ) {
352
352
if (iter_is_iovec (iter )) {
353
353
dio -> flags |= DIO_SHOULD_DIRTY ;
354
354
bio_set_pages_dirty (bio );
355
355
}
356
356
} else {
357
- bio -> bi_opf = dio_bio_write_op (iocb );
358
357
task_io_account_write (bio -> bi_iter .bi_size );
359
358
}
360
359
0 commit comments