}
 
                /* 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.
-                */
-               if ((iocb->ki_flags & (IOCB_DSYNC | IOCB_SYNC)) == IOCB_DSYNC)
-                       dio->flags |= IOMAP_DIO_WRITE_FUA;
+                      /*
+                       * 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_SYNC))
+                               dio->flags |= IOMAP_DIO_WRITE_FUA;
+               }
        }
 
        if (dio_flags & IOMAP_DIO_OVERWRITE_ONLY) {
 
  */
 #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);