Lines Matching +full:value +full:- +full:start
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
66 int error; /* error value */ in xfs_rtbuf_get()
68 ip = issum ? mp->m_rsumip : mp->m_rbmip; in xfs_rtbuf_get()
75 return -EFSCORRUPTED; in xfs_rtbuf_get()
78 error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, in xfs_rtbuf_get()
80 mp->m_bsize, 0, &bp, &xfs_rtbuf_ops); in xfs_rtbuf_get()
91 * Searching backward from start to limit, find the first block whose
92 * allocated/free state is different from start's.
98 xfs_rtblock_t start, /* starting block to look at */ in xfs_rtfind_back() argument
100 xfs_rtblock_t *rtblock) /* out: start block found */ in xfs_rtfind_back()
107 int error; /* error value */ in xfs_rtfind_back()
109 xfs_rtblock_t i; /* current bit number rel. to start */ in xfs_rtfind_back()
111 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtfind_back()
113 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtfind_back()
119 block = XFS_BITTOBLOCK(mp, start); in xfs_rtfind_back()
124 bufp = bp->b_addr; in xfs_rtfind_back()
128 word = XFS_BITTOWORD(mp, start); in xfs_rtfind_back()
130 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtfind_back()
131 len = start - limit + 1; in xfs_rtfind_back()
133 * Compute match value, based on the bit at start: if 1 (free) in xfs_rtfind_back()
134 * then all-ones, else all-zeroes. in xfs_rtfind_back()
136 want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; in xfs_rtfind_back()
138 * If the starting position is not word-aligned, deal with the in xfs_rtfind_back()
141 if (bit < XFS_NBWORD - 1) { in xfs_rtfind_back()
146 firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); in xfs_rtfind_back()
147 mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << in xfs_rtfind_back()
150 * Calculate the difference between the value there in xfs_rtfind_back()
158 i = bit - XFS_RTHIBIT(wdiff); in xfs_rtfind_back()
159 *rtblock = start - i + 1; in xfs_rtfind_back()
162 i = bit - firstbit + 1; in xfs_rtfind_back()
167 if (--word == -1 && i < len) { in xfs_rtfind_back()
172 error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); in xfs_rtfind_back()
176 bufp = bp->b_addr; in xfs_rtfind_back()
183 b--; in xfs_rtfind_back()
195 while (len - i >= XFS_NBWORD) { in xfs_rtfind_back()
197 * Compute difference between actual and desired value. in xfs_rtfind_back()
204 i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); in xfs_rtfind_back()
205 *rtblock = start - i + 1; in xfs_rtfind_back()
213 if (--word == -1 && i < len) { in xfs_rtfind_back()
218 error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); in xfs_rtfind_back()
222 bufp = bp->b_addr; in xfs_rtfind_back()
229 b--; in xfs_rtfind_back()
236 if (len - i) { in xfs_rtfind_back()
241 firstbit = XFS_NBWORD - (len - i); in xfs_rtfind_back()
242 mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; in xfs_rtfind_back()
244 * Compute difference between actual and desired value. in xfs_rtfind_back()
251 i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); in xfs_rtfind_back()
252 *rtblock = start - i + 1; in xfs_rtfind_back()
261 *rtblock = start - i + 1; in xfs_rtfind_back()
266 * Searching forward from start to limit, find the first block whose
267 * allocated/free state is different from start's.
273 xfs_rtblock_t start, /* starting block to look at */ in xfs_rtfind_forw() argument
275 xfs_rtblock_t *rtblock) /* out: start block found */ in xfs_rtfind_forw()
282 int error; /* error value */ in xfs_rtfind_forw()
283 xfs_rtblock_t i; /* current bit number rel. to start */ in xfs_rtfind_forw()
286 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtfind_forw()
288 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtfind_forw()
291 ASSERT(start <= limit); in xfs_rtfind_forw()
296 block = XFS_BITTOBLOCK(mp, start); in xfs_rtfind_forw()
301 bufp = bp->b_addr; in xfs_rtfind_forw()
305 word = XFS_BITTOWORD(mp, start); in xfs_rtfind_forw()
307 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtfind_forw()
308 len = limit - start + 1; in xfs_rtfind_forw()
310 * Compute match value, based on the bit at start: if 1 (free) in xfs_rtfind_forw()
311 * then all-ones, else all-zeroes. in xfs_rtfind_forw()
313 want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; in xfs_rtfind_forw()
315 * If the starting position is not word-aligned, deal with the in xfs_rtfind_forw()
324 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtfind_forw()
326 * Calculate the difference between the value there in xfs_rtfind_forw()
334 i = XFS_RTLOBIT(wdiff) - bit; in xfs_rtfind_forw()
335 *rtblock = start + i - 1; in xfs_rtfind_forw()
338 i = lastbit - bit; in xfs_rtfind_forw()
352 b = bufp = bp->b_addr; in xfs_rtfind_forw()
370 while (len - i >= XFS_NBWORD) { in xfs_rtfind_forw()
372 * Compute difference between actual and desired value. in xfs_rtfind_forw()
380 *rtblock = start + i - 1; in xfs_rtfind_forw()
397 b = bufp = bp->b_addr; in xfs_rtfind_forw()
410 if ((lastbit = len - i)) { in xfs_rtfind_forw()
414 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtfind_forw()
416 * Compute difference between actual and desired value. in xfs_rtfind_forw()
424 *rtblock = start + i - 1; in xfs_rtfind_forw()
433 *rtblock = start + i - 1; in xfs_rtfind_forw()
458 int error; /* error value */ in xfs_rtmodify_summary_int()
500 uint first = (uint)((char *)sp - (char *)bp->b_addr); in xfs_rtmodify_summary_int()
503 if (mp->m_rsum_cache) { in xfs_rtmodify_summary_int()
504 if (*sp == 0 && log == mp->m_rsum_cache[bbno]) in xfs_rtmodify_summary_int()
505 mp->m_rsum_cache[bbno]++; in xfs_rtmodify_summary_int()
506 if (*sp != 0 && log < mp->m_rsum_cache[bbno]) in xfs_rtmodify_summary_int()
507 mp->m_rsum_cache[bbno] = log; in xfs_rtmodify_summary_int()
509 xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); in xfs_rtmodify_summary_int()
531 * Set the given range of bitmap bits to the given value.
538 xfs_rtblock_t start, /* starting block to modify */ in xfs_rtmodify_range() argument
547 int error; /* error value */ in xfs_rtmodify_range()
549 int i; /* current bit number rel. to start */ in xfs_rtmodify_range()
551 xfs_rtword_t mask; /* mask o frelevant bits for value */ in xfs_rtmodify_range()
557 block = XFS_BITTOBLOCK(mp, start); in xfs_rtmodify_range()
565 bufp = bp->b_addr; in xfs_rtmodify_range()
569 word = XFS_BITTOWORD(mp, start); in xfs_rtmodify_range()
571 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtmodify_range()
575 val = -val; in xfs_rtmodify_range()
585 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtmodify_range()
593 i = lastbit - bit; in xfs_rtmodify_range()
604 (uint)((char *)first - (char *)bufp), in xfs_rtmodify_range()
605 (uint)((char *)b - (char *)bufp)); in xfs_rtmodify_range()
610 first = b = bufp = bp->b_addr; in xfs_rtmodify_range()
628 while (len - i >= XFS_NBWORD) { in xfs_rtmodify_range()
630 * Set the word value correctly. in xfs_rtmodify_range()
644 (uint)((char *)first - (char *)bufp), in xfs_rtmodify_range()
645 (uint)((char *)b - (char *)bufp)); in xfs_rtmodify_range()
650 first = b = bufp = bp->b_addr; in xfs_rtmodify_range()
663 if ((lastbit = len - i)) { in xfs_rtmodify_range()
667 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtmodify_range()
681 xfs_trans_log_buf(tp, bp, (uint)((char *)first - (char *)bufp), in xfs_rtmodify_range()
682 (uint)((char *)b - (char *)bufp - 1)); in xfs_rtmodify_range()
687 * Mark an extent specified by start and len freed.
694 xfs_rtblock_t start, /* starting block to free */ in xfs_rtfree_range() argument
700 int error; /* error value */ in xfs_rtfree_range()
702 xfs_rtblock_t preblock; /* first block freed < start */ in xfs_rtfree_range()
704 end = start + len - 1; in xfs_rtfree_range()
708 error = xfs_rtmodify_range(mp, tp, start, len, 1); in xfs_rtfree_range()
717 error = xfs_rtfind_back(mp, tp, start, 0, &preblock); in xfs_rtfree_range()
724 error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, in xfs_rtfree_range()
732 if (preblock < start) { in xfs_rtfree_range()
734 XFS_RTBLOCKLOG(start - preblock), in xfs_rtfree_range()
735 XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); in xfs_rtfree_range()
746 XFS_RTBLOCKLOG(postblock - end), in xfs_rtfree_range()
747 XFS_BITTOBLOCK(mp, end + 1), -1, rbpp, rsb); in xfs_rtfree_range()
757 XFS_RTBLOCKLOG(postblock + 1 - preblock), in xfs_rtfree_range()
770 xfs_rtblock_t start, /* starting block number of extent */ in xfs_rtcheck_range() argument
781 int error; /* error value */ in xfs_rtcheck_range()
782 xfs_rtblock_t i; /* current bit number rel. to start */ in xfs_rtcheck_range()
784 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtcheck_range()
785 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtcheck_range()
791 block = XFS_BITTOBLOCK(mp, start); in xfs_rtcheck_range()
799 bufp = bp->b_addr; in xfs_rtcheck_range()
803 word = XFS_BITTOWORD(mp, start); in xfs_rtcheck_range()
805 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtcheck_range()
809 val = -val; in xfs_rtcheck_range()
822 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtcheck_range()
824 * Compute difference between actual and desired value. in xfs_rtcheck_range()
831 i = XFS_RTLOBIT(wdiff) - bit; in xfs_rtcheck_range()
832 *new = start + i; in xfs_rtcheck_range()
836 i = lastbit - bit; in xfs_rtcheck_range()
850 b = bufp = bp->b_addr; in xfs_rtcheck_range()
868 while (len - i >= XFS_NBWORD) { in xfs_rtcheck_range()
870 * Compute difference between actual and desired value. in xfs_rtcheck_range()
878 *new = start + i; in xfs_rtcheck_range()
896 b = bufp = bp->b_addr; in xfs_rtcheck_range()
909 if ((lastbit = len - i)) { in xfs_rtcheck_range()
913 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtcheck_range()
915 * Compute difference between actual and desired value. in xfs_rtcheck_range()
923 *new = start + i; in xfs_rtcheck_range()
933 *new = start + i; in xfs_rtcheck_range()
972 int error; /* error value */ in xfs_rtfree_extent()
977 mp = tp->t_mountp; in xfs_rtfree_extent()
979 ASSERT(mp->m_rbmip->i_itemp != NULL); in xfs_rtfree_extent()
980 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); in xfs_rtfree_extent()
1001 if (tp->t_frextents_delta + mp->m_sb.sb_frextents == in xfs_rtfree_extent()
1002 mp->m_sb.sb_rextents) { in xfs_rtfree_extent()
1003 if (!(mp->m_rbmip->i_diflags & XFS_DIFLAG_NEWRTBM)) in xfs_rtfree_extent()
1004 mp->m_rbmip->i_diflags |= XFS_DIFLAG_NEWRTBM; in xfs_rtfree_extent()
1005 *(uint64_t *)&VFS_I(mp->m_rbmip)->i_atime = 0; in xfs_rtfree_extent()
1006 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); in xfs_rtfree_extent()
1022 struct xfs_mount *mp = tp->t_mountp; in xfs_rtfree_blocks()
1029 len = div_u64_rem(rtlen, mp->m_sb.sb_rextsize, &mod); in xfs_rtfree_blocks()
1032 return -EIO; in xfs_rtfree_blocks()
1035 bno = div_u64_rem(rtbno, mp->m_sb.sb_rextsize, &mod); in xfs_rtfree_blocks()
1038 return -EIO; in xfs_rtfree_blocks()
1061 if (low_rec->ar_startext > high_rec->ar_startext) in xfs_rtalloc_query_range()
1062 return -EINVAL; in xfs_rtalloc_query_range()
1063 if (low_rec->ar_startext >= mp->m_sb.sb_rextents || in xfs_rtalloc_query_range()
1064 low_rec->ar_startext == high_rec->ar_startext) in xfs_rtalloc_query_range()
1067 high_key = min(high_rec->ar_startext, mp->m_sb.sb_rextents - 1); in xfs_rtalloc_query_range()
1070 rtstart = low_rec->ar_startext; in xfs_rtalloc_query_range()
1085 rec.ar_extcount = rtend - rtstart + 1; in xfs_rtalloc_query_range()
1109 keys[1].ar_startext = mp->m_sb.sb_rextents - 1; in xfs_rtalloc_query_all()
1120 xfs_rtblock_t start, in xfs_rtalloc_extent_is_free() argument
1128 error = xfs_rtcheck_range(mp, tp, start, len, 1, &end, &matches); in xfs_rtalloc_extent_is_free()