linux/include/linux/iomap.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef LINUX_IOMAP_H
   3#define LINUX_IOMAP_H 1
   4
   5#include <linux/types.h>
   6
   7struct fiemap_extent_info;
   8struct inode;
   9struct iov_iter;
  10struct kiocb;
  11struct vm_area_struct;
  12struct vm_fault;
  13
  14/*
  15 * Types of block ranges for iomap mappings:
  16 */
  17#define IOMAP_HOLE      0x01    /* no blocks allocated, need allocation */
  18#define IOMAP_DELALLOC  0x02    /* delayed allocation blocks */
  19#define IOMAP_MAPPED    0x03    /* blocks allocated @blkno */
  20#define IOMAP_UNWRITTEN 0x04    /* blocks allocated @blkno in unwritten state */
  21
  22/*
  23 * Flags for all iomap mappings:
  24 */
  25#define IOMAP_F_NEW     0x01    /* blocks have been newly allocated */
  26
  27/*
  28 * Flags that only need to be reported for IOMAP_REPORT requests:
  29 */
  30#define IOMAP_F_MERGED  0x10    /* contains multiple blocks/extents */
  31#define IOMAP_F_SHARED  0x20    /* block shared with another file */
  32
  33/*
  34 * Magic value for blkno:
  35 */
  36#define IOMAP_NULL_BLOCK -1LL   /* blkno is not valid */
  37
  38struct iomap {
  39        sector_t                blkno;  /* 1st sector of mapping, 512b units */
  40        loff_t                  offset; /* file offset of mapping, bytes */
  41        u64                     length; /* length of mapping, bytes */
  42        u16                     type;   /* type of mapping */
  43        u16                     flags;  /* flags for mapping */
  44        struct block_device     *bdev;  /* block device for I/O */
  45        struct dax_device       *dax_dev; /* dax_dev for dax operations */
  46};
  47
  48/*
  49 * Flags for iomap_begin / iomap_end.  No flag implies a read.
  50 */
  51#define IOMAP_WRITE             (1 << 0) /* writing, must allocate blocks */
  52#define IOMAP_ZERO              (1 << 1) /* zeroing operation, may skip holes */
  53#define IOMAP_REPORT            (1 << 2) /* report extent status, e.g. FIEMAP */
  54#define IOMAP_FAULT             (1 << 3) /* mapping for page fault */
  55#define IOMAP_DIRECT            (1 << 4) /* direct I/O */
  56#define IOMAP_NOWAIT            (1 << 5) /* Don't wait for writeback */
  57
  58struct iomap_ops {
  59        /*
  60         * Return the existing mapping at pos, or reserve space starting at
  61         * pos for up to length, as long as we can do it as a single mapping.
  62         * The actual length is returned in iomap->length.
  63         */
  64        int (*iomap_begin)(struct inode *inode, loff_t pos, loff_t length,
  65                        unsigned flags, struct iomap *iomap);
  66
  67        /*
  68         * Commit and/or unreserve space previous allocated using iomap_begin.
  69         * Written indicates the length of the successful write operation which
  70         * needs to be commited, while the rest needs to be unreserved.
  71         * Written might be zero if no data was written.
  72         */
  73        int (*iomap_end)(struct inode *inode, loff_t pos, loff_t length,
  74                        ssize_t written, unsigned flags, struct iomap *iomap);
  75};
  76
  77ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
  78                const struct iomap_ops *ops);
  79int iomap_file_dirty(struct inode *inode, loff_t pos, loff_t len,
  80                const struct iomap_ops *ops);
  81int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len,
  82                bool *did_zero, const struct iomap_ops *ops);
  83int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
  84                const struct iomap_ops *ops);
  85int iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops);
  86int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
  87                loff_t start, loff_t len, const struct iomap_ops *ops);
  88loff_t iomap_seek_hole(struct inode *inode, loff_t offset,
  89                const struct iomap_ops *ops);
  90loff_t iomap_seek_data(struct inode *inode, loff_t offset,
  91                const struct iomap_ops *ops);
  92
  93/*
  94 * Flags for direct I/O ->end_io:
  95 */
  96#define IOMAP_DIO_UNWRITTEN     (1 << 0)        /* covers unwritten extent(s) */
  97#define IOMAP_DIO_COW           (1 << 1)        /* covers COW extent(s) */
  98typedef int (iomap_dio_end_io_t)(struct kiocb *iocb, ssize_t ret,
  99                unsigned flags);
 100ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
 101                const struct iomap_ops *ops, iomap_dio_end_io_t end_io);
 102
 103#endif /* LINUX_IOMAP_H */
 104