Commit 36518b6b authored by Al Viro's avatar Al Viro
Browse files

teach iomap_dio_rw() to suppress dsync



New flag, equivalent to removal of IOCB_DSYNC from iocb flags.
This mimics what btrfs is doing (and that's what btrfs will
switch to).  However, I'm not at all sure that we want to
suppress REQ_FUA for those - all btrfs hack really cares about
is suppression of generic_write_sync().  For now let's keep
the existing behaviour, but I really want to hear more detailed
arguments pro or contra.

[folded brain fix from willy]

Suggested-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarChristian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 0e3c3b90
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -548,18 +548,20 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
		}

		/* for data sync or sync, we need sync completion processing */
		if (iocb->ki_flags & IOCB_DSYNC)
		if (iocb->ki_flags & IOCB_DSYNC &&
		    !(dio_flags & IOMAP_DIO_NOSYNC)) {
			dio->flags |= IOMAP_DIO_NEED_SYNC;

		       /*
		 * For datasync only writes, we optimistically try using FUA for
		 * this IO.  Any non-FUA write that occurs will clear this flag,
		 * hence we know before completion whether a cache flush is
		 * necessary.
			* For datasync only writes, we optimistically try
			* using FUA for this IO.  Any non-FUA write that
			* occurs will clear this flag, hence we know before
			* completion whether a cache flush is necessary.
			*/
		if ((iocb->ki_flags & (IOCB_DSYNC | IOCB_SYNC)) == IOCB_DSYNC)
			if (!(iocb->ki_flags & IOCB_SYNC))
				dio->flags |= IOMAP_DIO_WRITE_FUA;
		}
	}

	if (dio_flags & IOMAP_DIO_OVERWRITE_ONLY) {
		ret = -EAGAIN;
+6 −0
Original line number Diff line number Diff line
@@ -353,6 +353,12 @@ struct iomap_dio_ops {
 */
#define IOMAP_DIO_PARTIAL		(1 << 2)

/*
 * The caller will sync the write if needed; do not sync it within
 * iomap_dio_rw.  Overrides IOMAP_DIO_FORCE_WAIT.
 */
#define IOMAP_DIO_NOSYNC		(1 << 3)

ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
		const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
		unsigned int dio_flags, void *private, size_t done_before);