Lines Matching +full:value +full:- +full:start
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
55 if (args->rbmbp) { in xfs_rtbuf_cache_relse()
56 xfs_trans_brelse(args->tp, args->rbmbp); in xfs_rtbuf_cache_relse()
57 args->rbmbp = NULL; in xfs_rtbuf_cache_relse()
58 args->rbmoff = NULLFILEOFF; in xfs_rtbuf_cache_relse()
60 if (args->sumbp) { in xfs_rtbuf_cache_relse()
61 xfs_trans_brelse(args->tp, args->sumbp); in xfs_rtbuf_cache_relse()
62 args->sumbp = NULL; in xfs_rtbuf_cache_relse()
63 args->sumoff = NULLFILEOFF; in xfs_rtbuf_cache_relse()
77 struct xfs_mount *mp = args->mp; in xfs_rtbuf_get()
88 cbpp = &args->sumbp; in xfs_rtbuf_get()
89 coffp = &args->sumoff; in xfs_rtbuf_get()
90 ip = mp->m_rsumip; in xfs_rtbuf_get()
93 cbpp = &args->rbmbp; in xfs_rtbuf_get()
94 coffp = &args->rbmoff; in xfs_rtbuf_get()
95 ip = mp->m_rbmip; in xfs_rtbuf_get()
110 xfs_trans_brelse(args->tp, *cbpp); in xfs_rtbuf_get()
119 return -EFSCORRUPTED; in xfs_rtbuf_get()
122 error = xfs_trans_read_buf(mp, args->tp, mp->m_ddev_targp, in xfs_rtbuf_get()
124 mp->m_bsize, 0, &bp, &xfs_rtbuf_ops); in xfs_rtbuf_get()
128 xfs_trans_buf_set_type(args->tp, bp, type); in xfs_rtbuf_get()
135 * Searching backward from start to limit, find the first block whose
136 * allocated/free state is different from start's.
141 xfs_rtxnum_t start, /* starting rtext to look at */ in xfs_rtfind_back() argument
143 xfs_rtxnum_t *rtx) /* out: start rtext found */ in xfs_rtfind_back()
145 struct xfs_mount *mp = args->mp; in xfs_rtfind_back()
148 int error; /* error value */ in xfs_rtfind_back()
150 xfs_rtxnum_t i; /* current bit number rel. to start */ in xfs_rtfind_back()
152 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtfind_back()
154 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtfind_back()
161 block = xfs_rtx_to_rbmblock(mp, start); in xfs_rtfind_back()
169 word = xfs_rtx_to_rbmword(mp, start); in xfs_rtfind_back()
170 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtfind_back()
171 len = start - limit + 1; in xfs_rtfind_back()
173 * Compute match value, based on the bit at start: if 1 (free) in xfs_rtfind_back()
174 * then all-ones, else all-zeroes. in xfs_rtfind_back()
177 want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0; in xfs_rtfind_back()
179 * If the starting position is not word-aligned, deal with the in xfs_rtfind_back()
182 if (bit < XFS_NBWORD - 1) { in xfs_rtfind_back()
187 firstbit = max_t(xfs_srtblock_t, bit - len + 1, 0); in xfs_rtfind_back()
188 mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << in xfs_rtfind_back()
191 * Calculate the difference between the value there in xfs_rtfind_back()
198 i = bit - xfs_highbit32(wdiff); in xfs_rtfind_back()
199 *rtx = start - i + 1; in xfs_rtfind_back()
202 i = bit - firstbit + 1; in xfs_rtfind_back()
207 if (--word == -1 && i < len) { in xfs_rtfind_back()
211 error = xfs_rtbitmap_read_buf(args, --block); in xfs_rtfind_back()
215 word = mp->m_blockwsize - 1; in xfs_rtfind_back()
227 while (len - i >= XFS_NBWORD) { in xfs_rtfind_back()
229 * Compute difference between actual and desired value. in xfs_rtfind_back()
236 i += XFS_NBWORD - 1 - xfs_highbit32(wdiff); in xfs_rtfind_back()
237 *rtx = start - i + 1; in xfs_rtfind_back()
245 if (--word == -1 && i < len) { in xfs_rtfind_back()
249 error = xfs_rtbitmap_read_buf(args, --block); in xfs_rtfind_back()
253 word = mp->m_blockwsize - 1; in xfs_rtfind_back()
260 if (len - i) { in xfs_rtfind_back()
265 firstbit = XFS_NBWORD - (len - i); in xfs_rtfind_back()
266 mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; in xfs_rtfind_back()
268 * Compute difference between actual and desired value. in xfs_rtfind_back()
275 i += XFS_NBWORD - 1 - xfs_highbit32(wdiff); in xfs_rtfind_back()
276 *rtx = start - i + 1; in xfs_rtfind_back()
284 *rtx = start - i + 1; in xfs_rtfind_back()
289 * Searching forward from start to limit, find the first block whose
290 * allocated/free state is different from start's.
295 xfs_rtxnum_t start, /* starting rtext to look at */ in xfs_rtfind_forw() argument
297 xfs_rtxnum_t *rtx) /* out: start rtext found */ in xfs_rtfind_forw()
299 struct xfs_mount *mp = args->mp; in xfs_rtfind_forw()
303 xfs_rtxnum_t i; /* current bit number rel. to start */ in xfs_rtfind_forw()
306 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtfind_forw()
308 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtfind_forw()
315 block = xfs_rtx_to_rbmblock(mp, start); in xfs_rtfind_forw()
323 word = xfs_rtx_to_rbmword(mp, start); in xfs_rtfind_forw()
324 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtfind_forw()
325 len = limit - start + 1; in xfs_rtfind_forw()
327 * Compute match value, based on the bit at start: if 1 (free) in xfs_rtfind_forw()
328 * then all-ones, else all-zeroes. in xfs_rtfind_forw()
331 want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0; in xfs_rtfind_forw()
333 * If the starting position is not word-aligned, deal with the in xfs_rtfind_forw()
342 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtfind_forw()
344 * Calculate the difference between the value there in xfs_rtfind_forw()
351 i = xfs_lowbit32(wdiff) - bit; in xfs_rtfind_forw()
352 *rtx = start + i - 1; in xfs_rtfind_forw()
355 i = lastbit - bit; in xfs_rtfind_forw()
360 if (++word == mp->m_blockwsize && i < len) { in xfs_rtfind_forw()
380 while (len - i >= XFS_NBWORD) { in xfs_rtfind_forw()
382 * Compute difference between actual and desired value. in xfs_rtfind_forw()
390 *rtx = start + i - 1; in xfs_rtfind_forw()
398 if (++word == mp->m_blockwsize && i < len) { in xfs_rtfind_forw()
413 if ((lastbit = len - i)) { in xfs_rtfind_forw()
417 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtfind_forw()
419 * Compute difference between actual and desired value. in xfs_rtfind_forw()
427 *rtx = start + i - 1; in xfs_rtfind_forw()
435 *rtx = start + i - 1; in xfs_rtfind_forw()
445 struct xfs_buf *bp = args->sumbp; in xfs_trans_log_rtsummary()
448 first = (void *)xfs_rsumblock_infoptr(args, infoword) - bp->b_addr; in xfs_trans_log_rtsummary()
449 last = first + sizeof(xfs_suminfo_t) - 1; in xfs_trans_log_rtsummary()
451 xfs_trans_log_buf(args->tp, bp, first, last); in xfs_trans_log_rtsummary()
465 struct xfs_mount *mp = args->mp; in xfs_rtmodify_summary()
478 if (mp->m_rsum_cache) { in xfs_rtmodify_summary()
479 if (val == 0 && log + 1 == mp->m_rsum_cache[bbno]) in xfs_rtmodify_summary()
480 mp->m_rsum_cache[bbno] = log; in xfs_rtmodify_summary()
481 if (val != 0 && log >= mp->m_rsum_cache[bbno]) in xfs_rtmodify_summary()
482 mp->m_rsum_cache[bbno] = log + 1; in xfs_rtmodify_summary()
500 struct xfs_mount *mp = args->mp; in xfs_rtget_summary()
517 struct xfs_buf *bp = args->rbmbp; in xfs_trans_log_rtbitmap()
520 first = (void *)xfs_rbmblock_wordptr(args, from) - bp->b_addr; in xfs_trans_log_rtbitmap()
521 last = ((void *)xfs_rbmblock_wordptr(args, next) - 1) - bp->b_addr; in xfs_trans_log_rtbitmap()
523 xfs_trans_log_buf(args->tp, bp, first, last); in xfs_trans_log_rtbitmap()
527 * Set the given range of bitmap bits to the given value.
533 xfs_rtxnum_t start, /* starting rtext to modify */ in xfs_rtmodify_range() argument
537 struct xfs_mount *mp = args->mp; in xfs_rtmodify_range()
541 int i; /* current bit number rel. to start */ in xfs_rtmodify_range()
543 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtmodify_range()
551 block = xfs_rtx_to_rbmblock(mp, start); in xfs_rtmodify_range()
562 firstword = word = xfs_rtx_to_rbmword(mp, start); in xfs_rtmodify_range()
563 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtmodify_range()
567 val = -val; in xfs_rtmodify_range()
577 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtmodify_range()
587 i = lastbit - bit; in xfs_rtmodify_range()
592 if (++word == mp->m_blockwsize && i < len) { in xfs_rtmodify_range()
614 while (len - i >= XFS_NBWORD) { in xfs_rtmodify_range()
616 * Set the word value correctly. in xfs_rtmodify_range()
624 if (++word == mp->m_blockwsize && i < len) { in xfs_rtmodify_range()
641 if ((lastbit = len - i)) { in xfs_rtmodify_range()
645 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtmodify_range()
666 * Mark an extent specified by start and len freed.
672 xfs_rtxnum_t start, /* starting rtext to free */ in xfs_rtfree_range() argument
675 struct xfs_mount *mp = args->mp; in xfs_rtfree_range()
677 int error; /* error value */ in xfs_rtfree_range()
679 xfs_rtxnum_t preblock; /* first rtext freed < start */ in xfs_rtfree_range()
681 end = start + len - 1; in xfs_rtfree_range()
685 error = xfs_rtmodify_range(args, start, len, 1); in xfs_rtfree_range()
694 error = xfs_rtfind_back(args, start, 0, &preblock); in xfs_rtfree_range()
701 error = xfs_rtfind_forw(args, end, mp->m_sb.sb_rextents - 1, in xfs_rtfree_range()
709 if (preblock < start) { in xfs_rtfree_range()
711 xfs_highbit64(start - preblock), in xfs_rtfree_range()
712 xfs_rtx_to_rbmblock(mp, preblock), -1); in xfs_rtfree_range()
723 xfs_highbit64(postblock - end), in xfs_rtfree_range()
724 xfs_rtx_to_rbmblock(mp, end + 1), -1); in xfs_rtfree_range()
734 xfs_highbit64(postblock + 1 - preblock), in xfs_rtfree_range()
745 xfs_rtxnum_t start, /* starting rtext number of extent */ in xfs_rtcheck_range() argument
751 struct xfs_mount *mp = args->mp; in xfs_rtcheck_range()
755 xfs_rtxnum_t i; /* current bit number rel. to start */ in xfs_rtcheck_range()
757 xfs_rtword_t mask; /* mask of relevant bits for value */ in xfs_rtcheck_range()
758 xfs_rtword_t wdiff; /* difference from wanted value */ in xfs_rtcheck_range()
765 block = xfs_rtx_to_rbmblock(mp, start); in xfs_rtcheck_range()
776 word = xfs_rtx_to_rbmword(mp, start); in xfs_rtcheck_range()
777 bit = (int)(start & (XFS_NBWORD - 1)); in xfs_rtcheck_range()
781 val = -val; in xfs_rtcheck_range()
794 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; in xfs_rtcheck_range()
796 * Compute difference between actual and desired value. in xfs_rtcheck_range()
803 i = xfs_lowbit32(wdiff) - bit; in xfs_rtcheck_range()
804 *new = start + i; in xfs_rtcheck_range()
808 i = lastbit - bit; in xfs_rtcheck_range()
813 if (++word == mp->m_blockwsize && i < len) { in xfs_rtcheck_range()
833 while (len - i >= XFS_NBWORD) { in xfs_rtcheck_range()
835 * Compute difference between actual and desired value. in xfs_rtcheck_range()
843 *new = start + i; in xfs_rtcheck_range()
852 if (++word == mp->m_blockwsize && i < len) { in xfs_rtcheck_range()
867 if ((lastbit = len - i)) { in xfs_rtcheck_range()
871 mask = ((xfs_rtword_t)1 << lastbit) - 1; in xfs_rtcheck_range()
873 * Compute difference between actual and desired value. in xfs_rtcheck_range()
881 *new = start + i; in xfs_rtcheck_range()
890 *new = start + i; in xfs_rtcheck_range()
902 xfs_rtxnum_t start, /* starting rtext number of extent */ in xfs_rtcheck_alloc_range() argument
909 error = xfs_rtcheck_range(args, start, len, 0, &new, &stat); in xfs_rtcheck_alloc_range()
925 xfs_rtxnum_t start, /* starting rtext number to free */ in xfs_rtfree_extent() argument
928 struct xfs_mount *mp = tp->t_mountp; in xfs_rtfree_extent()
936 ASSERT(mp->m_rbmip->i_itemp != NULL); in xfs_rtfree_extent()
937 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); in xfs_rtfree_extent()
939 error = xfs_rtcheck_alloc_range(&args, start, len); in xfs_rtfree_extent()
946 error = xfs_rtfree_range(&args, start, len); in xfs_rtfree_extent()
958 if (tp->t_frextents_delta + mp->m_sb.sb_frextents == in xfs_rtfree_extent()
959 mp->m_sb.sb_rextents) { in xfs_rtfree_extent()
960 if (!(mp->m_rbmip->i_diflags & XFS_DIFLAG_NEWRTBM)) in xfs_rtfree_extent()
961 mp->m_rbmip->i_diflags |= XFS_DIFLAG_NEWRTBM; in xfs_rtfree_extent()
963 atime = inode_get_atime(VFS_I(mp->m_rbmip)); in xfs_rtfree_extent()
965 inode_set_atime_to_ts(VFS_I(mp->m_rbmip), atime); in xfs_rtfree_extent()
966 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); in xfs_rtfree_extent()
985 struct xfs_mount *mp = tp->t_mountp; in xfs_rtfree_blocks()
986 xfs_rtxnum_t start; in xfs_rtfree_blocks() local
995 return -EIO; in xfs_rtfree_blocks()
998 start = xfs_rtb_to_rtxrem(mp, rtbno, &mod); in xfs_rtfree_blocks()
1001 return -EIO; in xfs_rtfree_blocks()
1004 return xfs_rtfree_extent(tp, start, len); in xfs_rtfree_blocks()
1028 if (low_rec->ar_startext > high_rec->ar_startext) in xfs_rtalloc_query_range()
1029 return -EINVAL; in xfs_rtalloc_query_range()
1030 if (low_rec->ar_startext >= mp->m_sb.sb_rextents || in xfs_rtalloc_query_range()
1031 low_rec->ar_startext == high_rec->ar_startext) in xfs_rtalloc_query_range()
1034 high_key = min(high_rec->ar_startext, mp->m_sb.sb_rextents - 1); in xfs_rtalloc_query_range()
1037 rtstart = low_rec->ar_startext; in xfs_rtalloc_query_range()
1052 rec.ar_extcount = rtend - rtstart + 1; in xfs_rtalloc_query_range()
1077 keys[1].ar_startext = mp->m_sb.sb_rextents - 1; in xfs_rtalloc_query_all()
1088 xfs_rtxnum_t start, in xfs_rtalloc_extent_is_free() argument
1100 error = xfs_rtcheck_range(&args, start, len, 1, &end, &matches); in xfs_rtalloc_extent_is_free()
1118 return howmany_64(rtextents, NBBY * mp->m_sb.sb_blocksize); in xfs_rtbitmap_blockcount()