return &i->iomap;
  }
  
 +/*
 + * Return the file offset for the first unchanged block after a short write.
 + *
 + * If nothing was written, round @pos down to point at the first block in
 + * the range, else round up to include the partially written block.
 + */
 +static inline loff_t iomap_last_written_block(struct inode *inode, loff_t pos,
 +              ssize_t written)
 +{
 +      if (unlikely(!written))
 +              return round_down(pos, i_blocksize(inode));
 +      return round_up(pos + written, i_blocksize(inode));
 +}
 +
+ /*
+  * Check if the range needs to be unshared for a FALLOC_FL_UNSHARE_RANGE
+  * operation.
+  *
+  * Don't bother with blocks that are not shared to start with; or mappings that
+  * cannot be shared, such as inline data, delalloc reservations, holes or
+  * unwritten extents.
+  *
+  * Note that we use srcmap directly instead of iomap_iter_srcmap as unsharing
+  * requires providing a separate source map, and the presence of one is a good
+  * indicator that unsharing is needed, unlike IOMAP_F_SHARED which can be set
+  * for any data that goes into the COW fork for XFS.
+  */
+ static inline bool iomap_want_unshare_iter(const struct iomap_iter *iter)
+ {
+       return (iter->iomap.flags & IOMAP_F_SHARED) &&
+               iter->srcmap.type == IOMAP_MAPPED;
+ }
+ 
  ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
                const struct iomap_ops *ops, void *private);
  int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops);