Lines Matching +full:bat +full:- +full:temp
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2006 Silicon Graphics, Inc.
70 * leaf entries, is controlled by the size of the on-disk extent count. in xfs_bmap_compute_maxlevels()
88 minleafrecs = mp->m_bmap_dmnr[0]; in xfs_bmap_compute_maxlevels()
89 minnoderecs = mp->m_bmap_dmnr[1]; in xfs_bmap_compute_maxlevels()
97 mp->m_bm_maxlevels[whichfork] = level; in xfs_bmap_compute_maxlevels()
98 ASSERT(mp->m_bm_maxlevels[whichfork] <= xfs_bmbt_maxlevels_ondisk()); in xfs_bmap_compute_maxlevels()
105 if (mp->m_sb.sb_inodesize == 256) in xfs_bmap_compute_attr_offset()
106 return XFS_LITINO(mp) - xfs_bmdr_space_calc(MINABTPTRS); in xfs_bmap_compute_attr_offset()
116 cur->bc_rec.b = *irec; in xfs_bmbt_lookup_eq()
125 cur->bc_rec.b.br_startoff = 0; in xfs_bmbt_lookup_first()
126 cur->bc_rec.b.br_startblock = 0; in xfs_bmbt_lookup_first()
127 cur->bc_rec.b.br_blockcount = 0; in xfs_bmbt_lookup_first()
139 ifp->if_format == XFS_DINODE_FMT_EXTENTS && in xfs_bmap_needs_btree()
140 ifp->if_nextents > XFS_IFORK_MAXEXT(ip, whichfork); in xfs_bmap_needs_btree()
151 ifp->if_format == XFS_DINODE_FMT_BTREE && in xfs_bmap_wants_extents()
152 ifp->if_nextents <= XFS_IFORK_MAXEXT(ip, whichfork); in xfs_bmap_wants_extents()
171 * Compute the worst-case number of indirect blocks that will be used
184 mp = ip->i_mount; in xfs_bmap_worst_indlen()
185 maxrecs = mp->m_bmap_dmxr[0]; in xfs_bmap_worst_indlen()
189 len += maxrecs - 1; in xfs_bmap_worst_indlen()
193 return rval + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - in xfs_bmap_worst_indlen()
194 level - 1; in xfs_bmap_worst_indlen()
196 maxrecs = mp->m_bmap_dmxr[1]; in xfs_bmap_worst_indlen()
208 if (ip->i_df.if_format == XFS_DINODE_FMT_DEV) in xfs_default_attroffset()
210 return M_IGEO(ip->i_mount)->attr_fork_offset; in xfs_default_attroffset()
215 * from local to extent format - we reset it where possible to make space
224 ip->i_df.if_format != XFS_DINODE_FMT_DEV && in xfs_bmap_forkoff_reset()
225 ip->i_df.if_format != XFS_DINODE_FMT_BTREE) { in xfs_bmap_forkoff_reset()
228 if (dfl_forkoff > ip->i_forkoff) in xfs_bmap_forkoff_reset()
229 ip->i_forkoff = dfl_forkoff; in xfs_bmap_forkoff_reset()
244 return -EFSCORRUPTED; in xfs_bmap_read_buf()
245 error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, in xfs_bmap_read_buf()
246 XFS_FSB_TO_DADDR(mp, fsbno), mp->m_bsize, 0, &bp, in xfs_bmap_read_buf()
267 for (i = 0; i < cur->bc_maxlevels; i++) { in xfs_bmap_get_bp()
268 if (!cur->bc_levels[i].bp) in xfs_bmap_get_bp()
270 if (xfs_buf_daddr(cur->bc_levels[i].bp) == bno) in xfs_bmap_get_bp()
271 return cur->bc_levels[i].bp; in xfs_bmap_get_bp()
275 list_for_each_entry(lip, &cur->bc_tp->t_items, li_trans) { in xfs_bmap_get_bp()
278 if (bip->bli_item.li_type == XFS_LI_BUF && in xfs_bmap_get_bp()
279 xfs_buf_daddr(bip->bli_buf) == bno) in xfs_bmap_get_bp()
280 return bip->bli_buf; in xfs_bmap_get_bp()
297 ASSERT(be16_to_cpu(block->bb_level) > 0); in xfs_check_block()
301 dmxr = mp->m_bmap_dmxr[0]; in xfs_check_block()
305 ASSERT(be64_to_cpu(prevp->br_startoff) < in xfs_check_block()
306 be64_to_cpu(keyp->br_startoff)); in xfs_check_block()
318 for (j = i+1; j <= be16_to_cpu(block->bb_numrecs); j++) { in xfs_check_block()
348 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_check_leaf_extents()
362 if (ifp->if_format != XFS_DINODE_FMT_BTREE) in xfs_bmap_check_leaf_extents()
366 if (ip->i_df.if_nextents > 10000) in xfs_bmap_check_leaf_extents()
370 block = ifp->if_broot; in xfs_bmap_check_leaf_extents()
374 level = be16_to_cpu(block->bb_level); in xfs_bmap_check_leaf_extents()
376 xfs_check_block(block, mp, 1, ifp->if_broot_bytes); in xfs_bmap_check_leaf_extents()
377 pp = xfs_bmap_broot_ptr_addr(mp, block, 1, ifp->if_broot_bytes); in xfs_bmap_check_leaf_extents()
381 ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); in xfs_bmap_check_leaf_extents()
382 ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); in xfs_bmap_check_leaf_extents()
388 while (level-- > 0) { in xfs_bmap_check_leaf_extents()
410 pp = xfs_bmbt_ptr_addr(mp, block, 1, mp->m_bmap_dmxr[1]); in xfs_bmap_check_leaf_extents()
414 error = -EFSCORRUPTED; in xfs_bmap_check_leaf_extents()
439 * Read-ahead the next leaf block, if any. in xfs_bmap_check_leaf_extents()
442 nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); in xfs_bmap_check_leaf_extents()
536 mval[i - 1].br_startoff + mval[i - 1].br_blockcount == in xfs_bmap_validate_ret()
558 * Since the extents are already in-core, all we have to do is give up the space
570 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_btree_to_extents()
571 struct xfs_btree_block *rblock = ifp->if_broot; in xfs_bmap_btree_to_extents()
585 ASSERT(ifp->if_format == XFS_DINODE_FMT_BTREE); in xfs_bmap_btree_to_extents()
586 ASSERT(be16_to_cpu(rblock->bb_level) == 1); in xfs_bmap_btree_to_extents()
587 ASSERT(be16_to_cpu(rblock->bb_numrecs) == 1); in xfs_bmap_btree_to_extents()
588 ASSERT(xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, false) == 1); in xfs_bmap_btree_to_extents()
590 pp = xfs_bmap_broot_ptr_addr(mp, rblock, 1, ifp->if_broot_bytes); in xfs_bmap_btree_to_extents()
593 if (XFS_IS_CORRUPT(cur->bc_mp, !xfs_verify_fsbno(mp, cbno))) { in xfs_bmap_btree_to_extents()
595 return -EFSCORRUPTED; in xfs_bmap_btree_to_extents()
607 xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, whichfork); in xfs_bmap_btree_to_extents()
608 error = xfs_free_extent_later(cur->bc_tp, cbno, 1, &oinfo, in xfs_bmap_btree_to_extents()
613 ip->i_nblocks--; in xfs_bmap_btree_to_extents()
614 xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); in xfs_bmap_btree_to_extents()
616 if (cur->bc_levels[0].bp == cbp) in xfs_bmap_btree_to_extents()
617 cur->bc_levels[0].bp = NULL; in xfs_bmap_btree_to_extents()
619 ASSERT(ifp->if_broot == NULL); in xfs_bmap_btree_to_extents()
620 ifp->if_format = XFS_DINODE_FMT_EXTENTS; in xfs_bmap_btree_to_extents()
626 * Convert an extents-format file into a btree-format file.
653 mp = ip->i_mount; in xfs_bmap_extents_to_btree()
656 ASSERT(ifp->if_format == XFS_DINODE_FMT_EXTENTS); in xfs_bmap_extents_to_btree()
673 cur->bc_flags |= XFS_BTREE_BMBT_WASDEL; in xfs_bmap_extents_to_btree()
677 ifp->if_format = XFS_DINODE_FMT_BTREE; in xfs_bmap_extents_to_btree()
681 xfs_rmap_ino_bmbt_owner(&args.oinfo, ip->i_ino, whichfork); in xfs_bmap_extents_to_btree()
687 XFS_INO_TO_FSB(mp, ip->i_ino)); in xfs_bmap_extents_to_btree()
695 error = -ENOSPC; in xfs_bmap_extents_to_btree()
699 cur->bc_bmap.allocated++; in xfs_bmap_extents_to_btree()
700 ip->i_nblocks++; in xfs_bmap_extents_to_btree()
702 error = xfs_trans_get_buf(tp, mp->m_ddev_targp, in xfs_bmap_extents_to_btree()
704 mp->m_bsize, 0, &abp); in xfs_bmap_extents_to_btree()
721 ASSERT(cnt == ifp->if_nextents); in xfs_bmap_extents_to_btree()
729 kp->br_startoff = cpu_to_be64(xfs_bmbt_disk_get_startoff(arp)); in xfs_bmap_extents_to_btree()
731 be16_to_cpu(block->bb_level))); in xfs_bmap_extents_to_btree()
739 xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); in xfs_bmap_extents_to_btree()
746 xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); in xfs_bmap_extents_to_btree()
749 ifp->if_format = XFS_DINODE_FMT_EXTENTS; in xfs_bmap_extents_to_btree()
750 ASSERT(ifp->if_broot == NULL); in xfs_bmap_extents_to_btree()
760 * (The bmap-level manipulations are ok, though).
771 ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); in xfs_bmap_local_to_extents_empty()
772 ASSERT(ifp->if_bytes == 0); in xfs_bmap_local_to_extents_empty()
773 ASSERT(ifp->if_nextents == 0); in xfs_bmap_local_to_extents_empty()
776 ifp->if_data = NULL; in xfs_bmap_local_to_extents_empty()
777 ifp->if_height = 0; in xfs_bmap_local_to_extents_empty()
778 ifp->if_format = XFS_DINODE_FMT_EXTENTS; in xfs_bmap_local_to_extents_empty()
808 ASSERT(!(S_ISREG(VFS_I(ip)->i_mode) && whichfork == XFS_DATA_FORK)); in xfs_bmap_local_to_extents()
810 ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); in xfs_bmap_local_to_extents()
812 if (!ifp->if_bytes) { in xfs_bmap_local_to_extents()
822 args.mp = ip->i_mount; in xfs_bmap_local_to_extents()
825 xfs_rmap_ino_owner(&args.oinfo, ip->i_ino, whichfork, 0); in xfs_bmap_local_to_extents()
834 XFS_INO_TO_FSB(args.mp, ip->i_ino)); in xfs_bmap_local_to_extents()
841 error = xfs_trans_get_buf(tp, args.mp->m_ddev_targp, in xfs_bmap_local_to_extents()
843 args.mp->m_bsize, 0, &bp); in xfs_bmap_local_to_extents()
858 xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); in xfs_bmap_local_to_extents()
862 ifp->if_data = NULL; in xfs_bmap_local_to_extents()
863 ifp->if_height = 0; in xfs_bmap_local_to_extents()
872 ifp->if_nextents = 1; in xfs_bmap_local_to_extents()
873 ip->i_nblocks = 1; in xfs_bmap_local_to_extents()
891 struct xfs_btree_block *block = ip->i_df.if_broot; in xfs_bmap_add_attrfork_btree()
897 mp = ip->i_mount; in xfs_bmap_add_attrfork_btree()
909 error = -EFSCORRUPTED; in xfs_bmap_add_attrfork_btree()
916 return -ENOSPC; in xfs_bmap_add_attrfork_btree()
918 cur->bc_bmap.allocated = 0; in xfs_bmap_add_attrfork_btree()
939 if (ip->i_df.if_nextents * sizeof(struct xfs_bmbt_rec) <= in xfs_bmap_add_attrfork_extents()
946 cur->bc_bmap.allocated = 0; in xfs_bmap_add_attrfork_extents()
960 * formatting callout. It should be possible - it's just a very complex
971 if (ip->i_df.if_bytes <= xfs_inode_data_fork_size(ip)) in xfs_bmap_add_attrfork_local()
974 if (S_ISDIR(VFS_I(ip)->i_mode)) { in xfs_bmap_add_attrfork_local()
976 dargs.geo = ip->i_mount->m_dir_geo; in xfs_bmap_add_attrfork_local()
978 dargs.total = dargs.geo->fsbcount; in xfs_bmap_add_attrfork_local()
981 dargs.owner = ip->i_ino; in xfs_bmap_add_attrfork_local()
985 if (S_ISLNK(VFS_I(ip)->i_mode)) in xfs_bmap_add_attrfork_local()
993 return -EFSCORRUPTED; in xfs_bmap_add_attrfork_local()
1007 switch (ip->i_df.if_format) { in xfs_bmap_set_attrforkoff()
1009 ip->i_forkoff = default_size; in xfs_bmap_set_attrforkoff()
1014 ip->i_forkoff = xfs_attr_shortform_bytesfit(ip, size); in xfs_bmap_set_attrforkoff()
1015 if (!ip->i_forkoff) in xfs_bmap_set_attrforkoff()
1016 ip->i_forkoff = default_size; in xfs_bmap_set_attrforkoff()
1017 else if (xfs_has_attr2(ip->i_mount) && version) in xfs_bmap_set_attrforkoff()
1022 return -EINVAL; in xfs_bmap_set_attrforkoff()
1029 * Convert inode from non-attributed to attributed. Caller must hold the
1039 struct xfs_mount *mp = tp->t_mountp; in xfs_bmap_add_attrfork()
1056 switch (ip->i_df.if_format) { in xfs_bmap_add_attrfork()
1078 spin_lock(&mp->m_sb_lock); in xfs_bmap_add_attrfork()
1087 spin_unlock(&mp->m_sb_lock); in xfs_bmap_add_attrfork()
1111 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_complain_bad_rec()
1123 ip->i_ino, forkname, fa); in xfs_bmap_complain_bad_rec()
1126 irec->br_startoff, irec->br_startblock, irec->br_blockcount, in xfs_bmap_complain_bad_rec()
1127 irec->br_state); in xfs_bmap_complain_bad_rec()
1129 return -EFSCORRUPTED; in xfs_bmap_complain_bad_rec()
1140 struct xfs_mount *mp = cur->bc_mp; in xfs_iread_bmbt_block()
1141 struct xfs_inode *ip = cur->bc_ino.ip; in xfs_iread_bmbt_block()
1147 int whichfork = cur->bc_ino.whichfork; in xfs_iread_bmbt_block()
1154 if (unlikely(ir->loaded + num_recs > ifp->if_nextents)) { in xfs_iread_bmbt_block()
1155 xfs_warn(ip->i_mount, "corrupt dinode %llu, (btree extents).", in xfs_iread_bmbt_block()
1156 (unsigned long long)ip->i_ino); in xfs_iread_bmbt_block()
1157 xfs_inode_verifier_error(ip, -EFSCORRUPTED, __func__, block, in xfs_iread_bmbt_block()
1160 return -EFSCORRUPTED; in xfs_iread_bmbt_block()
1165 for (j = 0; j < num_recs; j++, frp++, ir->loaded++) { in xfs_iread_bmbt_block()
1172 xfs_inode_verifier_error(ip, -EFSCORRUPTED, in xfs_iread_bmbt_block()
1179 xfs_iext_insert(ip, &ir->icur, &new, in xfs_iread_bmbt_block()
1181 trace_xfs_read_extent(ip, &ir->icur, in xfs_iread_bmbt_block()
1183 xfs_iext_next(ifp, &ir->icur); in xfs_iread_bmbt_block()
1190 * Read in extents from a btree-format inode.
1200 struct xfs_mount *mp = ip->i_mount; in xfs_iread_extents()
1218 if (XFS_IS_CORRUPT(mp, ir.loaded != ifp->if_nextents)) { in xfs_iread_extents()
1220 error = -EFSCORRUPTED; in xfs_iread_extents()
1229 smp_store_release(&ifp->if_needextents, 0); in xfs_iread_extents()
1241 * lowest-address hole if the fork has holes, else the first block past the end
1242 * of fork. Return 0 if the fork is currently local (in-inode).
1259 if (ifp->if_format == XFS_DINODE_FMT_LOCAL) { in xfs_bmap_first_unused()
1276 got.br_startoff - max >= len) in xfs_bmap_first_unused()
1287 * Returns the file-relative block number of the last block - 1 before
1304 switch (ifp->if_format) { in xfs_bmap_last_before()
1314 return -EFSCORRUPTED; in xfs_bmap_last_before()
1356 * Returns 1 in bma->aeof if the file (fork) is empty as any new write will be
1368 bma->aeof = false; in xfs_bmap_isaeof()
1369 error = xfs_bmap_last_extent(NULL, bma->ip, whichfork, &rec, in xfs_bmap_isaeof()
1375 bma->aeof = true; in xfs_bmap_isaeof()
1383 bma->aeof = bma->offset >= rec.br_startoff + rec.br_blockcount || in xfs_bmap_isaeof()
1384 (bma->offset >= rec.br_startoff && in xfs_bmap_isaeof()
1390 * Returns the file-relative block number of the first block past eof in
1407 if (ifp->if_format == XFS_DINODE_FMT_LOCAL) in xfs_bmap_last_offset()
1410 if (XFS_IS_CORRUPT(ip->i_mount, !xfs_ifork_has_extents(ifp))) { in xfs_bmap_last_offset()
1412 return -EFSCORRUPTED; in xfs_bmap_last_offset()
1434 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_same_rtgroup()
1437 if (xfs_rtb_to_rgno(mp, left->br_startblock) != in xfs_bmap_same_rtgroup()
1438 xfs_rtb_to_rgno(mp, right->br_startblock)) in xfs_bmap_same_rtgroup()
1453 struct xfs_mount *mp = bma->ip->i_mount; in xfs_bmap_add_extent_delay_real()
1454 struct xfs_ifork *ifp = xfs_ifork_ptr(bma->ip, whichfork); in xfs_bmap_add_extent_delay_real()
1455 struct xfs_bmbt_irec *new = &bma->got; in xfs_bmap_add_extent_delay_real()
1457 int i; /* temp state */ in xfs_bmap_add_extent_delay_real()
1465 xfs_filblks_t temp=0; /* value for da_new calculations */ in xfs_bmap_add_extent_delay_real() local
1470 ASSERT(!isnullstartblock(new->br_startblock)); in xfs_bmap_add_extent_delay_real()
1471 ASSERT(!bma->cur || (bma->cur->bc_flags & XFS_BTREE_BMBT_WASDEL)); in xfs_bmap_add_extent_delay_real()
1482 xfs_iext_get_extent(ifp, &bma->icur, &PREV); in xfs_bmap_add_extent_delay_real()
1483 new_endoff = new->br_startoff + new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1485 ASSERT(PREV.br_startoff <= new->br_startoff); in xfs_bmap_add_extent_delay_real()
1495 if (PREV.br_startoff == new->br_startoff) in xfs_bmap_add_extent_delay_real()
1504 if (xfs_iext_peek_prev_extent(ifp, &bma->icur, &LEFT)) { in xfs_bmap_add_extent_delay_real()
1511 LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && in xfs_bmap_add_extent_delay_real()
1512 LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && in xfs_bmap_add_extent_delay_real()
1513 LEFT.br_state == new->br_state && in xfs_bmap_add_extent_delay_real()
1514 LEFT.br_blockcount + new->br_blockcount <= XFS_MAX_BMBT_EXTLEN && in xfs_bmap_add_extent_delay_real()
1515 xfs_bmap_same_rtgroup(bma->ip, whichfork, &LEFT, new)) in xfs_bmap_add_extent_delay_real()
1521 * Also check for all-three-contiguous being too large. in xfs_bmap_add_extent_delay_real()
1523 if (xfs_iext_peek_next_extent(ifp, &bma->icur, &RIGHT)) { in xfs_bmap_add_extent_delay_real()
1531 new->br_startblock + new->br_blockcount == RIGHT.br_startblock && in xfs_bmap_add_extent_delay_real()
1532 new->br_state == RIGHT.br_state && in xfs_bmap_add_extent_delay_real()
1533 new->br_blockcount + RIGHT.br_blockcount <= XFS_MAX_BMBT_EXTLEN && in xfs_bmap_add_extent_delay_real()
1538 LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount in xfs_bmap_add_extent_delay_real()
1540 xfs_bmap_same_rtgroup(bma->ip, whichfork, new, &RIGHT)) in xfs_bmap_add_extent_delay_real()
1557 xfs_iext_remove(bma->ip, &bma->icur, state); in xfs_bmap_add_extent_delay_real()
1558 xfs_iext_remove(bma->ip, &bma->icur, state); in xfs_bmap_add_extent_delay_real()
1559 xfs_iext_prev(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1560 xfs_iext_update_extent(bma->ip, state, &bma->icur, &LEFT); in xfs_bmap_add_extent_delay_real()
1561 ifp->if_nextents--; in xfs_bmap_add_extent_delay_real()
1563 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1567 error = xfs_bmbt_lookup_eq(bma->cur, &RIGHT, &i); in xfs_bmap_add_extent_delay_real()
1571 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1572 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1575 error = xfs_btree_delete(bma->cur, &i); in xfs_bmap_add_extent_delay_real()
1579 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1580 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1583 error = xfs_btree_decrement(bma->cur, 0, &i); in xfs_bmap_add_extent_delay_real()
1587 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1588 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1591 error = xfs_bmbt_update(bma->cur, &LEFT); in xfs_bmap_add_extent_delay_real()
1606 xfs_iext_remove(bma->ip, &bma->icur, state); in xfs_bmap_add_extent_delay_real()
1607 xfs_iext_prev(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1608 xfs_iext_update_extent(bma->ip, state, &bma->icur, &LEFT); in xfs_bmap_add_extent_delay_real()
1610 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1614 error = xfs_bmbt_lookup_eq(bma->cur, &old, &i); in xfs_bmap_add_extent_delay_real()
1618 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1619 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1622 error = xfs_bmbt_update(bma->cur, &LEFT); in xfs_bmap_add_extent_delay_real()
1633 * with delay -> unwritten extent allocation here because the in xfs_bmap_add_extent_delay_real()
1636 PREV.br_startblock = new->br_startblock; in xfs_bmap_add_extent_delay_real()
1638 PREV.br_state = new->br_state; in xfs_bmap_add_extent_delay_real()
1640 xfs_iext_next(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1641 xfs_iext_remove(bma->ip, &bma->icur, state); in xfs_bmap_add_extent_delay_real()
1642 xfs_iext_prev(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1643 xfs_iext_update_extent(bma->ip, state, &bma->icur, &PREV); in xfs_bmap_add_extent_delay_real()
1645 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1649 error = xfs_bmbt_lookup_eq(bma->cur, &RIGHT, &i); in xfs_bmap_add_extent_delay_real()
1653 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1654 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1657 error = xfs_bmbt_update(bma->cur, &PREV); in xfs_bmap_add_extent_delay_real()
1670 PREV.br_startblock = new->br_startblock; in xfs_bmap_add_extent_delay_real()
1671 PREV.br_state = new->br_state; in xfs_bmap_add_extent_delay_real()
1672 xfs_iext_update_extent(bma->ip, state, &bma->icur, &PREV); in xfs_bmap_add_extent_delay_real()
1673 ifp->if_nextents++; in xfs_bmap_add_extent_delay_real()
1675 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1679 error = xfs_bmbt_lookup_eq(bma->cur, new, &i); in xfs_bmap_add_extent_delay_real()
1683 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1684 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1687 error = xfs_btree_insert(bma->cur, &i); in xfs_bmap_add_extent_delay_real()
1691 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1692 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1705 temp = PREV.br_blockcount - new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1706 da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), in xfs_bmap_add_extent_delay_real()
1709 LEFT.br_blockcount += new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1711 PREV.br_blockcount = temp; in xfs_bmap_add_extent_delay_real()
1712 PREV.br_startoff += new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1715 xfs_iext_update_extent(bma->ip, state, &bma->icur, &PREV); in xfs_bmap_add_extent_delay_real()
1716 xfs_iext_prev(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1717 xfs_iext_update_extent(bma->ip, state, &bma->icur, &LEFT); in xfs_bmap_add_extent_delay_real()
1719 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1723 error = xfs_bmbt_lookup_eq(bma->cur, &old, &i); in xfs_bmap_add_extent_delay_real()
1727 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1728 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1731 error = xfs_bmbt_update(bma->cur, &LEFT); in xfs_bmap_add_extent_delay_real()
1743 xfs_iext_update_extent(bma->ip, state, &bma->icur, new); in xfs_bmap_add_extent_delay_real()
1744 ifp->if_nextents++; in xfs_bmap_add_extent_delay_real()
1746 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1750 error = xfs_bmbt_lookup_eq(bma->cur, new, &i); in xfs_bmap_add_extent_delay_real()
1754 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1755 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1758 error = xfs_btree_insert(bma->cur, &i); in xfs_bmap_add_extent_delay_real()
1762 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1763 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1768 if (xfs_bmap_needs_btree(bma->ip, whichfork)) { in xfs_bmap_add_extent_delay_real()
1769 error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, in xfs_bmap_add_extent_delay_real()
1770 &bma->cur, 1, &tmp_rval, whichfork); in xfs_bmap_add_extent_delay_real()
1776 temp = PREV.br_blockcount - new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1777 da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), in xfs_bmap_add_extent_delay_real()
1778 startblockval(PREV.br_startblock) - in xfs_bmap_add_extent_delay_real()
1779 (bma->cur ? bma->cur->bc_bmap.allocated : 0)); in xfs_bmap_add_extent_delay_real()
1782 PREV.br_blockcount = temp; in xfs_bmap_add_extent_delay_real()
1784 xfs_iext_next(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1785 xfs_iext_insert(bma->ip, &bma->icur, &PREV, state); in xfs_bmap_add_extent_delay_real()
1786 xfs_iext_prev(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1795 RIGHT.br_startoff = new->br_startoff; in xfs_bmap_add_extent_delay_real()
1796 RIGHT.br_startblock = new->br_startblock; in xfs_bmap_add_extent_delay_real()
1797 RIGHT.br_blockcount += new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1799 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1803 error = xfs_bmbt_lookup_eq(bma->cur, &old, &i); in xfs_bmap_add_extent_delay_real()
1807 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1808 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1811 error = xfs_bmbt_update(bma->cur, &RIGHT); in xfs_bmap_add_extent_delay_real()
1816 temp = PREV.br_blockcount - new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1817 da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), in xfs_bmap_add_extent_delay_real()
1820 PREV.br_blockcount = temp; in xfs_bmap_add_extent_delay_real()
1823 xfs_iext_update_extent(bma->ip, state, &bma->icur, &PREV); in xfs_bmap_add_extent_delay_real()
1824 xfs_iext_next(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1825 xfs_iext_update_extent(bma->ip, state, &bma->icur, &RIGHT); in xfs_bmap_add_extent_delay_real()
1834 xfs_iext_update_extent(bma->ip, state, &bma->icur, new); in xfs_bmap_add_extent_delay_real()
1835 ifp->if_nextents++; in xfs_bmap_add_extent_delay_real()
1837 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1841 error = xfs_bmbt_lookup_eq(bma->cur, new, &i); in xfs_bmap_add_extent_delay_real()
1845 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1846 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1849 error = xfs_btree_insert(bma->cur, &i); in xfs_bmap_add_extent_delay_real()
1853 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1854 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1859 if (xfs_bmap_needs_btree(bma->ip, whichfork)) { in xfs_bmap_add_extent_delay_real()
1860 error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, in xfs_bmap_add_extent_delay_real()
1861 &bma->cur, 1, &tmp_rval, whichfork); in xfs_bmap_add_extent_delay_real()
1867 temp = PREV.br_blockcount - new->br_blockcount; in xfs_bmap_add_extent_delay_real()
1868 da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), in xfs_bmap_add_extent_delay_real()
1869 startblockval(PREV.br_startblock) - in xfs_bmap_add_extent_delay_real()
1870 (bma->cur ? bma->cur->bc_bmap.allocated : 0)); in xfs_bmap_add_extent_delay_real()
1873 PREV.br_blockcount = temp; in xfs_bmap_add_extent_delay_real()
1874 xfs_iext_insert(bma->ip, &bma->icur, &PREV, state); in xfs_bmap_add_extent_delay_real()
1875 xfs_iext_next(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1909 PREV.br_startoff + PREV.br_blockcount - new_endoff; in xfs_bmap_add_extent_delay_real()
1911 nullstartblock(xfs_bmap_worst_indlen(bma->ip, in xfs_bmap_add_extent_delay_real()
1915 PREV.br_blockcount = new->br_startoff - PREV.br_startoff; in xfs_bmap_add_extent_delay_real()
1917 nullstartblock(xfs_bmap_worst_indlen(bma->ip, in xfs_bmap_add_extent_delay_real()
1919 xfs_iext_update_extent(bma->ip, state, &bma->icur, &PREV); in xfs_bmap_add_extent_delay_real()
1921 xfs_iext_next(ifp, &bma->icur); in xfs_bmap_add_extent_delay_real()
1922 xfs_iext_insert(bma->ip, &bma->icur, &RIGHT, state); in xfs_bmap_add_extent_delay_real()
1923 xfs_iext_insert(bma->ip, &bma->icur, &LEFT, state); in xfs_bmap_add_extent_delay_real()
1924 ifp->if_nextents++; in xfs_bmap_add_extent_delay_real()
1926 if (bma->cur == NULL) in xfs_bmap_add_extent_delay_real()
1930 error = xfs_bmbt_lookup_eq(bma->cur, new, &i); in xfs_bmap_add_extent_delay_real()
1934 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1935 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1938 error = xfs_btree_insert(bma->cur, &i); in xfs_bmap_add_extent_delay_real()
1942 xfs_btree_mark_sick(bma->cur); in xfs_bmap_add_extent_delay_real()
1943 error = -EFSCORRUPTED; in xfs_bmap_add_extent_delay_real()
1948 if (xfs_bmap_needs_btree(bma->ip, whichfork)) { in xfs_bmap_add_extent_delay_real()
1949 error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, in xfs_bmap_add_extent_delay_real()
1950 &bma->cur, 1, &tmp_rval, whichfork); in xfs_bmap_add_extent_delay_real()
1974 if (!(bma->flags & XFS_BMAPI_NORMAP)) in xfs_bmap_add_extent_delay_real()
1975 xfs_rmap_map_extent(bma->tp, bma->ip, whichfork, new); in xfs_bmap_add_extent_delay_real()
1978 if (xfs_bmap_needs_btree(bma->ip, whichfork)) { in xfs_bmap_add_extent_delay_real()
1981 ASSERT(bma->cur == NULL); in xfs_bmap_add_extent_delay_real()
1982 error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, in xfs_bmap_add_extent_delay_real()
1983 &bma->cur, da_old > 0, &tmp_logflags, in xfs_bmap_add_extent_delay_real()
1985 bma->logflags |= tmp_logflags; in xfs_bmap_add_extent_delay_real()
1991 xfs_mod_delalloc(bma->ip, 0, (int64_t)da_new - da_old); in xfs_bmap_add_extent_delay_real()
1993 if (bma->cur) { in xfs_bmap_add_extent_delay_real()
1994 da_new += bma->cur->bc_bmap.allocated; in xfs_bmap_add_extent_delay_real()
1995 bma->cur->bc_bmap.allocated = 0; in xfs_bmap_add_extent_delay_real()
2000 xfs_add_fdblocks(mp, da_old - da_new); in xfs_bmap_add_extent_delay_real()
2002 error = xfs_dec_fdblocks(mp, da_new - da_old, true); in xfs_bmap_add_extent_delay_real()
2004 xfs_bmap_check_leaf_extents(bma->cur, bma->ip, whichfork); in xfs_bmap_add_extent_delay_real()
2007 bma->logflags |= rval; in xfs_bmap_add_extent_delay_real()
2029 int i; /* temp state */ in xfs_bmap_add_extent_unwritten_real()
2036 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_add_extent_unwritten_real()
2044 ASSERT(!isnullstartblock(new->br_startblock)); in xfs_bmap_add_extent_unwritten_real()
2057 ASSERT(new->br_state != PREV.br_state); in xfs_bmap_add_extent_unwritten_real()
2058 new_endoff = new->br_startoff + new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2059 ASSERT(PREV.br_startoff <= new->br_startoff); in xfs_bmap_add_extent_unwritten_real()
2066 if (PREV.br_startoff == new->br_startoff) in xfs_bmap_add_extent_unwritten_real()
2082 LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && in xfs_bmap_add_extent_unwritten_real()
2083 LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && in xfs_bmap_add_extent_unwritten_real()
2084 LEFT.br_state == new->br_state && in xfs_bmap_add_extent_unwritten_real()
2085 LEFT.br_blockcount + new->br_blockcount <= XFS_MAX_BMBT_EXTLEN && in xfs_bmap_add_extent_unwritten_real()
2092 * Also check for all-three-contiguous being too large. in xfs_bmap_add_extent_unwritten_real()
2102 new->br_startblock + new->br_blockcount == RIGHT.br_startblock && in xfs_bmap_add_extent_unwritten_real()
2103 new->br_state == RIGHT.br_state && in xfs_bmap_add_extent_unwritten_real()
2104 new->br_blockcount + RIGHT.br_blockcount <= XFS_MAX_BMBT_EXTLEN && in xfs_bmap_add_extent_unwritten_real()
2109 LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount in xfs_bmap_add_extent_unwritten_real()
2131 ifp->if_nextents -= 2; in xfs_bmap_add_extent_unwritten_real()
2141 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2148 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2155 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2162 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2169 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2188 ifp->if_nextents--; in xfs_bmap_add_extent_unwritten_real()
2198 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2205 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2212 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2227 PREV.br_state = new->br_state; in xfs_bmap_add_extent_unwritten_real()
2233 ifp->if_nextents--; in xfs_bmap_add_extent_unwritten_real()
2244 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2251 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2258 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2273 PREV.br_state = new->br_state; in xfs_bmap_add_extent_unwritten_real()
2285 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2299 LEFT.br_blockcount += new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2302 PREV.br_startoff += new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2303 PREV.br_startblock += new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2304 PREV.br_blockcount -= new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2319 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2340 PREV.br_startoff += new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2341 PREV.br_startblock += new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2342 PREV.br_blockcount -= new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2346 ifp->if_nextents++; in xfs_bmap_add_extent_unwritten_real()
2357 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2363 cur->bc_rec.b = *new; in xfs_bmap_add_extent_unwritten_real()
2368 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2380 PREV.br_blockcount -= new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2382 RIGHT.br_startoff = new->br_startoff; in xfs_bmap_add_extent_unwritten_real()
2383 RIGHT.br_startblock = new->br_startblock; in xfs_bmap_add_extent_unwritten_real()
2384 RIGHT.br_blockcount += new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2399 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2420 PREV.br_blockcount -= new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2425 ifp->if_nextents++; in xfs_bmap_add_extent_unwritten_real()
2436 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2447 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2454 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2467 PREV.br_blockcount = new->br_startoff - PREV.br_startoff; in xfs_bmap_add_extent_unwritten_real()
2472 old.br_startoff + old.br_blockcount - new_endoff; in xfs_bmap_add_extent_unwritten_real()
2473 r[1].br_startblock = new->br_startblock + new->br_blockcount; in xfs_bmap_add_extent_unwritten_real()
2480 ifp->if_nextents += 2; in xfs_bmap_add_extent_unwritten_real()
2491 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2494 /* new right extent - oldext */ in xfs_bmap_add_extent_unwritten_real()
2498 /* new left extent - oldext */ in xfs_bmap_add_extent_unwritten_real()
2499 cur->bc_rec.b = PREV; in xfs_bmap_add_extent_unwritten_real()
2504 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2517 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2520 /* new middle extent - newext */ in xfs_bmap_add_extent_unwritten_real()
2525 error = -EFSCORRUPTED; in xfs_bmap_add_extent_unwritten_real()
2561 cur->bc_bmap.allocated = 0; in xfs_bmap_add_extent_unwritten_real()
2590 xfs_filblks_t temp; /* temp for indirect calculations */ in xfs_bmap_add_extent_hole_delay() local
2593 ASSERT(isnullstartblock(new->br_startblock)); in xfs_bmap_add_extent_hole_delay()
2606 * If it doesn't exist, we're converting the hole at end-of-file. in xfs_bmap_add_extent_hole_delay()
2619 left.br_startoff + left.br_blockcount == new->br_startoff && in xfs_bmap_add_extent_hole_delay()
2620 left.br_blockcount + new->br_blockcount <= XFS_MAX_BMBT_EXTLEN) in xfs_bmap_add_extent_hole_delay()
2624 new->br_startoff + new->br_blockcount == right.br_startoff && in xfs_bmap_add_extent_hole_delay()
2625 new->br_blockcount + right.br_blockcount <= XFS_MAX_BMBT_EXTLEN && in xfs_bmap_add_extent_hole_delay()
2627 (left.br_blockcount + new->br_blockcount + in xfs_bmap_add_extent_hole_delay()
2641 temp = left.br_blockcount + new->br_blockcount + in xfs_bmap_add_extent_hole_delay()
2645 startblockval(new->br_startblock) + in xfs_bmap_add_extent_hole_delay()
2647 newlen = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), in xfs_bmap_add_extent_hole_delay()
2650 left.br_blockcount = temp; in xfs_bmap_add_extent_hole_delay()
2663 temp = left.br_blockcount + new->br_blockcount; in xfs_bmap_add_extent_hole_delay()
2666 startblockval(new->br_startblock); in xfs_bmap_add_extent_hole_delay()
2667 newlen = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), in xfs_bmap_add_extent_hole_delay()
2669 left.br_blockcount = temp; in xfs_bmap_add_extent_hole_delay()
2682 temp = new->br_blockcount + right.br_blockcount; in xfs_bmap_add_extent_hole_delay()
2683 oldlen = startblockval(new->br_startblock) + in xfs_bmap_add_extent_hole_delay()
2685 newlen = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), in xfs_bmap_add_extent_hole_delay()
2687 right.br_startoff = new->br_startoff; in xfs_bmap_add_extent_hole_delay()
2689 right.br_blockcount = temp; in xfs_bmap_add_extent_hole_delay()
2705 xfs_add_fdblocks(ip->i_mount, oldlen - newlen); in xfs_bmap_add_extent_hole_delay()
2710 xfs_mod_delalloc(ip, 0, (int64_t)newlen - oldlen); in xfs_bmap_add_extent_hole_delay()
2729 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_add_extent_hole_real()
2732 int i; /* temp state */ in xfs_bmap_add_extent_hole_real()
2739 ASSERT(!isnullstartblock(new->br_startblock)); in xfs_bmap_add_extent_hole_real()
2740 ASSERT(!cur || !(cur->bc_flags & XFS_BTREE_BMBT_WASDEL)); in xfs_bmap_add_extent_hole_real()
2768 left.br_startoff + left.br_blockcount == new->br_startoff && in xfs_bmap_add_extent_hole_real()
2769 left.br_startblock + left.br_blockcount == new->br_startblock && in xfs_bmap_add_extent_hole_real()
2770 left.br_state == new->br_state && in xfs_bmap_add_extent_hole_real()
2771 left.br_blockcount + new->br_blockcount <= XFS_MAX_BMBT_EXTLEN && in xfs_bmap_add_extent_hole_real()
2776 new->br_startoff + new->br_blockcount == right.br_startoff && in xfs_bmap_add_extent_hole_real()
2777 new->br_startblock + new->br_blockcount == right.br_startblock && in xfs_bmap_add_extent_hole_real()
2778 new->br_state == right.br_state && in xfs_bmap_add_extent_hole_real()
2779 new->br_blockcount + right.br_blockcount <= XFS_MAX_BMBT_EXTLEN && in xfs_bmap_add_extent_hole_real()
2781 left.br_blockcount + new->br_blockcount + in xfs_bmap_add_extent_hole_real()
2797 left.br_blockcount += new->br_blockcount + right.br_blockcount; in xfs_bmap_add_extent_hole_real()
2802 ifp->if_nextents--; in xfs_bmap_add_extent_hole_real()
2813 error = -EFSCORRUPTED; in xfs_bmap_add_extent_hole_real()
2821 error = -EFSCORRUPTED; in xfs_bmap_add_extent_hole_real()
2829 error = -EFSCORRUPTED; in xfs_bmap_add_extent_hole_real()
2845 left.br_blockcount += new->br_blockcount; in xfs_bmap_add_extent_hole_real()
2859 error = -EFSCORRUPTED; in xfs_bmap_add_extent_hole_real()
2876 right.br_startoff = new->br_startoff; in xfs_bmap_add_extent_hole_real()
2877 right.br_startblock = new->br_startblock; in xfs_bmap_add_extent_hole_real()
2878 right.br_blockcount += new->br_blockcount; in xfs_bmap_add_extent_hole_real()
2890 error = -EFSCORRUPTED; in xfs_bmap_add_extent_hole_real()
2906 ifp->if_nextents++; in xfs_bmap_add_extent_hole_real()
2917 error = -EFSCORRUPTED; in xfs_bmap_add_extent_hole_real()
2925 error = -EFSCORRUPTED; in xfs_bmap_add_extent_hole_real()
2951 cur->bc_bmap.allocated = 0; in xfs_bmap_add_extent_hole_real()
2973 int eof, /* is extent at end-of-file? */ in xfs_bmap_extsize_align()
2984 xfs_fileoff_t align_off; /* temp for offset */ in xfs_bmap_extsize_align()
2985 xfs_extlen_t align_alen; /* temp for length */ in xfs_bmap_extsize_align()
2986 xfs_extlen_t temp; /* temp for calculations */ in xfs_bmap_extsize_align() local
3000 (orig_off >= gotp->br_startoff) && in xfs_bmap_extsize_align()
3001 (orig_end <= gotp->br_startoff + gotp->br_blockcount)) { in xfs_bmap_extsize_align()
3012 div_u64_rem(orig_off, extsz, &temp); in xfs_bmap_extsize_align()
3013 if (temp) { in xfs_bmap_extsize_align()
3014 align_alen += temp; in xfs_bmap_extsize_align()
3015 align_off -= temp; in xfs_bmap_extsize_align()
3019 temp = (align_alen % extsz); in xfs_bmap_extsize_align()
3020 if (temp) in xfs_bmap_extsize_align()
3021 align_alen += extsz - temp; in xfs_bmap_extsize_align()
3032 align_alen -= extsz; in xfs_bmap_extsize_align()
3039 if (prevp->br_startoff != NULLFILEOFF) { in xfs_bmap_extsize_align()
3040 if (prevp->br_startblock == HOLESTARTBLOCK) in xfs_bmap_extsize_align()
3041 prevo = prevp->br_startoff; in xfs_bmap_extsize_align()
3043 prevo = prevp->br_startoff + prevp->br_blockcount; in xfs_bmap_extsize_align()
3056 if (!eof && gotp->br_startoff != NULLFILEOFF) { in xfs_bmap_extsize_align()
3057 if ((delay && gotp->br_startblock == HOLESTARTBLOCK) || in xfs_bmap_extsize_align()
3058 (!delay && gotp->br_startblock == DELAYSTARTBLOCK)) in xfs_bmap_extsize_align()
3059 nexto = gotp->br_startoff + gotp->br_blockcount; in xfs_bmap_extsize_align()
3061 nexto = gotp->br_startoff; in xfs_bmap_extsize_align()
3067 align_off = nexto > align_alen ? nexto - align_alen : 0; in xfs_bmap_extsize_align()
3080 align_alen = nexto - align_off; in xfs_bmap_extsize_align()
3087 if (rt && (temp = xfs_extlen_to_rtxmod(mp, align_alen))) { in xfs_bmap_extsize_align()
3094 align_alen - temp < orig_alen) in xfs_bmap_extsize_align()
3095 return -EINVAL; in xfs_bmap_extsize_align()
3099 if (align_off + temp <= orig_off) { in xfs_bmap_extsize_align()
3100 align_alen -= temp; in xfs_bmap_extsize_align()
3101 align_off += temp; in xfs_bmap_extsize_align()
3106 else if (align_off + align_alen - temp >= orig_end) in xfs_bmap_extsize_align()
3107 align_alen -= temp; in xfs_bmap_extsize_align()
3112 align_alen -= orig_off - align_off; in xfs_bmap_extsize_align()
3114 align_alen -= xfs_extlen_to_rtxmod(mp, align_alen); in xfs_bmap_extsize_align()
3120 return -EINVAL; in xfs_bmap_extsize_align()
3129 if (!eof && gotp->br_startoff != NULLFILEOFF) in xfs_bmap_extsize_align()
3130 ASSERT(align_off + align_alen <= gotp->br_startoff); in xfs_bmap_extsize_align()
3131 if (prevp->br_startoff != NULLFILEOFF) in xfs_bmap_extsize_align()
3132 ASSERT(align_off >= prevp->br_startoff + prevp->br_blockcount); in xfs_bmap_extsize_align()
3146 struct xfs_mount *mp = ap->ip->i_mount; in xfs_bmap_adjacent_valid()
3148 if (XFS_IS_REALTIME_INODE(ap->ip) && in xfs_bmap_adjacent_valid()
3149 (ap->datatype & XFS_ALLOC_USERDATA)) { in xfs_bmap_adjacent_valid()
3151 return x < mp->m_sb.sb_rblocks; in xfs_bmap_adjacent_valid()
3154 xfs_rtb_to_rgno(mp, x) < mp->m_sb.sb_rgcount && in xfs_bmap_adjacent_valid()
3155 xfs_rtb_to_rtx(mp, x) < mp->m_sb.sb_rgextents; in xfs_bmap_adjacent_valid()
3160 XFS_FSB_TO_AGNO(mp, x) < mp->m_sb.sb_agcount && in xfs_bmap_adjacent_valid()
3161 XFS_FSB_TO_AGBNO(mp, x) < mp->m_sb.sb_agblocks; in xfs_bmap_adjacent_valid()
3166 /* returns true if ap->blkno was modified */
3177 if (ap->eof && ap->prev.br_startoff != NULLFILEOFF && in xfs_bmap_adjacent()
3178 !isnullstartblock(ap->prev.br_startblock) && in xfs_bmap_adjacent()
3180 ap->prev.br_startblock + ap->prev.br_blockcount, in xfs_bmap_adjacent()
3181 ap->prev.br_startblock)) { in xfs_bmap_adjacent()
3182 ap->blkno = ap->prev.br_startblock + ap->prev.br_blockcount; in xfs_bmap_adjacent()
3186 adjust = ap->offset - in xfs_bmap_adjacent()
3187 (ap->prev.br_startoff + ap->prev.br_blockcount); in xfs_bmap_adjacent()
3188 if (adjust && xfs_bmap_adjacent_valid(ap, ap->blkno + adjust, in xfs_bmap_adjacent()
3189 ap->prev.br_startblock)) in xfs_bmap_adjacent()
3190 ap->blkno += adjust; in xfs_bmap_adjacent()
3198 if (!ap->eof) { in xfs_bmap_adjacent()
3208 if (ap->prev.br_startoff != NULLFILEOFF && in xfs_bmap_adjacent()
3209 !isnullstartblock(ap->prev.br_startblock) && in xfs_bmap_adjacent()
3210 (prevbno = ap->prev.br_startblock + in xfs_bmap_adjacent()
3211 ap->prev.br_blockcount) && in xfs_bmap_adjacent()
3213 ap->prev.br_startblock)) { in xfs_bmap_adjacent()
3217 adjust = prevdiff = ap->offset - in xfs_bmap_adjacent()
3218 (ap->prev.br_startoff + in xfs_bmap_adjacent()
3219 ap->prev.br_blockcount); in xfs_bmap_adjacent()
3228 if (prevdiff <= XFS_ALLOC_GAP_UNITS * ap->length && in xfs_bmap_adjacent()
3230 ap->prev.br_startblock)) in xfs_bmap_adjacent()
3244 if (!isnullstartblock(ap->got.br_startblock)) { in xfs_bmap_adjacent()
3248 adjust = gotdiff = ap->got.br_startoff - ap->offset; in xfs_bmap_adjacent()
3253 gotbno = ap->got.br_startblock; in xfs_bmap_adjacent()
3261 if (gotdiff <= XFS_ALLOC_GAP_UNITS * ap->length && in xfs_bmap_adjacent()
3262 xfs_bmap_adjacent_valid(ap, gotbno - gotdiff, in xfs_bmap_adjacent()
3264 gotbno -= adjust; in xfs_bmap_adjacent()
3265 else if (xfs_bmap_adjacent_valid(ap, gotbno - ap->length, in xfs_bmap_adjacent()
3267 gotbno -= ap->length; in xfs_bmap_adjacent()
3268 gotdiff += adjust - ap->length; in xfs_bmap_adjacent()
3279 * one, else ap->blkno is already set (to 0 or the inode block). in xfs_bmap_adjacent()
3282 ap->blkno = prevdiff <= gotdiff ? prevbno : gotbno; in xfs_bmap_adjacent()
3286 ap->blkno = prevbno; in xfs_bmap_adjacent()
3290 ap->blkno = gotbno; in xfs_bmap_adjacent()
3334 if (blen < ap->minlen) in xfs_bmap_select_minlen()
3335 return ap->minlen; in xfs_bmap_select_minlen()
3342 if (blen < args->maxlen) in xfs_bmap_select_minlen()
3344 return args->maxlen; in xfs_bmap_select_minlen()
3353 struct xfs_mount *mp = args->mp; in xfs_bmap_btalloc_select_lengths()
3358 if (ap->tp->t_flags & XFS_TRANS_LOWMODE) { in xfs_bmap_btalloc_select_lengths()
3359 args->total = ap->minlen; in xfs_bmap_btalloc_select_lengths()
3360 args->minlen = ap->minlen; in xfs_bmap_btalloc_select_lengths()
3364 args->total = ap->total; in xfs_bmap_btalloc_select_lengths()
3365 startag = XFS_FSB_TO_AGNO(mp, ap->blkno); in xfs_bmap_btalloc_select_lengths()
3371 error = xfs_bmap_longest_free_extent(pag, args->tp, blen); in xfs_bmap_btalloc_select_lengths()
3372 if (error && error != -EAGAIN) in xfs_bmap_btalloc_select_lengths()
3375 if (*blen >= args->maxlen) in xfs_bmap_btalloc_select_lengths()
3381 args->minlen = xfs_bmap_select_minlen(ap, args, *blen); in xfs_bmap_btalloc_select_lengths()
3390 bool isrt = XFS_IS_REALTIME_INODE(ap->ip) && in xfs_bmap_alloc_account()
3391 !(ap->flags & XFS_BMAPI_ATTRFORK); in xfs_bmap_alloc_account()
3394 if (ap->flags & XFS_BMAPI_COWFORK) { in xfs_bmap_alloc_account()
3396 * COW fork blocks are in-core only and thus are treated as in xfs_bmap_alloc_account()
3397 * in-core quota reservation (like delalloc blocks) even when in xfs_bmap_alloc_account()
3404 if (ap->wasdel) { in xfs_bmap_alloc_account()
3405 xfs_mod_delalloc(ap->ip, -(int64_t)ap->length, 0); in xfs_bmap_alloc_account()
3411 * has acquired in-core quota reservation for this extent. in xfs_bmap_alloc_account()
3417 ap->ip->i_delayed_blks += ap->length; in xfs_bmap_alloc_account()
3418 xfs_trans_mod_dquot_byino(ap->tp, ap->ip, isrt ? in xfs_bmap_alloc_account()
3420 -(long)ap->length); in xfs_bmap_alloc_account()
3425 ap->ip->i_nblocks += ap->length; in xfs_bmap_alloc_account()
3426 xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); in xfs_bmap_alloc_account()
3427 if (ap->wasdel) { in xfs_bmap_alloc_account()
3428 ap->ip->i_delayed_blks -= ap->length; in xfs_bmap_alloc_account()
3429 xfs_mod_delalloc(ap->ip, -(int64_t)ap->length, 0); in xfs_bmap_alloc_account()
3435 xfs_trans_mod_dquot_byino(ap->tp, ap->ip, fld, ap->length); in xfs_bmap_alloc_account()
3443 struct xfs_mount *mp = args->mp; in xfs_bmap_compute_alignments()
3448 if (mp->m_swidth && xfs_has_swalloc(mp)) in xfs_bmap_compute_alignments()
3449 stripe_align = mp->m_swidth; in xfs_bmap_compute_alignments()
3450 else if (mp->m_dalign) in xfs_bmap_compute_alignments()
3451 stripe_align = mp->m_dalign; in xfs_bmap_compute_alignments()
3453 if (ap->flags & XFS_BMAPI_COWFORK) in xfs_bmap_compute_alignments()
3454 align = xfs_get_cowextsz_hint(ap->ip); in xfs_bmap_compute_alignments()
3455 else if (ap->datatype & XFS_ALLOC_USERDATA) in xfs_bmap_compute_alignments()
3456 align = xfs_get_extsz_hint(ap->ip); in xfs_bmap_compute_alignments()
3458 if (xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, align, 0, in xfs_bmap_compute_alignments()
3459 ap->eof, 0, ap->conv, &ap->offset, in xfs_bmap_compute_alignments()
3460 &ap->length)) in xfs_bmap_compute_alignments()
3462 ASSERT(ap->length); in xfs_bmap_compute_alignments()
3467 args->prod = align; in xfs_bmap_compute_alignments()
3468 div_u64_rem(ap->offset, args->prod, &args->mod); in xfs_bmap_compute_alignments()
3469 if (args->mod) in xfs_bmap_compute_alignments()
3470 args->mod = args->prod - args->mod; in xfs_bmap_compute_alignments()
3471 } else if (mp->m_sb.sb_blocksize >= PAGE_SIZE) { in xfs_bmap_compute_alignments()
3472 args->prod = 1; in xfs_bmap_compute_alignments()
3473 args->mod = 0; in xfs_bmap_compute_alignments()
3475 args->prod = PAGE_SIZE >> mp->m_sb.sb_blocklog; in xfs_bmap_compute_alignments()
3476 div_u64_rem(ap->offset, args->prod, &args->mod); in xfs_bmap_compute_alignments()
3477 if (args->mod) in xfs_bmap_compute_alignments()
3478 args->mod = args->prod - args->mod; in xfs_bmap_compute_alignments()
3491 ap->blkno = args->fsbno; in xfs_bmap_process_allocated_extent()
3492 ap->length = args->len; in xfs_bmap_process_allocated_extent()
3505 if (ap->length <= orig_length) in xfs_bmap_process_allocated_extent()
3506 ap->offset = orig_offset; in xfs_bmap_process_allocated_extent()
3507 else if (ap->offset + ap->length < orig_offset + orig_length) in xfs_bmap_process_allocated_extent()
3508 ap->offset = orig_offset + orig_length - ap->length; in xfs_bmap_process_allocated_extent()
3517 if (ap->minlen != 1) { in xfs_bmap_exact_minlen_extent_alloc()
3518 args->fsbno = NULLFSBLOCK; in xfs_bmap_exact_minlen_extent_alloc()
3522 args->alloc_minlen_only = 1; in xfs_bmap_exact_minlen_extent_alloc()
3523 args->minlen = args->maxlen = ap->minlen; in xfs_bmap_exact_minlen_extent_alloc()
3524 args->total = ap->total; in xfs_bmap_exact_minlen_extent_alloc()
3534 ap->blkno = XFS_AGB_TO_FSB(ap->ip->i_mount, 0, 0); in xfs_bmap_exact_minlen_extent_alloc()
3538 * iteration and then drops args->total to args->minlen, which might be in xfs_bmap_exact_minlen_extent_alloc()
3550 * NOTE: ap->aeof is only set if the allocation length is >= the
3561 struct xfs_mount *mp = args->mp; in xfs_bmap_btalloc_at_eof()
3562 struct xfs_perag *caller_pag = args->pag; in xfs_bmap_btalloc_at_eof()
3571 if (ap->eof) { in xfs_bmap_btalloc_at_eof()
3579 args->alignment = 1; in xfs_bmap_btalloc_at_eof()
3580 if (blen > stripe_align && blen <= args->maxlen) in xfs_bmap_btalloc_at_eof()
3581 nextminlen = blen - stripe_align; in xfs_bmap_btalloc_at_eof()
3583 nextminlen = args->minlen; in xfs_bmap_btalloc_at_eof()
3584 if (nextminlen + stripe_align > args->minlen + 1) in xfs_bmap_btalloc_at_eof()
3585 args->minalignslop = nextminlen + stripe_align - in xfs_bmap_btalloc_at_eof()
3586 args->minlen - 1; in xfs_bmap_btalloc_at_eof()
3588 args->minalignslop = 0; in xfs_bmap_btalloc_at_eof()
3591 args->pag = xfs_perag_get(mp, XFS_FSB_TO_AGNO(mp, ap->blkno)); in xfs_bmap_btalloc_at_eof()
3592 error = xfs_alloc_vextent_exact_bno(args, ap->blkno); in xfs_bmap_btalloc_at_eof()
3594 xfs_perag_put(args->pag); in xfs_bmap_btalloc_at_eof()
3595 args->pag = NULL; in xfs_bmap_btalloc_at_eof()
3600 if (args->fsbno != NULLFSBLOCK) in xfs_bmap_btalloc_at_eof()
3606 args->alignment = stripe_align; in xfs_bmap_btalloc_at_eof()
3607 args->minlen = nextminlen; in xfs_bmap_btalloc_at_eof()
3608 args->minalignslop = 0; in xfs_bmap_btalloc_at_eof()
3614 args->alignment = stripe_align; in xfs_bmap_btalloc_at_eof()
3615 if (blen > args->alignment && in xfs_bmap_btalloc_at_eof()
3616 blen <= args->maxlen + args->alignment) in xfs_bmap_btalloc_at_eof()
3617 args->minlen = blen - args->alignment; in xfs_bmap_btalloc_at_eof()
3618 args->minalignslop = 0; in xfs_bmap_btalloc_at_eof()
3622 error = xfs_alloc_vextent_near_bno(args, ap->blkno); in xfs_bmap_btalloc_at_eof()
3624 args->pag = NULL; in xfs_bmap_btalloc_at_eof()
3625 error = xfs_alloc_vextent_start_ag(args, ap->blkno); in xfs_bmap_btalloc_at_eof()
3626 ASSERT(args->pag == NULL); in xfs_bmap_btalloc_at_eof()
3627 args->pag = caller_pag; in xfs_bmap_btalloc_at_eof()
3632 if (args->fsbno != NULLFSBLOCK) in xfs_bmap_btalloc_at_eof()
3637 * original non-aligned state so the caller can proceed on allocation in xfs_bmap_btalloc_at_eof()
3640 args->alignment = 1; in xfs_bmap_btalloc_at_eof()
3663 if (args->minlen > ap->minlen) { in xfs_bmap_btalloc_low_space()
3664 args->minlen = ap->minlen; in xfs_bmap_btalloc_low_space()
3665 error = xfs_alloc_vextent_start_ag(args, ap->blkno); in xfs_bmap_btalloc_low_space()
3666 if (error || args->fsbno != NULLFSBLOCK) in xfs_bmap_btalloc_low_space()
3671 args->total = ap->minlen; in xfs_bmap_btalloc_low_space()
3675 ap->tp->t_flags |= XFS_TRANS_LOWMODE; in xfs_bmap_btalloc_low_space()
3692 ASSERT(args->pag); in xfs_bmap_btalloc_filestreams()
3699 if (ap->tp->t_flags & XFS_TRANS_LOWMODE) { in xfs_bmap_btalloc_filestreams()
3700 args->minlen = ap->minlen; in xfs_bmap_btalloc_filestreams()
3701 ASSERT(args->fsbno == NULLFSBLOCK); in xfs_bmap_btalloc_filestreams()
3705 args->minlen = xfs_bmap_select_minlen(ap, args, blen); in xfs_bmap_btalloc_filestreams()
3706 if (ap->aeof) in xfs_bmap_btalloc_filestreams()
3710 if (!error && args->fsbno == NULLFSBLOCK) in xfs_bmap_btalloc_filestreams()
3711 error = xfs_alloc_vextent_near_bno(args, ap->blkno); in xfs_bmap_btalloc_filestreams()
3721 xfs_perag_rele(args->pag); in xfs_bmap_btalloc_filestreams()
3722 args->pag = NULL; in xfs_bmap_btalloc_filestreams()
3723 if (error || args->fsbno != NULLFSBLOCK) in xfs_bmap_btalloc_filestreams()
3738 ap->blkno = XFS_INO_TO_FSB(args->mp, ap->ip->i_ino); in xfs_bmap_btalloc_best_length()
3740 ap->eof = false; in xfs_bmap_btalloc_best_length()
3757 if (ap->aeof && !(ap->tp->t_flags & XFS_TRANS_LOWMODE)) { in xfs_bmap_btalloc_best_length()
3760 if (error || args->fsbno != NULLFSBLOCK) in xfs_bmap_btalloc_best_length()
3764 error = xfs_alloc_vextent_start_ag(args, ap->blkno); in xfs_bmap_btalloc_best_length()
3765 if (error || args->fsbno != NULLFSBLOCK) in xfs_bmap_btalloc_best_length()
3775 struct xfs_mount *mp = ap->ip->i_mount; in xfs_bmap_btalloc()
3777 .tp = ap->tp, in xfs_bmap_btalloc()
3781 .minleft = ap->minleft, in xfs_bmap_btalloc()
3782 .wasdel = ap->wasdel, in xfs_bmap_btalloc()
3784 .datatype = ap->datatype, in xfs_bmap_btalloc()
3793 ASSERT(ap->length); in xfs_bmap_btalloc()
3794 orig_offset = ap->offset; in xfs_bmap_btalloc()
3795 orig_length = ap->length; in xfs_bmap_btalloc()
3800 args.maxlen = min(ap->length, mp->m_ag_max_usable); in xfs_bmap_btalloc()
3805 else if ((ap->datatype & XFS_ALLOC_USERDATA) && in xfs_bmap_btalloc()
3806 xfs_inode_is_filestream(ap->ip)) in xfs_bmap_btalloc()
3817 ap->blkno = NULLFSBLOCK; in xfs_bmap_btalloc()
3818 ap->length = 0; in xfs_bmap_btalloc()
3833 if (irec->br_startoff + irec->br_blockcount <= bno || in xfs_trim_extent()
3834 irec->br_startoff >= end) { in xfs_trim_extent()
3835 irec->br_blockcount = 0; in xfs_trim_extent()
3839 if (irec->br_startoff < bno) { in xfs_trim_extent()
3840 distance = bno - irec->br_startoff; in xfs_trim_extent()
3841 if (isnullstartblock(irec->br_startblock)) in xfs_trim_extent()
3842 irec->br_startblock = DELAYSTARTBLOCK; in xfs_trim_extent()
3843 if (irec->br_startblock != DELAYSTARTBLOCK && in xfs_trim_extent()
3844 irec->br_startblock != HOLESTARTBLOCK) in xfs_trim_extent()
3845 irec->br_startblock += distance; in xfs_trim_extent()
3846 irec->br_startoff += distance; in xfs_trim_extent()
3847 irec->br_blockcount -= distance; in xfs_trim_extent()
3850 if (end < irec->br_startoff + irec->br_blockcount) { in xfs_trim_extent()
3851 distance = irec->br_startoff + irec->br_blockcount - end; in xfs_trim_extent()
3852 irec->br_blockcount -= distance; in xfs_trim_extent()
3871 got->br_startoff + got->br_blockcount <= obno) { in xfs_bmapi_trim_map()
3873 if (isnullstartblock(got->br_startblock)) in xfs_bmapi_trim_map()
3874 mval->br_startblock = DELAYSTARTBLOCK; in xfs_bmapi_trim_map()
3882 mval->br_startoff = *bno; in xfs_bmapi_trim_map()
3883 if (isnullstartblock(got->br_startblock)) in xfs_bmapi_trim_map()
3884 mval->br_startblock = DELAYSTARTBLOCK; in xfs_bmapi_trim_map()
3886 mval->br_startblock = got->br_startblock + in xfs_bmapi_trim_map()
3887 (*bno - got->br_startoff); in xfs_bmapi_trim_map()
3895 mval->br_blockcount = XFS_FILBLKS_MIN(end - *bno, in xfs_bmapi_trim_map()
3896 got->br_blockcount - (*bno - got->br_startoff)); in xfs_bmapi_trim_map()
3897 mval->br_state = got->br_state; in xfs_bmapi_trim_map()
3898 ASSERT(mval->br_blockcount <= len); in xfs_bmapi_trim_map()
3918 ((mval->br_startoff + mval->br_blockcount) <= end)); in xfs_bmapi_update_map()
3919 ASSERT((flags & XFS_BMAPI_ENTIRE) || (mval->br_blockcount <= *len) || in xfs_bmapi_update_map()
3920 (mval->br_startoff < obno)); in xfs_bmapi_update_map()
3922 *bno = mval->br_startoff + mval->br_blockcount; in xfs_bmapi_update_map()
3923 *len = end - *bno; in xfs_bmapi_update_map()
3924 if (*n > 0 && mval->br_startoff == mval[-1].br_startoff) { in xfs_bmapi_update_map()
3926 ASSERT(mval->br_startblock == mval[-1].br_startblock); in xfs_bmapi_update_map()
3927 ASSERT(mval->br_blockcount > mval[-1].br_blockcount); in xfs_bmapi_update_map()
3928 ASSERT(mval->br_state == mval[-1].br_state); in xfs_bmapi_update_map()
3929 mval[-1].br_blockcount = mval->br_blockcount; in xfs_bmapi_update_map()
3930 mval[-1].br_state = mval->br_state; in xfs_bmapi_update_map()
3931 } else if (*n > 0 && mval->br_startblock != DELAYSTARTBLOCK && in xfs_bmapi_update_map()
3932 mval[-1].br_startblock != DELAYSTARTBLOCK && in xfs_bmapi_update_map()
3933 mval[-1].br_startblock != HOLESTARTBLOCK && in xfs_bmapi_update_map()
3934 mval->br_startblock == mval[-1].br_startblock + in xfs_bmapi_update_map()
3935 mval[-1].br_blockcount && in xfs_bmapi_update_map()
3936 mval[-1].br_state == mval->br_state) { in xfs_bmapi_update_map()
3937 ASSERT(mval->br_startoff == in xfs_bmapi_update_map()
3938 mval[-1].br_startoff + mval[-1].br_blockcount); in xfs_bmapi_update_map()
3939 mval[-1].br_blockcount += mval->br_blockcount; in xfs_bmapi_update_map()
3941 mval->br_startblock == DELAYSTARTBLOCK && in xfs_bmapi_update_map()
3942 mval[-1].br_startblock == DELAYSTARTBLOCK && in xfs_bmapi_update_map()
3943 mval->br_startoff == in xfs_bmapi_update_map()
3944 mval[-1].br_startoff + mval[-1].br_blockcount) { in xfs_bmapi_update_map()
3945 mval[-1].br_blockcount += mval->br_blockcount; in xfs_bmapi_update_map()
3946 mval[-1].br_state = mval->br_state; in xfs_bmapi_update_map()
3948 ((mval->br_startoff + mval->br_blockcount) <= in xfs_bmapi_update_map()
3968 struct xfs_mount *mp = ip->i_mount; in xfs_bmapi_read()
3985 return -EFSCORRUPTED; in xfs_bmapi_read()
3991 return -EFSCORRUPTED; in xfs_bmapi_read()
3995 return -EIO; in xfs_bmapi_read()
4014 mval->br_startoff = bno; in xfs_bmapi_read()
4015 mval->br_startblock = HOLESTARTBLOCK; in xfs_bmapi_read()
4016 mval->br_blockcount = in xfs_bmapi_read()
4017 XFS_FILBLKS_MIN(len, got.br_startoff - bno); in xfs_bmapi_read()
4018 mval->br_state = XFS_EXT_NORM; in xfs_bmapi_read()
4019 bno += mval->br_blockcount; in xfs_bmapi_read()
4020 len -= mval->br_blockcount; in xfs_bmapi_read()
4044 * global pool and the extent inserted into the inode in-core extent tree.
4066 struct xfs_mount *mp = ip->i_mount; in xfs_bmapi_reserve_delalloc()
4084 alen = XFS_FILBLKS_MIN(alen, got->br_startoff - aoff); in xfs_bmapi_reserve_delalloc()
4086 prealloc = alen - len; in xfs_bmapi_reserve_delalloc()
4110 * Make a transaction-less quota reservation for delayed allocation in xfs_bmapi_reserve_delalloc()
4138 ip->i_delayed_blks += alen; in xfs_bmapi_reserve_delalloc()
4141 got->br_startoff = aoff; in xfs_bmapi_reserve_delalloc()
4142 got->br_startblock = nullstartblock(indlen); in xfs_bmapi_reserve_delalloc()
4143 got->br_blockcount = alen; in xfs_bmapi_reserve_delalloc()
4144 got->br_state = XFS_EXT_NORM; in xfs_bmapi_reserve_delalloc()
4167 if (error == -ENOSPC || error == -EDQUOT) { in xfs_bmapi_reserve_delalloc()
4184 struct xfs_mount *mp = bma->ip->i_mount; in xfs_bmapi_allocate()
4185 int whichfork = xfs_bmapi_whichfork(bma->flags); in xfs_bmapi_allocate()
4186 struct xfs_ifork *ifp = xfs_ifork_ptr(bma->ip, whichfork); in xfs_bmapi_allocate()
4189 ASSERT(bma->length > 0); in xfs_bmapi_allocate()
4190 ASSERT(bma->length <= XFS_MAX_BMBT_EXTLEN); in xfs_bmapi_allocate()
4192 if (bma->flags & XFS_BMAPI_CONTIG) in xfs_bmapi_allocate()
4193 bma->minlen = bma->length; in xfs_bmapi_allocate()
4195 bma->minlen = 1; in xfs_bmapi_allocate()
4197 if (!(bma->flags & XFS_BMAPI_METADATA)) { in xfs_bmapi_allocate()
4204 bma->datatype = XFS_ALLOC_NOBUSY; in xfs_bmapi_allocate()
4206 bma->datatype |= XFS_ALLOC_USERDATA; in xfs_bmapi_allocate()
4207 if (bma->offset == 0) in xfs_bmapi_allocate()
4208 bma->datatype |= XFS_ALLOC_INITIAL_USER_DATA; in xfs_bmapi_allocate()
4210 if (mp->m_dalign && bma->length >= mp->m_dalign) { in xfs_bmapi_allocate()
4218 if ((bma->datatype & XFS_ALLOC_USERDATA) && in xfs_bmapi_allocate()
4219 XFS_IS_REALTIME_INODE(bma->ip)) in xfs_bmapi_allocate()
4225 if (bma->blkno == NULLFSBLOCK) in xfs_bmapi_allocate()
4226 return -ENOSPC; in xfs_bmapi_allocate()
4228 if (WARN_ON_ONCE(!xfs_valid_startblock(bma->ip, bma->blkno))) { in xfs_bmapi_allocate()
4229 xfs_bmap_mark_sick(bma->ip, whichfork); in xfs_bmapi_allocate()
4230 return -EFSCORRUPTED; in xfs_bmapi_allocate()
4233 if (bma->flags & XFS_BMAPI_ZERO) { in xfs_bmapi_allocate()
4234 error = xfs_zero_extent(bma->ip, bma->blkno, bma->length); in xfs_bmapi_allocate()
4239 if (ifp->if_format == XFS_DINODE_FMT_BTREE && !bma->cur) in xfs_bmapi_allocate()
4240 bma->cur = xfs_bmbt_init_cursor(mp, bma->tp, bma->ip, whichfork); in xfs_bmapi_allocate()
4245 bma->nallocs++; in xfs_bmapi_allocate()
4247 if (bma->cur && bma->wasdel) in xfs_bmapi_allocate()
4248 bma->cur->bc_flags |= XFS_BTREE_BMBT_WASDEL; in xfs_bmapi_allocate()
4250 bma->got.br_startoff = bma->offset; in xfs_bmapi_allocate()
4251 bma->got.br_startblock = bma->blkno; in xfs_bmapi_allocate()
4252 bma->got.br_blockcount = bma->length; in xfs_bmapi_allocate()
4253 bma->got.br_state = XFS_EXT_NORM; in xfs_bmapi_allocate()
4255 if (bma->flags & XFS_BMAPI_PREALLOC) in xfs_bmapi_allocate()
4256 bma->got.br_state = XFS_EXT_UNWRITTEN; in xfs_bmapi_allocate()
4258 if (bma->wasdel) in xfs_bmapi_allocate()
4261 error = xfs_bmap_add_extent_hole_real(bma->tp, bma->ip, in xfs_bmapi_allocate()
4262 whichfork, &bma->icur, &bma->cur, &bma->got, in xfs_bmapi_allocate()
4263 &bma->logflags, bma->flags); in xfs_bmapi_allocate()
4272 xfs_iext_get_extent(ifp, &bma->icur, &bma->got); in xfs_bmapi_allocate()
4274 ASSERT(bma->got.br_startoff <= bma->offset); in xfs_bmapi_allocate()
4275 ASSERT(bma->got.br_startoff + bma->got.br_blockcount >= in xfs_bmapi_allocate()
4276 bma->offset + bma->length); in xfs_bmapi_allocate()
4277 ASSERT(bma->got.br_state == XFS_EXT_NORM || in xfs_bmapi_allocate()
4278 bma->got.br_state == XFS_EXT_UNWRITTEN); in xfs_bmapi_allocate()
4290 struct xfs_ifork *ifp = xfs_ifork_ptr(bma->ip, whichfork); in xfs_bmapi_convert_unwritten()
4294 /* check if we need to do unwritten->real conversion */ in xfs_bmapi_convert_unwritten()
4295 if (mval->br_state == XFS_EXT_UNWRITTEN && in xfs_bmapi_convert_unwritten()
4299 /* check if we need to do real->unwritten conversion */ in xfs_bmapi_convert_unwritten()
4300 if (mval->br_state == XFS_EXT_NORM && in xfs_bmapi_convert_unwritten()
4308 ASSERT(mval->br_blockcount <= len); in xfs_bmapi_convert_unwritten()
4309 if (ifp->if_format == XFS_DINODE_FMT_BTREE && !bma->cur) { in xfs_bmapi_convert_unwritten()
4310 bma->cur = xfs_bmbt_init_cursor(bma->ip->i_mount, bma->tp, in xfs_bmapi_convert_unwritten()
4311 bma->ip, whichfork); in xfs_bmapi_convert_unwritten()
4313 mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN) in xfs_bmapi_convert_unwritten()
4321 error = xfs_zero_extent(bma->ip, mval->br_startblock, in xfs_bmapi_convert_unwritten()
4322 mval->br_blockcount); in xfs_bmapi_convert_unwritten()
4327 error = xfs_bmap_add_extent_unwritten_real(bma->tp, bma->ip, whichfork, in xfs_bmapi_convert_unwritten()
4328 &bma->icur, &bma->cur, mval, &tmp_logflags); in xfs_bmapi_convert_unwritten()
4338 * any on-disk updates to make, so we don't need to log anything. in xfs_bmapi_convert_unwritten()
4341 bma->logflags |= tmp_logflags | XFS_ILOG_CORE; in xfs_bmapi_convert_unwritten()
4350 xfs_iext_get_extent(ifp, &bma->icur, &bma->got); in xfs_bmapi_convert_unwritten()
4356 if (mval->br_blockcount < len) in xfs_bmapi_convert_unwritten()
4357 return -EAGAIN; in xfs_bmapi_convert_unwritten()
4369 if (tp && tp->t_highest_agno != NULLAGNUMBER) in xfs_bmapi_minleft()
4371 if (ifp->if_format != XFS_DINODE_FMT_BTREE) in xfs_bmapi_minleft()
4373 return be16_to_cpu(ifp->if_broot->bb_level) + 1; in xfs_bmapi_minleft()
4388 struct xfs_ifork *ifp = xfs_ifork_ptr(bma->ip, whichfork); in xfs_bmapi_finish()
4390 if ((bma->logflags & xfs_ilog_fext(whichfork)) && in xfs_bmapi_finish()
4391 ifp->if_format != XFS_DINODE_FMT_EXTENTS) in xfs_bmapi_finish()
4392 bma->logflags &= ~xfs_ilog_fext(whichfork); in xfs_bmapi_finish()
4393 else if ((bma->logflags & xfs_ilog_fbroot(whichfork)) && in xfs_bmapi_finish()
4394 ifp->if_format != XFS_DINODE_FMT_BTREE) in xfs_bmapi_finish()
4395 bma->logflags &= ~xfs_ilog_fbroot(whichfork); in xfs_bmapi_finish()
4397 if (bma->logflags) in xfs_bmapi_finish()
4398 xfs_trans_log_inode(bma->tp, bma->ip, bma->logflags); in xfs_bmapi_finish()
4399 if (bma->cur) in xfs_bmapi_finish()
4400 xfs_btree_del_cursor(bma->cur, error); in xfs_bmapi_finish()
4414 * Returns a negative error code on failure, including -ENOSPC when it could not
4415 * allocate any blocks and -ENOSR when it did allocate blocks to convert a
4434 struct xfs_mount *mp = ip->i_mount; in xfs_bmapi_write()
4461 ASSERT(ifp->if_format != XFS_DINODE_FMT_LOCAL); in xfs_bmapi_write()
4469 * we can allocate unwritten extents or pre-zero allocated blocks, in xfs_bmapi_write()
4480 return -EFSCORRUPTED; in xfs_bmapi_write()
4484 return -EIO; in xfs_bmapi_write()
4542 bma.got.br_blockcount - in xfs_bmapi_write()
4543 (bno - bma.got.br_startoff)); in xfs_bmapi_write()
4547 bma.got.br_startoff - bno); in xfs_bmapi_write()
4558 if (error == -ENOSPC && bma.nallocs) in xfs_bmapi_write()
4579 if (error == -EAGAIN) in xfs_bmapi_write()
4606 ASSERT(ifp->if_format != XFS_DINODE_FMT_BTREE || in xfs_bmapi_write()
4607 ifp->if_nextents > XFS_IFORK_MAXEXT(ip, whichfork)); in xfs_bmapi_write()
4618 * -ENOSR error code for this particular case so that the caller can in xfs_bmapi_write()
4623 return -ENOSR; in xfs_bmapi_write()
4647 struct xfs_mount *mp = ip->i_mount; in xfs_bmapi_convert_one_delalloc()
4661 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0, 0, in xfs_bmapi_convert_one_delalloc()
4682 error = -EAGAIN; in xfs_bmapi_convert_one_delalloc()
4694 *seq = READ_ONCE(ifp->if_seq); in xfs_bmapi_convert_one_delalloc()
4742 *seq = READ_ONCE(ifp->if_seq); in xfs_bmapi_convert_one_delalloc()
4791 } while (iomap->offset + iomap->length <= offset); in xfs_bmapi_convert_delalloc()
4805 struct xfs_mount *mp = ip->i_mount; in xfs_bmapi_remap()
4825 return -EFSCORRUPTED; in xfs_bmapi_remap()
4829 return -EIO; in xfs_bmapi_remap()
4838 ASSERT(got.br_startoff - bno >= len); in xfs_bmapi_remap()
4841 ip->i_nblocks += len; in xfs_bmapi_remap()
4842 ip->i_delayed_blks -= len; /* see xfs_bmap_defer_add */ in xfs_bmapi_remap()
4845 if (ifp->if_format == XFS_DINODE_FMT_BTREE) in xfs_bmapi_remap()
4864 if (ip->i_df.if_format != XFS_DINODE_FMT_EXTENTS) in xfs_bmapi_remap()
4866 else if (ip->i_df.if_format != XFS_DINODE_FMT_BTREE) in xfs_bmapi_remap()
4919 * below starts with len1, so hand len2 a block right off the bat if it in xfs_bmap_split_indlen()
4922 ores -= (len1 + len2); in xfs_bmap_split_indlen()
4923 ASSERT((*indlen1 - len1) + (*indlen2 - len2) >= ores); in xfs_bmap_split_indlen()
4926 ores--; in xfs_bmap_split_indlen()
4931 ores--; in xfs_bmap_split_indlen()
4937 ores--; in xfs_bmap_split_indlen()
4953 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_del_extent_delay()
4966 del_endoff = del->br_startoff + del->br_blockcount; in xfs_bmap_del_extent_delay()
4967 got_endoff = got->br_startoff + got->br_blockcount; in xfs_bmap_del_extent_delay()
4968 da_old = startblockval(got->br_startblock); in xfs_bmap_del_extent_delay()
4971 ASSERT(del->br_blockcount > 0); in xfs_bmap_del_extent_delay()
4972 ASSERT(got->br_startoff <= del->br_startoff); in xfs_bmap_del_extent_delay()
4980 xfs_quota_unreserve_blkres(ip, del->br_blockcount); in xfs_bmap_del_extent_delay()
4981 ip->i_delayed_blks -= del->br_blockcount; in xfs_bmap_del_extent_delay()
4983 if (got->br_startoff == del->br_startoff) in xfs_bmap_del_extent_delay()
5000 got->br_startoff = del_endoff; in xfs_bmap_del_extent_delay()
5001 got->br_blockcount -= del->br_blockcount; in xfs_bmap_del_extent_delay()
5003 got->br_blockcount), da_old); in xfs_bmap_del_extent_delay()
5004 got->br_startblock = nullstartblock((int)da_new); in xfs_bmap_del_extent_delay()
5011 got->br_blockcount = got->br_blockcount - del->br_blockcount; in xfs_bmap_del_extent_delay()
5013 got->br_blockcount), da_old); in xfs_bmap_del_extent_delay()
5014 got->br_startblock = nullstartblock((int)da_new); in xfs_bmap_del_extent_delay()
5027 got->br_blockcount = del->br_startoff - got->br_startoff; in xfs_bmap_del_extent_delay()
5028 got_indlen = xfs_bmap_worst_indlen(ip, got->br_blockcount); in xfs_bmap_del_extent_delay()
5030 new.br_blockcount = got_endoff - del_endoff; in xfs_bmap_del_extent_delay()
5041 * under-filled indirect reservation in this case. in xfs_bmap_del_extent_delay()
5045 stolen = XFS_FILBLKS_MIN(da_new - da_old, in xfs_bmap_del_extent_delay()
5046 del->br_blockcount); in xfs_bmap_del_extent_delay()
5053 got->br_startblock = nullstartblock((int)got_indlen); in xfs_bmap_del_extent_delay()
5056 new.br_state = got->br_state; in xfs_bmap_del_extent_delay()
5063 del->br_blockcount -= stolen; in xfs_bmap_del_extent_delay()
5068 da_diff = da_old - da_new; in xfs_bmap_del_extent_delay()
5072 xfs_add_frextents(mp, xfs_blen_to_rtbxlen(mp, del->br_blockcount)); in xfs_bmap_del_extent_delay()
5074 fdblocks += del->br_blockcount; in xfs_bmap_del_extent_delay()
5077 xfs_mod_delalloc(ip, -(int64_t)del->br_blockcount, -da_diff); in xfs_bmap_del_extent_delay()
5087 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_del_extent_cow()
5095 del_endoff = del->br_startoff + del->br_blockcount; in xfs_bmap_del_extent_cow()
5096 got_endoff = got->br_startoff + got->br_blockcount; in xfs_bmap_del_extent_cow()
5098 ASSERT(del->br_blockcount > 0); in xfs_bmap_del_extent_cow()
5099 ASSERT(got->br_startoff <= del->br_startoff); in xfs_bmap_del_extent_cow()
5101 ASSERT(!isnullstartblock(got->br_startblock)); in xfs_bmap_del_extent_cow()
5103 if (got->br_startoff == del->br_startoff) in xfs_bmap_del_extent_cow()
5120 got->br_startoff = del_endoff; in xfs_bmap_del_extent_cow()
5121 got->br_blockcount -= del->br_blockcount; in xfs_bmap_del_extent_cow()
5122 got->br_startblock = del->br_startblock + del->br_blockcount; in xfs_bmap_del_extent_cow()
5129 got->br_blockcount -= del->br_blockcount; in xfs_bmap_del_extent_cow()
5136 got->br_blockcount = del->br_startoff - got->br_startoff; in xfs_bmap_del_extent_cow()
5139 new.br_blockcount = got_endoff - del_endoff; in xfs_bmap_del_extent_cow()
5140 new.br_state = got->br_state; in xfs_bmap_del_extent_cow()
5141 new.br_startblock = del->br_startblock + del->br_blockcount; in xfs_bmap_del_extent_cow()
5148 ip->i_delayed_blks -= del->br_blockcount; in xfs_bmap_del_extent_cow()
5159 rtg = xfs_rtgroup_grab(tp->t_mountp, 0); in xfs_bmap_free_rtblocks()
5161 return -EIO; in xfs_bmap_free_rtblocks()
5167 if (!(tp->t_flags & XFS_TRANS_RTBITMAP_LOCKED)) { in xfs_bmap_free_rtblocks()
5168 tp->t_flags |= XFS_TRANS_RTBITMAP_LOCKED; in xfs_bmap_free_rtblocks()
5173 error = xfs_rtfree_blocks(tp, rtg, del->br_startblock, in xfs_bmap_free_rtblocks()
5174 del->br_blockcount); in xfs_bmap_free_rtblocks()
5199 int i; /* temp state */ in xfs_bmap_del_extent_real()
5211 mp = ip->i_mount; in xfs_bmap_del_extent_real()
5215 ASSERT(del->br_blockcount > 0); in xfs_bmap_del_extent_real()
5217 ASSERT(got.br_startoff <= del->br_startoff); in xfs_bmap_del_extent_real()
5218 del_endoff = del->br_startoff + del->br_blockcount; in xfs_bmap_del_extent_real()
5232 if (tp->t_blk_res == 0 && in xfs_bmap_del_extent_real()
5233 ifp->if_format == XFS_DINODE_FMT_EXTENTS && in xfs_bmap_del_extent_real()
5234 ifp->if_nextents >= XFS_IFORK_MAXEXT(ip, whichfork) && in xfs_bmap_del_extent_real()
5235 del->br_startoff > got.br_startoff && del_endoff < got_endoff) in xfs_bmap_del_extent_real()
5236 return -ENOSPC; in xfs_bmap_del_extent_real()
5243 nblks = del->br_blockcount; in xfs_bmap_del_extent_real()
5245 del_endblock = del->br_startblock + del->br_blockcount; in xfs_bmap_del_extent_real()
5252 return -EFSCORRUPTED; in xfs_bmap_del_extent_real()
5256 if (got.br_startoff == del->br_startoff) in xfs_bmap_del_extent_real()
5268 ifp->if_nextents--; in xfs_bmap_del_extent_real()
5279 return -EFSCORRUPTED; in xfs_bmap_del_extent_real()
5288 got.br_blockcount -= del->br_blockcount; in xfs_bmap_del_extent_real()
5302 got.br_blockcount -= del->br_blockcount; in xfs_bmap_del_extent_real()
5319 got.br_blockcount = del->br_startoff - got.br_startoff; in xfs_bmap_del_extent_real()
5323 new.br_blockcount = got_endoff - del_endoff; in xfs_bmap_del_extent_real()
5335 cur->bc_rec.b = new; in xfs_bmap_del_extent_real()
5337 if (error && error != -ENOSPC) in xfs_bmap_del_extent_real()
5340 * If get no-space back from btree insert, it tried a in xfs_bmap_del_extent_real()
5344 if (error == -ENOSPC) { in xfs_bmap_del_extent_real()
5354 return -EFSCORRUPTED; in xfs_bmap_del_extent_real()
5369 return -ENOSPC; in xfs_bmap_del_extent_real()
5373 return -EFSCORRUPTED; in xfs_bmap_del_extent_real()
5378 ifp->if_nextents++; in xfs_bmap_del_extent_real()
5401 del->br_state == XFS_EXT_UNWRITTEN) in xfs_bmap_del_extent_real()
5417 error = xfs_free_extent_later(tp, del->br_startblock, in xfs_bmap_del_extent_real()
5418 del->br_blockcount, NULL, in xfs_bmap_del_extent_real()
5429 ip->i_nblocks -= nblks; in xfs_bmap_del_extent_real()
5434 xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); in xfs_bmap_del_extent_real()
5463 struct xfs_mount *mp = ip->i_mount; in __xfs_bunmapi()
5479 return -EFSCORRUPTED; in __xfs_bunmapi()
5482 return -EIO; in __xfs_bunmapi()
5504 end--; in __xfs_bunmapi()
5507 if (ifp->if_format == XFS_DINODE_FMT_BTREE) { in __xfs_bunmapi()
5508 ASSERT(ifp->if_format == XFS_DINODE_FMT_BTREE); in __xfs_bunmapi()
5514 while (end != (xfs_fileoff_t)-1 && end >= start && in __xfs_bunmapi()
5530 got.br_startoff + got.br_blockcount - 1); in __xfs_bunmapi()
5542 del.br_blockcount -= start - got.br_startoff; in __xfs_bunmapi()
5544 del.br_startblock += start - got.br_startoff; in __xfs_bunmapi()
5547 del.br_blockcount = end + 1 - del.br_startoff; in __xfs_bunmapi()
5568 end -= mod > del.br_blockcount ? in __xfs_bunmapi()
5582 ASSERT(tp->t_blk_res > 0); in __xfs_bunmapi()
5588 del.br_startoff += del.br_blockcount - mod; in __xfs_bunmapi()
5589 del.br_startblock += del.br_blockcount - mod; in __xfs_bunmapi()
5603 xfs_extlen_t off = mp->m_sb.sb_rextsize - mod; in __xfs_bunmapi()
5611 del.br_blockcount -= off; in __xfs_bunmapi()
5616 tp->t_blk_res == 0)) { in __xfs_bunmapi()
5622 end -= del.br_blockcount; in __xfs_bunmapi()
5646 del.br_startoff - mod, in __xfs_bunmapi()
5648 mod = unwrite_start - prev.br_startoff; in __xfs_bunmapi()
5651 prev.br_blockcount -= mod; in __xfs_bunmapi()
5683 end = del.br_startoff - 1; in __xfs_bunmapi()
5688 if (end != (xfs_fileoff_t)-1 && end >= start) { in __xfs_bunmapi()
5698 if (done || end == (xfs_fileoff_t)-1 || end < start) in __xfs_bunmapi()
5701 *rlen = end - start + 1; in __xfs_bunmapi()
5722 ifp->if_format != XFS_DINODE_FMT_EXTENTS) in __xfs_bunmapi()
5725 ifp->if_format != XFS_DINODE_FMT_BTREE) in __xfs_bunmapi()
5735 cur->bc_bmap.allocated = 0; in __xfs_bunmapi()
5773 startoff = got->br_startoff - shift; in xfs_bmse_can_merge()
5776 * The extent, once shifted, must be adjacent in-file and on-disk with in xfs_bmse_can_merge()
5779 if ((left->br_startoff + left->br_blockcount != startoff) || in xfs_bmse_can_merge()
5780 (left->br_startblock + left->br_blockcount != got->br_startblock) || in xfs_bmse_can_merge()
5781 (left->br_state != got->br_state) || in xfs_bmse_can_merge()
5782 (left->br_blockcount + got->br_blockcount > XFS_MAX_BMBT_EXTLEN) || in xfs_bmse_can_merge()
5795 * This function assumes the caller has verified a shift-by-merge is possible
5814 struct xfs_mount *mp = ip->i_mount; in xfs_bmse_merge()
5816 blockcount = left->br_blockcount + got->br_blockcount; in xfs_bmse_merge()
5825 * Update the on-disk extent count, the btree if necessary and log the in xfs_bmse_merge()
5828 ifp->if_nextents--; in xfs_bmse_merge()
5841 return -EFSCORRUPTED; in xfs_bmse_merge()
5849 return -EFSCORRUPTED; in xfs_bmse_merge()
5858 return -EFSCORRUPTED; in xfs_bmse_merge()
5879 new.br_startoff = left->br_startoff + left->br_blockcount; in xfs_bmse_merge()
5895 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_shift_update_extent()
5901 got->br_startoff = startoff; in xfs_bmap_shift_update_extent()
5909 return -EFSCORRUPTED; in xfs_bmap_shift_update_extent()
5937 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_collapse_extents()
5949 return -EFSCORRUPTED; in xfs_bmap_collapse_extents()
5953 return -EIO; in xfs_bmap_collapse_extents()
5961 if (ifp->if_format == XFS_DINODE_FMT_BTREE) in xfs_bmap_collapse_extents()
5970 error = -EFSCORRUPTED; in xfs_bmap_collapse_extents()
5974 new_startoff = got.br_startoff - offset_shift_fsb; in xfs_bmap_collapse_extents()
5977 error = -EINVAL; in xfs_bmap_collapse_extents()
5992 error = -EINVAL; in xfs_bmap_collapse_extents()
6017 /* Make sure we won't be right-shifting an extent past the maximum bound. */
6030 if (xfs_is_shutdown(ip->i_mount)) in xfs_bmap_can_insert_extents()
6031 return -EIO; in xfs_bmap_can_insert_extents()
6037 error = -EINVAL; in xfs_bmap_can_insert_extents()
6053 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_insert_extents()
6065 return -EFSCORRUPTED; in xfs_bmap_insert_extents()
6069 return -EIO; in xfs_bmap_insert_extents()
6077 if (ifp->if_format == XFS_DINODE_FMT_BTREE) in xfs_bmap_insert_extents()
6095 error = -EFSCORRUPTED; in xfs_bmap_insert_extents()
6101 error = -EFSCORRUPTED; in xfs_bmap_insert_extents()
6108 error = -EINVAL; in xfs_bmap_insert_extents()
6160 struct xfs_mount *mp = ip->i_mount; in xfs_bmap_split_extent()
6170 return -EFSCORRUPTED; in xfs_bmap_split_extent()
6174 return -EIO; in xfs_bmap_split_extent()
6188 gotblkcnt = split_fsb - got.br_startoff; in xfs_bmap_split_extent()
6191 new.br_blockcount = got.br_blockcount - gotblkcnt; in xfs_bmap_split_extent()
6194 if (ifp->if_format == XFS_DINODE_FMT_BTREE) { in xfs_bmap_split_extent()
6201 error = -EFSCORRUPTED; in xfs_bmap_split_extent()
6221 ifp->if_nextents++; in xfs_bmap_split_extent()
6229 error = -EFSCORRUPTED; in xfs_bmap_split_extent()
6237 error = -EFSCORRUPTED; in xfs_bmap_split_extent()
6256 cur->bc_bmap.allocated = 0; in xfs_bmap_split_extent()
6277 bmap->br_startblock == HOLESTARTBLOCK || in __xfs_bmap_add()
6278 bmap->br_startblock == DELAYSTARTBLOCK) in __xfs_bmap_add()
6282 INIT_LIST_HEAD(&bi->bi_list); in __xfs_bmap_add()
6283 bi->bi_type = type; in __xfs_bmap_add()
6284 bi->bi_owner = ip; in __xfs_bmap_add()
6285 bi->bi_whichfork = whichfork; in __xfs_bmap_add()
6286 bi->bi_bmap = *bmap; in __xfs_bmap_add()
6322 struct xfs_bmbt_irec *bmap = &bi->bi_bmap; in xfs_bmap_finish_one()
6326 if (bi->bi_whichfork == XFS_ATTR_FORK) in xfs_bmap_finish_one()
6329 ASSERT(tp->t_highest_agno == NULLAGNUMBER); in xfs_bmap_finish_one()
6333 if (XFS_TEST_ERROR(false, tp->t_mountp, XFS_ERRTAG_BMAP_FINISH_ONE)) in xfs_bmap_finish_one()
6334 return -EIO; in xfs_bmap_finish_one()
6336 switch (bi->bi_type) { in xfs_bmap_finish_one()
6338 if (bi->bi_bmap.br_state == XFS_EXT_UNWRITTEN) in xfs_bmap_finish_one()
6340 error = xfs_bmapi_remap(tp, bi->bi_owner, bmap->br_startoff, in xfs_bmap_finish_one()
6341 bmap->br_blockcount, bmap->br_startblock, in xfs_bmap_finish_one()
6343 bmap->br_blockcount = 0; in xfs_bmap_finish_one()
6346 error = __xfs_bunmapi(tp, bi->bi_owner, bmap->br_startoff, in xfs_bmap_finish_one()
6347 &bmap->br_blockcount, flags | XFS_BMAPI_REMAP, in xfs_bmap_finish_one()
6352 xfs_bmap_mark_sick(bi->bi_owner, bi->bi_whichfork); in xfs_bmap_finish_one()
6353 error = -EFSCORRUPTED; in xfs_bmap_finish_one()
6367 if (!xfs_verify_fileext(mp, irec->br_startoff, irec->br_blockcount)) in xfs_bmap_validate_extent_raw()
6371 if (!xfs_verify_rtbext(mp, irec->br_startblock, in xfs_bmap_validate_extent_raw()
6372 irec->br_blockcount)) in xfs_bmap_validate_extent_raw()
6375 if (!xfs_verify_fsbext(mp, irec->br_startblock, in xfs_bmap_validate_extent_raw()
6376 irec->br_blockcount)) in xfs_bmap_validate_extent_raw()
6379 if (irec->br_state != XFS_EXT_NORM && whichfork != XFS_DATA_FORK) in xfs_bmap_validate_extent_raw()
6391 return xfs_bmap_intent_cache != NULL ? 0 : -ENOMEM; in xfs_bmap_intent_init_cache()
6408 return xfs_bmap_validate_extent_raw(ip->i_mount, in xfs_bmap_validate_extent()
6430 xfs_filblks_t unmap_len = endoff - startoff + 1; in xfs_bunmapi_range()
6436 ASSERT((*tpp)->t_highest_agno == NULLAGNUMBER); in xfs_bunmapi_range()
6468 xfs_bmbt_disk_get_all(&rec->bmbt, &irec); in xfs_bmap_query_range_helper()
6469 fa = xfs_bmap_validate_extent(cur->bc_ino.ip, cur->bc_ino.whichfork, in xfs_bmap_query_range_helper()
6473 return xfs_bmap_complain_bad_rec(cur->bc_ino.ip, in xfs_bmap_query_range_helper()
6474 cur->bc_ino.whichfork, fa, &irec); in xfs_bmap_query_range_helper()
6477 return query->fn(cur, &irec, query->priv); in xfs_bmap_query_range_helper()
6505 (ip->i_diflags & XFS_DIFLAG_EXTSIZE) && ip->i_extsize) in xfs_get_extsz_hint()
6506 return ip->i_extsize; in xfs_get_extsz_hint()
6508 ip->i_mount->m_sb.sb_rextsize > 1) in xfs_get_extsz_hint()
6509 return ip->i_mount->m_sb.sb_rextsize; in xfs_get_extsz_hint()
6526 if (ip->i_diflags2 & XFS_DIFLAG2_COWEXTSIZE) in xfs_get_cowextsz_hint()
6527 a = ip->i_cowextsize; in xfs_get_cowextsz_hint()
6530 if (ip->i_diflags & XFS_DIFLAG_EXTSIZE) in xfs_get_cowextsz_hint()
6531 b = ip->i_extsize; in xfs_get_cowextsz_hint()