Lines Matching +full:value +full:- +full:start
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
65 int error; /* error value */ in xfs_rtbuf_get()
67 ip = issum ? mp->m_rsumip : mp->m_rbmip; in xfs_rtbuf_get()
74 return -EFSCORRUPTED; in xfs_rtbuf_get()
77 error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, in xfs_rtbuf_get()
79 mp->m_bsize, 0, &bp, &xfs_rtbuf_ops); in xfs_rtbuf_get()
90 * Searching backward from start to limit, find the first block whose
91 * allocated/free state is different from start's.
97 xfs_rtblock_t start, /* starting block to look at */ in xfs_rtfind_back() argument
99 xfs_rtblock_t *rtblock) /* out: start block found */ in xfs_rtfind_back()
106 int error; /* error value */ in xfs_rtfind_back()
108 xfs_rtblock_t i; /* current bit number rel. to start */ in xfs_rtfind_back()
110 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtfind_back()
112 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtfind_back()
118 block = XFS_BITTOBLOCK(mp, start); in xfs_rtfind_back()
123 bufp = bp->b_addr; in xfs_rtfind_back()
127 word = XFS_BITTOWORD(mp, start); in xfs_rtfind_back()
129 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtfind_back()
130 len = start - limit + 1; in xfs_rtfind_back()
132 * Compute match value, based on the bit at start: if 1 (free) in xfs_rtfind_back()
133 * then all-ones, else all-zeroes. in xfs_rtfind_back()
135 want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; in xfs_rtfind_back()
137 * If the starting position is not word-aligned, deal with the in xfs_rtfind_back()
140 if (bit < XFS_NBWORD - 1) { in xfs_rtfind_back()
145 firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); in xfs_rtfind_back()
146 mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << in xfs_rtfind_back()
149 * Calculate the difference between the value there in xfs_rtfind_back()
157 i = bit - XFS_RTHIBIT(wdiff); in xfs_rtfind_back()
158 *rtblock = start - i + 1; in xfs_rtfind_back()
161 i = bit - firstbit + 1; in xfs_rtfind_back()
166 if (--word == -1 && i < len) { in xfs_rtfind_back()
171 error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); in xfs_rtfind_back()
175 bufp = bp->b_addr; in xfs_rtfind_back()
182 b--; in xfs_rtfind_back()
194 while (len - i >= XFS_NBWORD) { in xfs_rtfind_back()
196 * Compute difference between actual and desired value. in xfs_rtfind_back()
203 i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); in xfs_rtfind_back()
204 *rtblock = start - i + 1; in xfs_rtfind_back()
212 if (--word == -1 && i < len) { in xfs_rtfind_back()
217 error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); in xfs_rtfind_back()
221 bufp = bp->b_addr; in xfs_rtfind_back()
228 b--; in xfs_rtfind_back()
235 if (len - i) { in xfs_rtfind_back()
240 firstbit = XFS_NBWORD - (len - i); in xfs_rtfind_back()
241 mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; in xfs_rtfind_back()
243 * Compute difference between actual and desired value. in xfs_rtfind_back()
250 i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); in xfs_rtfind_back()
251 *rtblock = start - i + 1; in xfs_rtfind_back()
260 *rtblock = start - i + 1; in xfs_rtfind_back()
265 * Searching forward from start to limit, find the first block whose
266 * allocated/free state is different from start's.
272 xfs_rtblock_t start, /* starting block to look at */ in xfs_rtfind_forw() argument
274 xfs_rtblock_t *rtblock) /* out: start block found */ in xfs_rtfind_forw()
281 int error; /* error value */ in xfs_rtfind_forw()
282 xfs_rtblock_t i; /* current bit number rel. to start */ in xfs_rtfind_forw()
285 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtfind_forw()
287 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtfind_forw()
293 block = XFS_BITTOBLOCK(mp, start); in xfs_rtfind_forw()
298 bufp = bp->b_addr; in xfs_rtfind_forw()
302 word = XFS_BITTOWORD(mp, start); in xfs_rtfind_forw()
304 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtfind_forw()
305 len = limit - start + 1; in xfs_rtfind_forw()
307 * Compute match value, based on the bit at start: if 1 (free) in xfs_rtfind_forw()
308 * then all-ones, else all-zeroes. in xfs_rtfind_forw()
310 want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; in xfs_rtfind_forw()
312 * If the starting position is not word-aligned, deal with the in xfs_rtfind_forw()
321 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtfind_forw()
323 * Calculate the difference between the value there in xfs_rtfind_forw()
331 i = XFS_RTLOBIT(wdiff) - bit; in xfs_rtfind_forw()
332 *rtblock = start + i - 1; in xfs_rtfind_forw()
335 i = lastbit - bit; in xfs_rtfind_forw()
349 b = bufp = bp->b_addr; in xfs_rtfind_forw()
367 while (len - i >= XFS_NBWORD) { in xfs_rtfind_forw()
369 * Compute difference between actual and desired value. in xfs_rtfind_forw()
377 *rtblock = start + i - 1; in xfs_rtfind_forw()
394 b = bufp = bp->b_addr; in xfs_rtfind_forw()
407 if ((lastbit = len - i)) { in xfs_rtfind_forw()
411 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtfind_forw()
413 * Compute difference between actual and desired value. in xfs_rtfind_forw()
421 *rtblock = start + i - 1; in xfs_rtfind_forw()
430 *rtblock = start + i - 1; in xfs_rtfind_forw()
455 int error; /* error value */ in xfs_rtmodify_summary_int()
497 uint first = (uint)((char *)sp - (char *)bp->b_addr); in xfs_rtmodify_summary_int()
500 if (mp->m_rsum_cache) { in xfs_rtmodify_summary_int()
501 if (*sp == 0 && log == mp->m_rsum_cache[bbno]) in xfs_rtmodify_summary_int()
502 mp->m_rsum_cache[bbno]++; in xfs_rtmodify_summary_int()
503 if (*sp != 0 && log < mp->m_rsum_cache[bbno]) in xfs_rtmodify_summary_int()
504 mp->m_rsum_cache[bbno] = log; in xfs_rtmodify_summary_int()
506 xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); in xfs_rtmodify_summary_int()
528 * Set the given range of bitmap bits to the given value.
535 xfs_rtblock_t start, /* starting block to modify */ in xfs_rtmodify_range() argument
544 int error; /* error value */ in xfs_rtmodify_range()
546 int i; /* current bit number rel. to start */ in xfs_rtmodify_range()
548 xfs_rtword_t mask; /* mask o frelevant bits for value */ in xfs_rtmodify_range()
554 block = XFS_BITTOBLOCK(mp, start); in xfs_rtmodify_range()
562 bufp = bp->b_addr; in xfs_rtmodify_range()
566 word = XFS_BITTOWORD(mp, start); in xfs_rtmodify_range()
568 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtmodify_range()
572 val = -val; in xfs_rtmodify_range()
582 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtmodify_range()
590 i = lastbit - bit; in xfs_rtmodify_range()
601 (uint)((char *)first - (char *)bufp), in xfs_rtmodify_range()
602 (uint)((char *)b - (char *)bufp)); in xfs_rtmodify_range()
607 first = b = bufp = bp->b_addr; in xfs_rtmodify_range()
625 while (len - i >= XFS_NBWORD) { in xfs_rtmodify_range()
627 * Set the word value correctly. in xfs_rtmodify_range()
641 (uint)((char *)first - (char *)bufp), in xfs_rtmodify_range()
642 (uint)((char *)b - (char *)bufp)); in xfs_rtmodify_range()
647 first = b = bufp = bp->b_addr; in xfs_rtmodify_range()
660 if ((lastbit = len - i)) { in xfs_rtmodify_range()
664 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtmodify_range()
678 xfs_trans_log_buf(tp, bp, (uint)((char *)first - (char *)bufp), in xfs_rtmodify_range()
679 (uint)((char *)b - (char *)bufp - 1)); in xfs_rtmodify_range()
684 * Mark an extent specified by start and len freed.
691 xfs_rtblock_t start, /* starting block to free */ in xfs_rtfree_range() argument
697 int error; /* error value */ in xfs_rtfree_range()
699 xfs_rtblock_t preblock; /* first block freed < start */ in xfs_rtfree_range()
701 end = start + len - 1; in xfs_rtfree_range()
705 error = xfs_rtmodify_range(mp, tp, start, len, 1); in xfs_rtfree_range()
714 error = xfs_rtfind_back(mp, tp, start, 0, &preblock); in xfs_rtfree_range()
721 error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, in xfs_rtfree_range()
729 if (preblock < start) { in xfs_rtfree_range()
731 XFS_RTBLOCKLOG(start - preblock), in xfs_rtfree_range()
732 XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); in xfs_rtfree_range()
743 XFS_RTBLOCKLOG(postblock - end), in xfs_rtfree_range()
744 XFS_BITTOBLOCK(mp, end + 1), -1, rbpp, rsb); in xfs_rtfree_range()
754 XFS_RTBLOCKLOG(postblock + 1 - preblock), in xfs_rtfree_range()
767 xfs_rtblock_t start, /* starting block number of extent */ in xfs_rtcheck_range() argument
778 int error; /* error value */ in xfs_rtcheck_range()
779 xfs_rtblock_t i; /* current bit number rel. to start */ in xfs_rtcheck_range()
781 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtcheck_range()
782 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtcheck_range()
788 block = XFS_BITTOBLOCK(mp, start); in xfs_rtcheck_range()
796 bufp = bp->b_addr; in xfs_rtcheck_range()
800 word = XFS_BITTOWORD(mp, start); in xfs_rtcheck_range()
802 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtcheck_range()
806 val = -val; in xfs_rtcheck_range()
819 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtcheck_range()
821 * Compute difference between actual and desired value. in xfs_rtcheck_range()
828 i = XFS_RTLOBIT(wdiff) - bit; in xfs_rtcheck_range()
829 *new = start + i; in xfs_rtcheck_range()
833 i = lastbit - bit; in xfs_rtcheck_range()
847 b = bufp = bp->b_addr; in xfs_rtcheck_range()
865 while (len - i >= XFS_NBWORD) { in xfs_rtcheck_range()
867 * Compute difference between actual and desired value. in xfs_rtcheck_range()
875 *new = start + i; in xfs_rtcheck_range()
893 b = bufp = bp->b_addr; in xfs_rtcheck_range()
906 if ((lastbit = len - i)) { in xfs_rtcheck_range()
910 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtcheck_range()
912 * Compute difference between actual and desired value. in xfs_rtcheck_range()
920 *new = start + i; in xfs_rtcheck_range()
930 *new = start + i; in xfs_rtcheck_range()
969 int error; /* error value */ in xfs_rtfree_extent()
974 mp = tp->t_mountp; in xfs_rtfree_extent()
976 ASSERT(mp->m_rbmip->i_itemp != NULL); in xfs_rtfree_extent()
977 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); in xfs_rtfree_extent()
998 if (tp->t_frextents_delta + mp->m_sb.sb_frextents == in xfs_rtfree_extent()
999 mp->m_sb.sb_rextents) { in xfs_rtfree_extent()
1000 if (!(mp->m_rbmip->i_diflags & XFS_DIFLAG_NEWRTBM)) in xfs_rtfree_extent()
1001 mp->m_rbmip->i_diflags |= XFS_DIFLAG_NEWRTBM; in xfs_rtfree_extent()
1002 *(uint64_t *)&VFS_I(mp->m_rbmip)->i_atime = 0; in xfs_rtfree_extent()
1003 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); in xfs_rtfree_extent()
1025 if (low_rec->ar_startext > high_rec->ar_startext) in xfs_rtalloc_query_range()
1026 return -EINVAL; in xfs_rtalloc_query_range()
1027 if (low_rec->ar_startext >= mp->m_sb.sb_rextents || in xfs_rtalloc_query_range()
1028 low_rec->ar_startext == high_rec->ar_startext) in xfs_rtalloc_query_range()
1031 high_key = min(high_rec->ar_startext, mp->m_sb.sb_rextents - 1); in xfs_rtalloc_query_range()
1034 rtstart = low_rec->ar_startext; in xfs_rtalloc_query_range()
1049 rec.ar_extcount = rtend - rtstart + 1; in xfs_rtalloc_query_range()
1073 keys[1].ar_startext = mp->m_sb.sb_rextents - 1; in xfs_rtalloc_query_all()
1084 xfs_rtblock_t start, in xfs_rtalloc_extent_is_free() argument
1092 error = xfs_rtcheck_range(mp, tp, start, len, 1, &end, &matches); in xfs_rtalloc_extent_is_free()