@@ -317,7 +317,7 @@ static int iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio,
317317 * clearing the WRITE_THROUGH flag in the dio request.
318318 */
319319static inline blk_opf_t iomap_dio_bio_opflags (struct iomap_dio * dio ,
320- const struct iomap * iomap , bool use_fua , bool atomic )
320+ const struct iomap * iomap , bool use_fua , bool atomic_hw )
321321{
322322 blk_opf_t opflags = REQ_SYNC | REQ_IDLE ;
323323
@@ -329,7 +329,7 @@ static inline blk_opf_t iomap_dio_bio_opflags(struct iomap_dio *dio,
329329 opflags |= REQ_FUA ;
330330 else
331331 dio -> flags &= ~IOMAP_DIO_WRITE_THROUGH ;
332- if (atomic )
332+ if (atomic_hw )
333333 opflags |= REQ_ATOMIC ;
334334
335335 return opflags ;
@@ -340,8 +340,8 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
340340 const struct iomap * iomap = & iter -> iomap ;
341341 struct inode * inode = iter -> inode ;
342342 unsigned int fs_block_size = i_blocksize (inode ), pad ;
343+ bool atomic_hw = iter -> flags & IOMAP_ATOMIC_HW ;
343344 const loff_t length = iomap_length (iter );
344- bool atomic = iter -> flags & IOMAP_ATOMIC ;
345345 loff_t pos = iter -> pos ;
346346 blk_opf_t bio_opf ;
347347 struct bio * bio ;
@@ -351,7 +351,7 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
351351 u64 copied = 0 ;
352352 size_t orig_count ;
353353
354- if (atomic && length != fs_block_size )
354+ if (atomic_hw && length != iter -> len )
355355 return - EINVAL ;
356356
357357 if ((pos | length ) & (bdev_logical_block_size (iomap -> bdev ) - 1 ) ||
@@ -428,7 +428,7 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
428428 goto out ;
429429 }
430430
431- bio_opf = iomap_dio_bio_opflags (dio , iomap , use_fua , atomic );
431+ bio_opf = iomap_dio_bio_opflags (dio , iomap , use_fua , atomic_hw );
432432
433433 nr_pages = bio_iov_vecs_to_alloc (dio -> submit .iter , BIO_MAX_VECS );
434434 do {
@@ -461,7 +461,7 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
461461 }
462462
463463 n = bio -> bi_iter .bi_size ;
464- if (WARN_ON_ONCE (atomic && n != length )) {
464+ if (WARN_ON_ONCE (atomic_hw && n != length )) {
465465 /*
466466 * This bio should have covered the complete length,
467467 * which it doesn't, so error. We may need to zero out
@@ -650,9 +650,6 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
650650 if (iocb -> ki_flags & IOCB_NOWAIT )
651651 iomi .flags |= IOMAP_NOWAIT ;
652652
653- if (iocb -> ki_flags & IOCB_ATOMIC )
654- iomi .flags |= IOMAP_ATOMIC ;
655-
656653 if (iov_iter_rw (iter ) == READ ) {
657654 /* reads can always complete inline */
658655 dio -> flags |= IOMAP_DIO_INLINE_COMP ;
@@ -687,6 +684,11 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
687684 iomi .flags |= IOMAP_OVERWRITE_ONLY ;
688685 }
689686
687+ if (dio_flags & IOMAP_DIO_ATOMIC_SW )
688+ iomi .flags |= IOMAP_ATOMIC_SW ;
689+ else if (iocb -> ki_flags & IOCB_ATOMIC )
690+ iomi .flags |= IOMAP_ATOMIC_HW ;
691+
690692 /* for data sync or sync, we need sync completion processing */
691693 if (iocb_is_dsync (iocb )) {
692694 dio -> flags |= IOMAP_DIO_NEED_SYNC ;
0 commit comments