Lines Matching +full:ip +full:- +full:blocks
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2006 Silicon Graphics, Inc.
4 * Copyright (c) 2016-2018 Christoph Hellwig.
33 (((off) >> mp->m_allocsize_log) << mp->m_allocsize_log)
37 xfs_inode_t *ip, in xfs_alert_fsblock_zero() argument
40 xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO, in xfs_alert_fsblock_zero()
43 "blkcnt: %llx extent-state: %x", in xfs_alert_fsblock_zero()
44 (unsigned long long)ip->i_ino, in xfs_alert_fsblock_zero()
45 (unsigned long long)imap->br_startblock, in xfs_alert_fsblock_zero()
46 (unsigned long long)imap->br_startoff, in xfs_alert_fsblock_zero()
47 (unsigned long long)imap->br_blockcount, in xfs_alert_fsblock_zero()
48 imap->br_state); in xfs_alert_fsblock_zero()
49 return -EFSCORRUPTED; in xfs_alert_fsblock_zero()
54 struct xfs_inode *ip, in xfs_bmbt_to_iomap() argument
59 struct xfs_mount *mp = ip->i_mount; in xfs_bmbt_to_iomap()
60 struct xfs_buftarg *target = xfs_inode_buftarg(ip); in xfs_bmbt_to_iomap()
62 if (unlikely(!xfs_valid_startblock(ip, imap->br_startblock))) in xfs_bmbt_to_iomap()
63 return xfs_alert_fsblock_zero(ip, imap); in xfs_bmbt_to_iomap()
65 if (imap->br_startblock == HOLESTARTBLOCK) { in xfs_bmbt_to_iomap()
66 iomap->addr = IOMAP_NULL_ADDR; in xfs_bmbt_to_iomap()
67 iomap->type = IOMAP_HOLE; in xfs_bmbt_to_iomap()
68 } else if (imap->br_startblock == DELAYSTARTBLOCK || in xfs_bmbt_to_iomap()
69 isnullstartblock(imap->br_startblock)) { in xfs_bmbt_to_iomap()
70 iomap->addr = IOMAP_NULL_ADDR; in xfs_bmbt_to_iomap()
71 iomap->type = IOMAP_DELALLOC; in xfs_bmbt_to_iomap()
73 iomap->addr = BBTOB(xfs_fsb_to_db(ip, imap->br_startblock)); in xfs_bmbt_to_iomap()
74 if (imap->br_state == XFS_EXT_UNWRITTEN) in xfs_bmbt_to_iomap()
75 iomap->type = IOMAP_UNWRITTEN; in xfs_bmbt_to_iomap()
77 iomap->type = IOMAP_MAPPED; in xfs_bmbt_to_iomap()
79 iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); in xfs_bmbt_to_iomap()
80 iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); in xfs_bmbt_to_iomap()
81 iomap->bdev = target->bt_bdev; in xfs_bmbt_to_iomap()
82 iomap->dax_dev = target->bt_daxdev; in xfs_bmbt_to_iomap()
83 iomap->flags = flags; in xfs_bmbt_to_iomap()
85 if (xfs_ipincount(ip) && in xfs_bmbt_to_iomap()
86 (ip->i_itemp->ili_fsync_fields & ~XFS_ILOG_TIMESTAMP)) in xfs_bmbt_to_iomap()
87 iomap->flags |= IOMAP_F_DIRTY; in xfs_bmbt_to_iomap()
93 struct xfs_inode *ip, in xfs_hole_to_iomap() argument
98 struct xfs_buftarg *target = xfs_inode_buftarg(ip); in xfs_hole_to_iomap()
100 iomap->addr = IOMAP_NULL_ADDR; in xfs_hole_to_iomap()
101 iomap->type = IOMAP_HOLE; in xfs_hole_to_iomap()
102 iomap->offset = XFS_FSB_TO_B(ip->i_mount, offset_fsb); in xfs_hole_to_iomap()
103 iomap->length = XFS_FSB_TO_B(ip->i_mount, end_fsb - offset_fsb); in xfs_hole_to_iomap()
104 iomap->bdev = target->bt_bdev; in xfs_hole_to_iomap()
105 iomap->dax_dev = target->bt_daxdev; in xfs_hole_to_iomap()
114 ASSERT(offset <= mp->m_super->s_maxbytes); in xfs_iomap_end_fsb()
116 XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); in xfs_iomap_end_fsb()
121 struct xfs_inode *ip) in xfs_eof_alignment() argument
123 struct xfs_mount *mp = ip->i_mount; in xfs_eof_alignment()
126 if (!XFS_IS_REALTIME_INODE(ip)) { in xfs_eof_alignment()
132 * If mounted with the "-o swalloc" option the alignment is in xfs_eof_alignment()
135 if (mp->m_swidth && (mp->m_flags & XFS_MOUNT_SWALLOC)) in xfs_eof_alignment()
136 align = mp->m_swidth; in xfs_eof_alignment()
137 else if (mp->m_dalign) in xfs_eof_alignment()
138 align = mp->m_dalign; in xfs_eof_alignment()
140 if (align && XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, align)) in xfs_eof_alignment()
153 struct xfs_inode *ip, in xfs_iomap_eof_align_last_fsb() argument
156 struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); in xfs_iomap_eof_align_last_fsb()
157 xfs_extlen_t extsz = xfs_get_extsz_hint(ip); in xfs_iomap_eof_align_last_fsb()
158 xfs_extlen_t align = xfs_eof_alignment(ip); in xfs_iomap_eof_align_last_fsb()
162 ASSERT(ifp->if_flags & XFS_IFEXTENTS); in xfs_iomap_eof_align_last_fsb()
188 struct xfs_inode *ip, in xfs_iomap_write_direct() argument
193 struct xfs_mount *mp = ip->i_mount; in xfs_iomap_write_direct()
207 xfs_get_extsz_hint(ip)); in xfs_iomap_write_direct()
208 if (unlikely(XFS_IS_REALTIME_INODE(ip))) { in xfs_iomap_write_direct()
210 resrtextents /= mp->m_sb.sb_rextsize; in xfs_iomap_write_direct()
218 error = xfs_qm_dqattach(ip); in xfs_iomap_write_direct()
226 * we may not have zeroed the blocks and this will be exposed on in xfs_iomap_write_direct()
235 if (IS_DAX(VFS_I(ip))) { in xfs_iomap_write_direct()
237 if (imap->br_state == XFS_EXT_UNWRITTEN) { in xfs_iomap_write_direct()
242 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, resrtextents, in xfs_iomap_write_direct()
247 xfs_ilock(ip, XFS_ILOCK_EXCL); in xfs_iomap_write_direct()
249 error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks, 0, quota_flag); in xfs_iomap_write_direct()
253 xfs_trans_ijoin(tp, ip, 0); in xfs_iomap_write_direct()
260 error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb, bmapi_flags, 0, in xfs_iomap_write_direct()
276 error = -ENOSPC; in xfs_iomap_write_direct()
280 if (unlikely(!xfs_valid_startblock(ip, imap->br_startblock))) in xfs_iomap_write_direct()
281 error = xfs_alert_fsblock_zero(ip, imap); in xfs_iomap_write_direct()
284 xfs_iunlock(ip, XFS_ILOCK_EXCL); in xfs_iomap_write_direct()
288 xfs_trans_unreserve_quota_nblks(tp, ip, (long)qblocks, 0, quota_flag); in xfs_iomap_write_direct()
296 struct xfs_inode *ip, in xfs_quota_need_throttle() argument
300 struct xfs_dquot *dq = xfs_inode_dquot(ip, type); in xfs_quota_need_throttle()
302 if (!dq || !xfs_this_quota_on(ip->i_mount, type)) in xfs_quota_need_throttle()
306 if (!dq->q_prealloc_hi_wmark) in xfs_quota_need_throttle()
310 if (dq->q_blk.reserved + alloc_blocks < dq->q_prealloc_lo_wmark) in xfs_quota_need_throttle()
318 struct xfs_inode *ip, in xfs_quota_calc_throttle() argument
324 struct xfs_dquot *dq = xfs_inode_dquot(ip, type); in xfs_quota_calc_throttle()
329 if (!dq || dq->q_blk.reserved >= dq->q_prealloc_hi_wmark) { in xfs_quota_calc_throttle()
335 freesp = dq->q_prealloc_hi_wmark - dq->q_blk.reserved; in xfs_quota_calc_throttle()
336 if (freesp < dq->q_low_space[XFS_QLOWSP_5_PCNT]) { in xfs_quota_calc_throttle()
338 if (freesp < dq->q_low_space[XFS_QLOWSP_3_PCNT]) in xfs_quota_calc_throttle()
340 if (freesp < dq->q_low_space[XFS_QLOWSP_1_PCNT]) in xfs_quota_calc_throttle()
362 struct xfs_inode *ip, in xfs_iomap_prealloc_size() argument
370 struct xfs_mount *mp = ip->i_mount; in xfs_iomap_prealloc_size()
371 struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); in xfs_iomap_prealloc_size()
386 if (XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_allocsize_blocks)) in xfs_iomap_prealloc_size()
393 if (XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign) || in xfs_iomap_prealloc_size()
396 return mp->m_allocsize_blocks; in xfs_iomap_prealloc_size()
436 freesp = percpu_counter_read_positive(&mp->m_fdblocks); in xfs_iomap_prealloc_size()
437 if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { in xfs_iomap_prealloc_size()
439 if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) in xfs_iomap_prealloc_size()
441 if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) in xfs_iomap_prealloc_size()
443 if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) in xfs_iomap_prealloc_size()
445 if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) in xfs_iomap_prealloc_size()
453 if (xfs_quota_need_throttle(ip, XFS_DQTYPE_USER, alloc_blocks)) in xfs_iomap_prealloc_size()
454 xfs_quota_calc_throttle(ip, XFS_DQTYPE_USER, &qblocks, &qshift, in xfs_iomap_prealloc_size()
456 if (xfs_quota_need_throttle(ip, XFS_DQTYPE_GROUP, alloc_blocks)) in xfs_iomap_prealloc_size()
457 xfs_quota_calc_throttle(ip, XFS_DQTYPE_GROUP, &qblocks, &qshift, in xfs_iomap_prealloc_size()
459 if (xfs_quota_need_throttle(ip, XFS_DQTYPE_PROJ, alloc_blocks)) in xfs_iomap_prealloc_size()
460 xfs_quota_calc_throttle(ip, XFS_DQTYPE_PROJ, &qblocks, &qshift, in xfs_iomap_prealloc_size()
468 * the global low free space values and per-quota low free space values. in xfs_iomap_prealloc_size()
492 if (alloc_blocks < mp->m_allocsize_blocks) in xfs_iomap_prealloc_size()
493 alloc_blocks = mp->m_allocsize_blocks; in xfs_iomap_prealloc_size()
494 trace_xfs_iomap_prealloc_size(ip, alloc_blocks, shift, in xfs_iomap_prealloc_size()
495 mp->m_allocsize_blocks); in xfs_iomap_prealloc_size()
501 xfs_inode_t *ip, in xfs_iomap_write_unwritten() argument
506 xfs_mount_t *mp = ip->i_mount; in xfs_iomap_write_unwritten()
513 struct inode *inode = VFS_I(ip); in xfs_iomap_write_unwritten()
518 trace_xfs_unwritten_convert(ip, offset, count); in xfs_iomap_write_unwritten()
522 count_fsb = (xfs_filblks_t)(count_fsb - offset_fsb); in xfs_iomap_write_unwritten()
525 * Reserve enough blocks in this transaction for two complete extent in xfs_iomap_write_unwritten()
537 error = xfs_qm_dqattach(ip); in xfs_iomap_write_unwritten()
551 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, in xfs_iomap_write_unwritten()
556 xfs_ilock(ip, XFS_ILOCK_EXCL); in xfs_iomap_write_unwritten()
557 xfs_trans_ijoin(tp, ip, 0); in xfs_iomap_write_unwritten()
559 error = xfs_trans_reserve_quota_nblks(tp, ip, resblks, 0, in xfs_iomap_write_unwritten()
568 error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb, in xfs_iomap_write_unwritten()
584 i_size = xfs_new_eof(ip, i_size); in xfs_iomap_write_unwritten()
586 ip->i_d.di_size = i_size; in xfs_iomap_write_unwritten()
587 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); in xfs_iomap_write_unwritten()
591 xfs_iunlock(ip, XFS_ILOCK_EXCL); in xfs_iomap_write_unwritten()
595 if (unlikely(!xfs_valid_startblock(ip, imap.br_startblock))) in xfs_iomap_write_unwritten()
596 return xfs_alert_fsblock_zero(ip, &imap); in xfs_iomap_write_unwritten()
607 count_fsb -= numblks_fsb; in xfs_iomap_write_unwritten()
614 xfs_iunlock(ip, XFS_ILOCK_EXCL); in xfs_iomap_write_unwritten()
625 /* don't allocate blocks when just zeroing */ in imap_needs_alloc()
629 imap->br_startblock == HOLESTARTBLOCK || in imap_needs_alloc()
630 imap->br_startblock == DELAYSTARTBLOCK) in imap_needs_alloc()
633 if (IS_DAX(inode) && imap->br_state == XFS_EXT_UNWRITTEN) in imap_needs_alloc()
640 struct xfs_inode *ip, in imap_needs_cow() argument
645 if (!xfs_is_cow_inode(ip)) in imap_needs_cow()
651 imap->br_startblock == HOLESTARTBLOCK || in imap_needs_cow()
652 imap->br_state == XFS_EXT_UNWRITTEN) in imap_needs_cow()
661 struct xfs_inode *ip, in xfs_ilock_for_iomap() argument
672 if (xfs_is_cow_inode(ip) && is_write) in xfs_ilock_for_iomap()
678 * non-blocking behaviour. in xfs_ilock_for_iomap()
680 if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) { in xfs_ilock_for_iomap()
682 return -EAGAIN; in xfs_ilock_for_iomap()
688 if (!xfs_ilock_nowait(ip, mode)) in xfs_ilock_for_iomap()
689 return -EAGAIN; in xfs_ilock_for_iomap()
691 xfs_ilock(ip, mode); in xfs_ilock_for_iomap()
699 if (mode == XFS_ILOCK_SHARED && is_write && xfs_is_cow_inode(ip)) { in xfs_ilock_for_iomap()
700 xfs_iunlock(ip, mode); in xfs_ilock_for_iomap()
719 if (imap->br_startoff > offset_fsb) in imap_spans_range()
721 if (imap->br_startoff + imap->br_blockcount < end_fsb) in imap_spans_range()
735 struct xfs_inode *ip = XFS_I(inode); in xfs_direct_write_iomap_begin() local
736 struct xfs_mount *mp = ip->i_mount; in xfs_direct_write_iomap_begin()
748 return -EIO; in xfs_direct_write_iomap_begin()
758 error = xfs_ilock_for_iomap(ip, flags, &lockmode); in xfs_direct_write_iomap_begin()
762 error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, in xfs_direct_write_iomap_begin()
767 if (imap_needs_cow(ip, flags, &imap, nimaps)) { in xfs_direct_write_iomap_begin()
768 error = -EAGAIN; in xfs_direct_write_iomap_begin()
772 /* may drop and re-acquire the ilock */ in xfs_direct_write_iomap_begin()
773 error = xfs_reflink_allocate_cow(ip, &imap, &cmap, &shared, in xfs_direct_write_iomap_begin()
780 length = XFS_FSB_TO_B(mp, end_fsb) - offset; in xfs_direct_write_iomap_begin()
794 error = -EAGAIN; in xfs_direct_write_iomap_begin()
798 xfs_iunlock(ip, lockmode); in xfs_direct_write_iomap_begin()
799 trace_xfs_iomap_found(ip, offset, length, XFS_DATA_FORK, &imap); in xfs_direct_write_iomap_begin()
800 return xfs_bmbt_to_iomap(ip, iomap, &imap, iomap_flags); in xfs_direct_write_iomap_begin()
803 error = -EAGAIN; in xfs_direct_write_iomap_begin()
813 * Note that the values needs to be less than 32-bits wide until the in xfs_direct_write_iomap_begin()
819 if (offset + length > XFS_ISIZE(ip)) in xfs_direct_write_iomap_begin()
820 end_fsb = xfs_iomap_eof_align_last_fsb(ip, end_fsb); in xfs_direct_write_iomap_begin()
823 xfs_iunlock(ip, lockmode); in xfs_direct_write_iomap_begin()
825 error = xfs_iomap_write_direct(ip, offset_fsb, end_fsb - offset_fsb, in xfs_direct_write_iomap_begin()
830 trace_xfs_iomap_alloc(ip, offset, length, XFS_DATA_FORK, &imap); in xfs_direct_write_iomap_begin()
831 return xfs_bmbt_to_iomap(ip, iomap, &imap, iomap_flags | IOMAP_F_NEW); in xfs_direct_write_iomap_begin()
834 xfs_iunlock(ip, lockmode); in xfs_direct_write_iomap_begin()
836 trace_xfs_iomap_found(ip, offset, length - offset, XFS_COW_FORK, &cmap); in xfs_direct_write_iomap_begin()
838 error = xfs_bmbt_to_iomap(ip, srcmap, &imap, 0); in xfs_direct_write_iomap_begin()
842 return xfs_bmbt_to_iomap(ip, iomap, &cmap, IOMAP_F_SHARED); in xfs_direct_write_iomap_begin()
845 xfs_iunlock(ip, lockmode); in xfs_direct_write_iomap_begin()
862 struct xfs_inode *ip = XFS_I(inode); in xfs_buffered_write_iomap_begin() local
863 struct xfs_mount *mp = ip->i_mount; in xfs_buffered_write_iomap_begin()
874 if (xfs_get_extsz_hint(ip)) in xfs_buffered_write_iomap_begin()
878 ASSERT(!XFS_IS_REALTIME_INODE(ip)); in xfs_buffered_write_iomap_begin()
880 xfs_ilock(ip, XFS_ILOCK_EXCL); in xfs_buffered_write_iomap_begin()
882 if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(&ip->i_df)) || in xfs_buffered_write_iomap_begin()
884 error = -EFSCORRUPTED; in xfs_buffered_write_iomap_begin()
890 if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) { in xfs_buffered_write_iomap_begin()
891 error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); in xfs_buffered_write_iomap_begin()
900 * perform read-modify-write cycles for unaligned writes. in xfs_buffered_write_iomap_begin()
902 eof = !xfs_iext_lookup_extent(ip, &ip->i_df, offset_fsb, &icur, &imap); in xfs_buffered_write_iomap_begin()
906 /* We never need to allocate blocks for zeroing a hole. */ in xfs_buffered_write_iomap_begin()
908 xfs_hole_to_iomap(ip, iomap, offset_fsb, imap.br_startoff); in xfs_buffered_write_iomap_begin()
916 * block adjacent to shared blocks instead of just the shared blocks in xfs_buffered_write_iomap_begin()
920 if (xfs_is_cow_inode(ip)) { in xfs_buffered_write_iomap_begin()
921 if (!ip->i_cowfp) { in xfs_buffered_write_iomap_begin()
922 ASSERT(!xfs_is_reflink_inode(ip)); in xfs_buffered_write_iomap_begin()
923 xfs_ifork_init_cow(ip); in xfs_buffered_write_iomap_begin()
925 cow_eof = !xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, in xfs_buffered_write_iomap_begin()
928 trace_xfs_reflink_cow_found(ip, &cmap); in xfs_buffered_write_iomap_begin()
939 if (!xfs_is_cow_inode(ip) || in xfs_buffered_write_iomap_begin()
941 trace_xfs_iomap_found(ip, offset, count, XFS_DATA_FORK, in xfs_buffered_write_iomap_begin()
946 xfs_trim_extent(&imap, offset_fsb, end_fsb - offset_fsb); in xfs_buffered_write_iomap_begin()
949 error = xfs_bmap_trim_cow(ip, &imap, &shared); in xfs_buffered_write_iomap_begin()
955 trace_xfs_iomap_found(ip, offset, count, XFS_DATA_FORK, in xfs_buffered_write_iomap_begin()
961 * Fork all the shared blocks from our write offset until the in xfs_buffered_write_iomap_begin()
973 * Note that the values needs to be less than 32-bits wide until in xfs_buffered_write_iomap_begin()
979 if (xfs_is_always_cow_inode(ip)) in xfs_buffered_write_iomap_begin()
983 error = xfs_qm_dqattach_locked(ip, false); in xfs_buffered_write_iomap_begin()
987 if (eof && offset + count > XFS_ISIZE(ip)) { in xfs_buffered_write_iomap_begin()
992 if (mp->m_flags & XFS_MOUNT_ALLOCSIZE) in xfs_buffered_write_iomap_begin()
993 prealloc_blocks = mp->m_allocsize_blocks; in xfs_buffered_write_iomap_begin()
995 prealloc_blocks = xfs_iomap_prealloc_size(ip, allocfork, in xfs_buffered_write_iomap_begin()
1002 end_offset = XFS_ALLOC_ALIGN(mp, offset + count - 1); in xfs_buffered_write_iomap_begin()
1006 align = xfs_eof_alignment(ip); in xfs_buffered_write_iomap_begin()
1011 XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); in xfs_buffered_write_iomap_begin()
1013 prealloc_blocks = p_end_fsb - end_fsb; in xfs_buffered_write_iomap_begin()
1018 error = xfs_bmapi_reserve_delalloc(ip, allocfork, offset_fsb, in xfs_buffered_write_iomap_begin()
1019 end_fsb - offset_fsb, prealloc_blocks, in xfs_buffered_write_iomap_begin()
1026 case -ENOSPC: in xfs_buffered_write_iomap_begin()
1027 case -EDQUOT: in xfs_buffered_write_iomap_begin()
1029 trace_xfs_delalloc_enospc(ip, offset, count); in xfs_buffered_write_iomap_begin()
1040 trace_xfs_iomap_alloc(ip, offset, count, allocfork, &cmap); in xfs_buffered_write_iomap_begin()
1045 * Flag newly allocated delalloc blocks with IOMAP_F_NEW so we punch in xfs_buffered_write_iomap_begin()
1048 xfs_iunlock(ip, XFS_ILOCK_EXCL); in xfs_buffered_write_iomap_begin()
1049 trace_xfs_iomap_alloc(ip, offset, count, allocfork, &imap); in xfs_buffered_write_iomap_begin()
1050 return xfs_bmbt_to_iomap(ip, iomap, &imap, IOMAP_F_NEW); in xfs_buffered_write_iomap_begin()
1053 xfs_iunlock(ip, XFS_ILOCK_EXCL); in xfs_buffered_write_iomap_begin()
1054 return xfs_bmbt_to_iomap(ip, iomap, &imap, 0); in xfs_buffered_write_iomap_begin()
1057 xfs_iunlock(ip, XFS_ILOCK_EXCL); in xfs_buffered_write_iomap_begin()
1059 error = xfs_bmbt_to_iomap(ip, srcmap, &imap, 0); in xfs_buffered_write_iomap_begin()
1064 imap.br_startoff - offset_fsb); in xfs_buffered_write_iomap_begin()
1066 return xfs_bmbt_to_iomap(ip, iomap, &cmap, IOMAP_F_SHARED); in xfs_buffered_write_iomap_begin()
1069 xfs_iunlock(ip, XFS_ILOCK_EXCL); in xfs_buffered_write_iomap_begin()
1082 struct xfs_inode *ip = XFS_I(inode); in xfs_buffered_write_iomap_end() local
1083 struct xfs_mount *mp = ip->i_mount; in xfs_buffered_write_iomap_end()
1088 if (iomap->type != IOMAP_DELALLOC) in xfs_buffered_write_iomap_end()
1096 iomap->flags |= IOMAP_F_NEW; in xfs_buffered_write_iomap_end()
1112 * Trim delalloc blocks if they were allocated by this write and we in xfs_buffered_write_iomap_end()
1117 * blocks in the range, they are ours. in xfs_buffered_write_iomap_end()
1119 if ((iomap->flags & IOMAP_F_NEW) && start_fsb < end_fsb) { in xfs_buffered_write_iomap_end()
1120 truncate_pagecache_range(VFS_I(ip), XFS_FSB_TO_B(mp, start_fsb), in xfs_buffered_write_iomap_end()
1121 XFS_FSB_TO_B(mp, end_fsb) - 1); in xfs_buffered_write_iomap_end()
1123 error = xfs_bmap_punch_delalloc_range(ip, start_fsb, in xfs_buffered_write_iomap_end()
1124 end_fsb - start_fsb); in xfs_buffered_write_iomap_end()
1127 __func__, ip->i_ino); in xfs_buffered_write_iomap_end()
1149 struct xfs_inode *ip = XFS_I(inode); in xfs_read_iomap_begin() local
1150 struct xfs_mount *mp = ip->i_mount; in xfs_read_iomap_begin()
1161 return -EIO; in xfs_read_iomap_begin()
1163 error = xfs_ilock_for_iomap(ip, flags, &lockmode); in xfs_read_iomap_begin()
1166 error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, in xfs_read_iomap_begin()
1169 error = xfs_reflink_trim_around_shared(ip, &imap, &shared); in xfs_read_iomap_begin()
1170 xfs_iunlock(ip, lockmode); in xfs_read_iomap_begin()
1174 trace_xfs_iomap_found(ip, offset, length, XFS_DATA_FORK, &imap); in xfs_read_iomap_begin()
1175 return xfs_bmbt_to_iomap(ip, iomap, &imap, shared ? IOMAP_F_SHARED : 0); in xfs_read_iomap_begin()
1191 struct xfs_inode *ip = XFS_I(inode); in xfs_seek_iomap_begin() local
1192 struct xfs_mount *mp = ip->i_mount; in xfs_seek_iomap_begin()
1202 return -EIO; in xfs_seek_iomap_begin()
1204 lockmode = xfs_ilock_data_map_shared(ip); in xfs_seek_iomap_begin()
1205 if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) { in xfs_seek_iomap_begin()
1206 error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); in xfs_seek_iomap_begin()
1211 if (xfs_iext_lookup_extent(ip, &ip->i_df, offset_fsb, &icur, &imap)) { in xfs_seek_iomap_begin()
1226 * If a COW fork extent covers the hole, report it - capped to the next in xfs_seek_iomap_begin()
1229 if (xfs_inode_has_cow_data(ip) && in xfs_seek_iomap_begin()
1230 xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, &cmap)) in xfs_seek_iomap_begin()
1236 error = xfs_bmbt_to_iomap(ip, iomap, &cmap, IOMAP_F_SHARED); in xfs_seek_iomap_begin()
1242 iomap->type = IOMAP_UNWRITTEN; in xfs_seek_iomap_begin()
1250 imap.br_blockcount = cow_fsb - offset_fsb; in xfs_seek_iomap_begin()
1252 imap.br_blockcount = data_fsb - offset_fsb; in xfs_seek_iomap_begin()
1258 error = xfs_bmbt_to_iomap(ip, iomap, &imap, 0); in xfs_seek_iomap_begin()
1260 xfs_iunlock(ip, lockmode); in xfs_seek_iomap_begin()
1277 struct xfs_inode *ip = XFS_I(inode); in xfs_xattr_iomap_begin() local
1278 struct xfs_mount *mp = ip->i_mount; in xfs_xattr_iomap_begin()
1286 return -EIO; in xfs_xattr_iomap_begin()
1288 lockmode = xfs_ilock_attr_map_shared(ip); in xfs_xattr_iomap_begin()
1291 if (!XFS_IFORK_Q(ip) || !ip->i_afp->if_nextents) { in xfs_xattr_iomap_begin()
1292 error = -ENOENT; in xfs_xattr_iomap_begin()
1296 ASSERT(ip->i_afp->if_format != XFS_DINODE_FMT_LOCAL); in xfs_xattr_iomap_begin()
1297 error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, in xfs_xattr_iomap_begin()
1300 xfs_iunlock(ip, lockmode); in xfs_xattr_iomap_begin()
1305 return xfs_bmbt_to_iomap(ip, iomap, &imap, 0); in xfs_xattr_iomap_begin()