iomap: add a IOMAP_DIO_OVERWRITE_ONLY flag
authorChristoph Hellwig <hch@lst.de>
Sat, 23 Jan 2021 18:06:10 +0000 (10:06 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Sat, 23 Jan 2021 18:22:12 +0000 (10:22 -0800)
Add a flag to signal that only pure overwrites are allowed.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/iomap/direct-io.c
include/linux/iomap.h

index 947343730e2c933f19e04fbef3a03aa615804324..65d32364345d221fb8dbd822baa2073c70835344 100644 (file)
@@ -485,6 +485,13 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
                iomap_flags |= IOMAP_NOWAIT;
        }
 
+       if (dio_flags & IOMAP_DIO_OVERWRITE_ONLY) {
+               ret = -EAGAIN;
+               if (pos >= dio->i_size || pos + count > dio->i_size)
+                       goto out_free_dio;
+               iomap_flags |= IOMAP_OVERWRITE_ONLY;
+       }
+
        ret = filemap_write_and_wait_range(mapping, pos, end);
        if (ret)
                goto out_free_dio;
index be4e1e1e01e8011dde874cb5d4f8a9dd3d9387de..1a86f520de560ae65ebaee252892840523f54473 100644 (file)
@@ -122,6 +122,7 @@ struct iomap_page_ops {
 #define IOMAP_FAULT            (1 << 3) /* mapping for page fault */
 #define IOMAP_DIRECT           (1 << 4) /* direct I/O */
 #define IOMAP_NOWAIT           (1 << 5) /* do not block */
+#define IOMAP_OVERWRITE_ONLY   (1 << 6) /* only pure overwrites allowed */
 
 struct iomap_ops {
        /*
@@ -262,6 +263,13 @@ struct iomap_dio_ops {
  */
 #define IOMAP_DIO_FORCE_WAIT   (1 << 0)
 
+/*
+ * Do not allocate blocks or zero partial blocks, but instead fall back to
+ * the caller by returning -EAGAIN.  Used to optimize direct I/O writes that
+ * are not aligned to the file system block size.
+  */
+#define IOMAP_DIO_OVERWRITE_ONLY       (1 << 1)
+
 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);