mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 19:07:52 +00:00
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: Christoph Hellwig <hch@lst.de> Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
0e3c3b901c
commit
36518b6b4d
2 changed files with 17 additions and 9 deletions
|
@ -548,17 +548,19 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for data sync or sync, we need sync completion processing */
|
/* 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;
|
dio->flags |= IOMAP_DIO_NEED_SYNC;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For datasync only writes, we optimistically try using FUA for
|
* For datasync only writes, we optimistically try
|
||||||
* this IO. Any non-FUA write that occurs will clear this flag,
|
* using FUA for this IO. Any non-FUA write that
|
||||||
* hence we know before completion whether a cache flush is
|
* occurs will clear this flag, hence we know before
|
||||||
* necessary.
|
* 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;
|
dio->flags |= IOMAP_DIO_WRITE_FUA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dio_flags & IOMAP_DIO_OVERWRITE_ONLY) {
|
if (dio_flags & IOMAP_DIO_OVERWRITE_ONLY) {
|
||||||
|
|
|
@ -353,6 +353,12 @@ struct iomap_dio_ops {
|
||||||
*/
|
*/
|
||||||
#define IOMAP_DIO_PARTIAL (1 << 2)
|
#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,
|
ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
|
||||||
const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
|
const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
|
||||||
unsigned int dio_flags, void *private, size_t done_before);
|
unsigned int dio_flags, void *private, size_t done_before);
|
||||||
|
|
Loading…
Reference in a new issue