xref: /linux/fs/xfs/libxfs/xfs_rtbitmap.c (revision ebc733e54a1a79ea2dde2ba5121ae73a188e20d4)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
4  * All Rights Reserved.
5  */
6 #include "xfs.h"
7 #include "xfs_fs.h"
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_bit.h"
13 #include "xfs_mount.h"
14 #include "xfs_inode.h"
15 #include "xfs_bmap.h"
16 #include "xfs_trans.h"
17 #include "xfs_rtalloc.h"
18 #include "xfs_error.h"
19 #include "xfs_rtbitmap.h"
20 
21 /*
22  * Realtime allocator bitmap functions shared with userspace.
23  */
24 
25 /*
26  * Real time buffers need verifiers to avoid runtime warnings during IO.
27  * We don't have anything to verify, however, so these are just dummy
28  * operations.
29  */
30 static void
31 xfs_rtbuf_verify_read(
32 	struct xfs_buf	*bp)
33 {
34 	return;
35 }
36 
37 static void
38 xfs_rtbuf_verify_write(
39 	struct xfs_buf	*bp)
40 {
41 	return;
42 }
43 
44 const struct xfs_buf_ops xfs_rtbuf_ops = {
45 	.name = "rtbuf",
46 	.verify_read = xfs_rtbuf_verify_read,
47 	.verify_write = xfs_rtbuf_verify_write,
48 };
49 
50 /* Release cached rt bitmap and summary buffers. */
51 void
52 xfs_rtbuf_cache_relse(
53 	struct xfs_rtalloc_args	*args)
54 {
55 	if (args->rbmbp) {
56 		xfs_trans_brelse(args->tp, args->rbmbp);
57 		args->rbmbp = NULL;
58 		args->rbmoff = NULLFILEOFF;
59 	}
60 	if (args->sumbp) {
61 		xfs_trans_brelse(args->tp, args->sumbp);
62 		args->sumbp = NULL;
63 		args->sumoff = NULLFILEOFF;
64 	}
65 }
66 
67 /*
68  * Get a buffer for the bitmap or summary file block specified.
69  * The buffer is returned read and locked.
70  */
71 int
72 xfs_rtbuf_get(
73 	struct xfs_rtalloc_args	*args,
74 	xfs_fileoff_t		block,	/* block number in bitmap or summary */
75 	int			issum)	/* is summary not bitmap */
76 {
77 	struct xfs_mount	*mp = args->mp;
78 	struct xfs_buf		**cbpp;	/* cached block buffer */
79 	xfs_fileoff_t		*coffp;	/* cached block number */
80 	struct xfs_buf		*bp;	/* block buffer, result */
81 	struct xfs_inode	*ip;	/* bitmap or summary inode */
82 	struct xfs_bmbt_irec	map;
83 	enum xfs_blft		type;
84 	int			nmap = 1;
85 	int			error;
86 
87 	if (issum) {
88 		cbpp = &args->sumbp;
89 		coffp = &args->sumoff;
90 		ip = mp->m_rsumip;
91 		type = XFS_BLFT_RTSUMMARY_BUF;
92 	} else {
93 		cbpp = &args->rbmbp;
94 		coffp = &args->rbmoff;
95 		ip = mp->m_rbmip;
96 		type = XFS_BLFT_RTBITMAP_BUF;
97 	}
98 
99 	/*
100 	 * If we have a cached buffer, and the block number matches, use that.
101 	 */
102 	if (*cbpp && *coffp == block)
103 		return 0;
104 
105 	/*
106 	 * Otherwise we have to have to get the buffer.  If there was an old
107 	 * one, get rid of it first.
108 	 */
109 	if (*cbpp) {
110 		xfs_trans_brelse(args->tp, *cbpp);
111 		*cbpp = NULL;
112 	}
113 
114 	error = xfs_bmapi_read(ip, block, 1, &map, &nmap, 0);
115 	if (error)
116 		return error;
117 
118 	if (XFS_IS_CORRUPT(mp, nmap == 0 || !xfs_bmap_is_written_extent(&map)))
119 		return -EFSCORRUPTED;
120 
121 	ASSERT(map.br_startblock != NULLFSBLOCK);
122 	error = xfs_trans_read_buf(mp, args->tp, mp->m_ddev_targp,
123 				   XFS_FSB_TO_DADDR(mp, map.br_startblock),
124 				   mp->m_bsize, 0, &bp, &xfs_rtbuf_ops);
125 	if (error)
126 		return error;
127 
128 	xfs_trans_buf_set_type(args->tp, bp, type);
129 	*cbpp = bp;
130 	*coffp = block;
131 	return 0;
132 }
133 
134 /*
135  * Searching backward from start to limit, find the first block whose
136  * allocated/free state is different from start's.
137  */
138 int
139 xfs_rtfind_back(
140 	struct xfs_rtalloc_args	*args,
141 	xfs_rtxnum_t		start,	/* starting rtext to look at */
142 	xfs_rtxnum_t		limit,	/* last rtext to look at */
143 	xfs_rtxnum_t		*rtx)	/* out: start rtext found */
144 {
145 	struct xfs_mount	*mp = args->mp;
146 	int			bit;	/* bit number in the word */
147 	xfs_fileoff_t		block;	/* bitmap block number */
148 	int			error;	/* error value */
149 	xfs_rtxnum_t		firstbit; /* first useful bit in the word */
150 	xfs_rtxnum_t		i;	/* current bit number rel. to start */
151 	xfs_rtxnum_t		len;	/* length of inspected area */
152 	xfs_rtword_t		mask;	/* mask of relevant bits for value */
153 	xfs_rtword_t		want;	/* mask for "good" values */
154 	xfs_rtword_t		wdiff;	/* difference from wanted value */
155 	xfs_rtword_t		incore;
156 	unsigned int		word;	/* word number in the buffer */
157 
158 	/*
159 	 * Compute and read in starting bitmap block for starting block.
160 	 */
161 	block = xfs_rtx_to_rbmblock(mp, start);
162 	error = xfs_rtbitmap_read_buf(args, block);
163 	if (error)
164 		return error;
165 
166 	/*
167 	 * Get the first word's index & point to it.
168 	 */
169 	word = xfs_rtx_to_rbmword(mp, start);
170 	bit = (int)(start & (XFS_NBWORD - 1));
171 	len = start - limit + 1;
172 	/*
173 	 * Compute match value, based on the bit at start: if 1 (free)
174 	 * then all-ones, else all-zeroes.
175 	 */
176 	incore = xfs_rtbitmap_getword(args, word);
177 	want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0;
178 	/*
179 	 * If the starting position is not word-aligned, deal with the
180 	 * partial word.
181 	 */
182 	if (bit < XFS_NBWORD - 1) {
183 		/*
184 		 * Calculate first (leftmost) bit number to look at,
185 		 * and mask for all the relevant bits in this word.
186 		 */
187 		firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0);
188 		mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) <<
189 			firstbit;
190 		/*
191 		 * Calculate the difference between the value there
192 		 * and what we're looking for.
193 		 */
194 		if ((wdiff = (incore ^ want) & mask)) {
195 			/*
196 			 * Different.  Mark where we are and return.
197 			 */
198 			i = bit - XFS_RTHIBIT(wdiff);
199 			*rtx = start - i + 1;
200 			return 0;
201 		}
202 		i = bit - firstbit + 1;
203 		/*
204 		 * Go on to previous block if that's where the previous word is
205 		 * and we need the previous word.
206 		 */
207 		if (--word == -1 && i < len) {
208 			/*
209 			 * If done with this block, get the previous one.
210 			 */
211 			error = xfs_rtbitmap_read_buf(args, --block);
212 			if (error)
213 				return error;
214 
215 			word = mp->m_blockwsize - 1;
216 		}
217 	} else {
218 		/*
219 		 * Starting on a word boundary, no partial word.
220 		 */
221 		i = 0;
222 	}
223 	/*
224 	 * Loop over whole words in buffers.  When we use up one buffer
225 	 * we move on to the previous one.
226 	 */
227 	while (len - i >= XFS_NBWORD) {
228 		/*
229 		 * Compute difference between actual and desired value.
230 		 */
231 		incore = xfs_rtbitmap_getword(args, word);
232 		if ((wdiff = incore ^ want)) {
233 			/*
234 			 * Different, mark where we are and return.
235 			 */
236 			i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff);
237 			*rtx = start - i + 1;
238 			return 0;
239 		}
240 		i += XFS_NBWORD;
241 		/*
242 		 * Go on to previous block if that's where the previous word is
243 		 * and we need the previous word.
244 		 */
245 		if (--word == -1 && i < len) {
246 			/*
247 			 * If done with this block, get the previous one.
248 			 */
249 			error = xfs_rtbitmap_read_buf(args, --block);
250 			if (error)
251 				return error;
252 
253 			word = mp->m_blockwsize - 1;
254 		}
255 	}
256 	/*
257 	 * If not ending on a word boundary, deal with the last
258 	 * (partial) word.
259 	 */
260 	if (len - i) {
261 		/*
262 		 * Calculate first (leftmost) bit number to look at,
263 		 * and mask for all the relevant bits in this word.
264 		 */
265 		firstbit = XFS_NBWORD - (len - i);
266 		mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit;
267 		/*
268 		 * Compute difference between actual and desired value.
269 		 */
270 		incore = xfs_rtbitmap_getword(args, word);
271 		if ((wdiff = (incore ^ want) & mask)) {
272 			/*
273 			 * Different, mark where we are and return.
274 			 */
275 			i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff);
276 			*rtx = start - i + 1;
277 			return 0;
278 		} else
279 			i = len;
280 	}
281 	/*
282 	 * No match, return that we scanned the whole area.
283 	 */
284 	*rtx = start - i + 1;
285 	return 0;
286 }
287 
288 /*
289  * Searching forward from start to limit, find the first block whose
290  * allocated/free state is different from start's.
291  */
292 int
293 xfs_rtfind_forw(
294 	struct xfs_rtalloc_args	*args,
295 	xfs_rtxnum_t		start,	/* starting rtext to look at */
296 	xfs_rtxnum_t		limit,	/* last rtext to look at */
297 	xfs_rtxnum_t		*rtx)	/* out: start rtext found */
298 {
299 	struct xfs_mount	*mp = args->mp;
300 	int			bit;	/* bit number in the word */
301 	xfs_fileoff_t		block;	/* bitmap block number */
302 	int			error;
303 	xfs_rtxnum_t		i;	/* current bit number rel. to start */
304 	xfs_rtxnum_t		lastbit;/* last useful bit in the word */
305 	xfs_rtxnum_t		len;	/* length of inspected area */
306 	xfs_rtword_t		mask;	/* mask of relevant bits for value */
307 	xfs_rtword_t		want;	/* mask for "good" values */
308 	xfs_rtword_t		wdiff;	/* difference from wanted value */
309 	xfs_rtword_t		incore;
310 	unsigned int		word;	/* word number in the buffer */
311 
312 	/*
313 	 * Compute and read in starting bitmap block for starting block.
314 	 */
315 	block = xfs_rtx_to_rbmblock(mp, start);
316 	error = xfs_rtbitmap_read_buf(args, block);
317 	if (error)
318 		return error;
319 
320 	/*
321 	 * Get the first word's index & point to it.
322 	 */
323 	word = xfs_rtx_to_rbmword(mp, start);
324 	bit = (int)(start & (XFS_NBWORD - 1));
325 	len = limit - start + 1;
326 	/*
327 	 * Compute match value, based on the bit at start: if 1 (free)
328 	 * then all-ones, else all-zeroes.
329 	 */
330 	incore = xfs_rtbitmap_getword(args, word);
331 	want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0;
332 	/*
333 	 * If the starting position is not word-aligned, deal with the
334 	 * partial word.
335 	 */
336 	if (bit) {
337 		/*
338 		 * Calculate last (rightmost) bit number to look at,
339 		 * and mask for all the relevant bits in this word.
340 		 */
341 		lastbit = XFS_RTMIN(bit + len, XFS_NBWORD);
342 		mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit;
343 		/*
344 		 * Calculate the difference between the value there
345 		 * and what we're looking for.
346 		 */
347 		if ((wdiff = (incore ^ want) & mask)) {
348 			/*
349 			 * Different.  Mark where we are and return.
350 			 */
351 			i = XFS_RTLOBIT(wdiff) - bit;
352 			*rtx = start + i - 1;
353 			return 0;
354 		}
355 		i = lastbit - bit;
356 		/*
357 		 * Go on to next block if that's where the next word is
358 		 * and we need the next word.
359 		 */
360 		if (++word == mp->m_blockwsize && i < len) {
361 			/*
362 			 * If done with this block, get the previous one.
363 			 */
364 			error = xfs_rtbitmap_read_buf(args, ++block);
365 			if (error)
366 				return error;
367 
368 			word = 0;
369 		}
370 	} else {
371 		/*
372 		 * Starting on a word boundary, no partial word.
373 		 */
374 		i = 0;
375 	}
376 	/*
377 	 * Loop over whole words in buffers.  When we use up one buffer
378 	 * we move on to the next one.
379 	 */
380 	while (len - i >= XFS_NBWORD) {
381 		/*
382 		 * Compute difference between actual and desired value.
383 		 */
384 		incore = xfs_rtbitmap_getword(args, word);
385 		if ((wdiff = incore ^ want)) {
386 			/*
387 			 * Different, mark where we are and return.
388 			 */
389 			i += XFS_RTLOBIT(wdiff);
390 			*rtx = start + i - 1;
391 			return 0;
392 		}
393 		i += XFS_NBWORD;
394 		/*
395 		 * Go on to next block if that's where the next word is
396 		 * and we need the next word.
397 		 */
398 		if (++word == mp->m_blockwsize && i < len) {
399 			/*
400 			 * If done with this block, get the next one.
401 			 */
402 			error = xfs_rtbitmap_read_buf(args, ++block);
403 			if (error)
404 				return error;
405 
406 			word = 0;
407 		}
408 	}
409 	/*
410 	 * If not ending on a word boundary, deal with the last
411 	 * (partial) word.
412 	 */
413 	if ((lastbit = len - i)) {
414 		/*
415 		 * Calculate mask for all the relevant bits in this word.
416 		 */
417 		mask = ((xfs_rtword_t)1 << lastbit) - 1;
418 		/*
419 		 * Compute difference between actual and desired value.
420 		 */
421 		incore = xfs_rtbitmap_getword(args, word);
422 		if ((wdiff = (incore ^ want) & mask)) {
423 			/*
424 			 * Different, mark where we are and return.
425 			 */
426 			i += XFS_RTLOBIT(wdiff);
427 			*rtx = start + i - 1;
428 			return 0;
429 		} else
430 			i = len;
431 	}
432 	/*
433 	 * No match, return that we scanned the whole area.
434 	 */
435 	*rtx = start + i - 1;
436 	return 0;
437 }
438 
439 /* Log rtsummary counter at @infoword. */
440 static inline void
441 xfs_trans_log_rtsummary(
442 	struct xfs_rtalloc_args	*args,
443 	unsigned int		infoword)
444 {
445 	struct xfs_buf		*bp = args->sumbp;
446 	size_t			first, last;
447 
448 	first = (void *)xfs_rsumblock_infoptr(args, infoword) - bp->b_addr;
449 	last = first + sizeof(xfs_suminfo_t) - 1;
450 
451 	xfs_trans_log_buf(args->tp, bp, first, last);
452 }
453 
454 /*
455  * Read and/or modify the summary information for a given extent size,
456  * bitmap block combination.
457  * Keeps track of a current summary block, so we don't keep reading
458  * it from the buffer cache.
459  *
460  * Summary information is returned in *sum if specified.
461  * If no delta is specified, returns summary only.
462  */
463 int
464 xfs_rtmodify_summary_int(
465 	struct xfs_rtalloc_args	*args,
466 	int			log,	/* log2 of extent size */
467 	xfs_fileoff_t		bbno,	/* bitmap block number */
468 	int			delta,	/* change to make to summary info */
469 	xfs_suminfo_t		*sum)	/* out: summary info for this block */
470 {
471 	struct xfs_mount	*mp = args->mp;
472 	int			error;
473 	xfs_fileoff_t		sb;	/* summary fsblock */
474 	xfs_rtsumoff_t		so;	/* index into the summary file */
475 	unsigned int		infoword;
476 
477 	/*
478 	 * Compute entry number in the summary file.
479 	 */
480 	so = xfs_rtsumoffs(mp, log, bbno);
481 	/*
482 	 * Compute the block number in the summary file.
483 	 */
484 	sb = xfs_rtsumoffs_to_block(mp, so);
485 
486 	error = xfs_rtsummary_read_buf(args, sb);
487 	if (error)
488 		return error;
489 
490 	/*
491 	 * Point to the summary information, modify/log it, and/or copy it out.
492 	 */
493 	infoword = xfs_rtsumoffs_to_infoword(mp, so);
494 	if (delta) {
495 		xfs_suminfo_t	val = xfs_suminfo_add(args, infoword, delta);
496 
497 		if (mp->m_rsum_cache) {
498 			if (val == 0 && log + 1 == mp->m_rsum_cache[bbno])
499 				mp->m_rsum_cache[bbno] = log;
500 			if (val != 0 && log >= mp->m_rsum_cache[bbno])
501 				mp->m_rsum_cache[bbno] = log + 1;
502 		}
503 		xfs_trans_log_rtsummary(args, infoword);
504 		if (sum)
505 			*sum = val;
506 	} else if (sum) {
507 		*sum = xfs_suminfo_get(args, infoword);
508 	}
509 	return 0;
510 }
511 
512 int
513 xfs_rtmodify_summary(
514 	struct xfs_rtalloc_args	*args,
515 	int			log,	/* log2 of extent size */
516 	xfs_fileoff_t		bbno,	/* bitmap block number */
517 	int			delta)	/* in/out: summary block number */
518 {
519 	return xfs_rtmodify_summary_int(args, log, bbno, delta, NULL);
520 }
521 
522 /* Log rtbitmap block from the word @from to the byte before @next. */
523 static inline void
524 xfs_trans_log_rtbitmap(
525 	struct xfs_rtalloc_args	*args,
526 	unsigned int		from,
527 	unsigned int		next)
528 {
529 	struct xfs_buf		*bp = args->rbmbp;
530 	size_t			first, last;
531 
532 	first = (void *)xfs_rbmblock_wordptr(args, from) - bp->b_addr;
533 	last = ((void *)xfs_rbmblock_wordptr(args, next) - 1) - bp->b_addr;
534 
535 	xfs_trans_log_buf(args->tp, bp, first, last);
536 }
537 
538 /*
539  * Set the given range of bitmap bits to the given value.
540  * Do whatever I/O and logging is required.
541  */
542 int
543 xfs_rtmodify_range(
544 	struct xfs_rtalloc_args	*args,
545 	xfs_rtxnum_t		start,	/* starting rtext to modify */
546 	xfs_rtxlen_t		len,	/* length of extent to modify */
547 	int			val)	/* 1 for free, 0 for allocated */
548 {
549 	struct xfs_mount	*mp = args->mp;
550 	int			bit;	/* bit number in the word */
551 	xfs_fileoff_t		block;	/* bitmap block number */
552 	int			error;
553 	int			i;	/* current bit number rel. to start */
554 	int			lastbit; /* last useful bit in word */
555 	xfs_rtword_t		mask;	 /* mask of relevant bits for value */
556 	xfs_rtword_t		incore;
557 	unsigned int		firstword; /* first word used in the buffer */
558 	unsigned int		word;	/* word number in the buffer */
559 
560 	/*
561 	 * Compute starting bitmap block number.
562 	 */
563 	block = xfs_rtx_to_rbmblock(mp, start);
564 	/*
565 	 * Read the bitmap block, and point to its data.
566 	 */
567 	error = xfs_rtbitmap_read_buf(args, block);
568 	if (error)
569 		return error;
570 
571 	/*
572 	 * Compute the starting word's address, and starting bit.
573 	 */
574 	firstword = word = xfs_rtx_to_rbmword(mp, start);
575 	bit = (int)(start & (XFS_NBWORD - 1));
576 	/*
577 	 * 0 (allocated) => all zeroes; 1 (free) => all ones.
578 	 */
579 	val = -val;
580 	/*
581 	 * If not starting on a word boundary, deal with the first
582 	 * (partial) word.
583 	 */
584 	if (bit) {
585 		/*
586 		 * Compute first bit not changed and mask of relevant bits.
587 		 */
588 		lastbit = XFS_RTMIN(bit + len, XFS_NBWORD);
589 		mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit;
590 		/*
591 		 * Set/clear the active bits.
592 		 */
593 		incore = xfs_rtbitmap_getword(args, word);
594 		if (val)
595 			incore |= mask;
596 		else
597 			incore &= ~mask;
598 		xfs_rtbitmap_setword(args, word, incore);
599 		i = lastbit - bit;
600 		/*
601 		 * Go on to the next block if that's where the next word is
602 		 * and we need the next word.
603 		 */
604 		if (++word == mp->m_blockwsize && i < len) {
605 			/*
606 			 * Log the changed part of this block.
607 			 * Get the next one.
608 			 */
609 			xfs_trans_log_rtbitmap(args, firstword, word);
610 			error = xfs_rtbitmap_read_buf(args, ++block);
611 			if (error)
612 				return error;
613 
614 			firstword = word = 0;
615 		}
616 	} else {
617 		/*
618 		 * Starting on a word boundary, no partial word.
619 		 */
620 		i = 0;
621 	}
622 	/*
623 	 * Loop over whole words in buffers.  When we use up one buffer
624 	 * we move on to the next one.
625 	 */
626 	while (len - i >= XFS_NBWORD) {
627 		/*
628 		 * Set the word value correctly.
629 		 */
630 		xfs_rtbitmap_setword(args, word, val);
631 		i += XFS_NBWORD;
632 		/*
633 		 * Go on to the next block if that's where the next word is
634 		 * and we need the next word.
635 		 */
636 		if (++word == mp->m_blockwsize && i < len) {
637 			/*
638 			 * Log the changed part of this block.
639 			 * Get the next one.
640 			 */
641 			xfs_trans_log_rtbitmap(args, firstword, word);
642 			error = xfs_rtbitmap_read_buf(args, ++block);
643 			if (error)
644 				return error;
645 
646 			firstword = word = 0;
647 		}
648 	}
649 	/*
650 	 * If not ending on a word boundary, deal with the last
651 	 * (partial) word.
652 	 */
653 	if ((lastbit = len - i)) {
654 		/*
655 		 * Compute a mask of relevant bits.
656 		 */
657 		mask = ((xfs_rtword_t)1 << lastbit) - 1;
658 		/*
659 		 * Set/clear the active bits.
660 		 */
661 		incore = xfs_rtbitmap_getword(args, word);
662 		if (val)
663 			incore |= mask;
664 		else
665 			incore &= ~mask;
666 		xfs_rtbitmap_setword(args, word, incore);
667 		word++;
668 	}
669 	/*
670 	 * Log any remaining changed bytes.
671 	 */
672 	if (word > firstword)
673 		xfs_trans_log_rtbitmap(args, firstword, word);
674 	return 0;
675 }
676 
677 /*
678  * Mark an extent specified by start and len freed.
679  * Updates all the summary information as well as the bitmap.
680  */
681 int
682 xfs_rtfree_range(
683 	struct xfs_rtalloc_args	*args,
684 	xfs_rtxnum_t		start,	/* starting rtext to free */
685 	xfs_rtxlen_t		len)	/* in/out: summary block number */
686 {
687 	struct xfs_mount	*mp = args->mp;
688 	xfs_rtxnum_t		end;	/* end of the freed extent */
689 	int			error;	/* error value */
690 	xfs_rtxnum_t		postblock; /* first rtext freed > end */
691 	xfs_rtxnum_t		preblock;  /* first rtext freed < start */
692 
693 	end = start + len - 1;
694 	/*
695 	 * Modify the bitmap to mark this extent freed.
696 	 */
697 	error = xfs_rtmodify_range(args, start, len, 1);
698 	if (error) {
699 		return error;
700 	}
701 	/*
702 	 * Assume we're freeing out of the middle of an allocated extent.
703 	 * We need to find the beginning and end of the extent so we can
704 	 * properly update the summary.
705 	 */
706 	error = xfs_rtfind_back(args, start, 0, &preblock);
707 	if (error) {
708 		return error;
709 	}
710 	/*
711 	 * Find the next allocated block (end of allocated extent).
712 	 */
713 	error = xfs_rtfind_forw(args, end, mp->m_sb.sb_rextents - 1,
714 			&postblock);
715 	if (error)
716 		return error;
717 	/*
718 	 * If there are blocks not being freed at the front of the
719 	 * old extent, add summary data for them to be allocated.
720 	 */
721 	if (preblock < start) {
722 		error = xfs_rtmodify_summary(args,
723 				XFS_RTBLOCKLOG(start - preblock),
724 				xfs_rtx_to_rbmblock(mp, preblock), -1);
725 		if (error) {
726 			return error;
727 		}
728 	}
729 	/*
730 	 * If there are blocks not being freed at the end of the
731 	 * old extent, add summary data for them to be allocated.
732 	 */
733 	if (postblock > end) {
734 		error = xfs_rtmodify_summary(args,
735 				XFS_RTBLOCKLOG(postblock - end),
736 				xfs_rtx_to_rbmblock(mp, end + 1), -1);
737 		if (error) {
738 			return error;
739 		}
740 	}
741 	/*
742 	 * Increment the summary information corresponding to the entire
743 	 * (new) free extent.
744 	 */
745 	return xfs_rtmodify_summary(args,
746 			XFS_RTBLOCKLOG(postblock + 1 - preblock),
747 			xfs_rtx_to_rbmblock(mp, preblock), 1);
748 }
749 
750 /*
751  * Check that the given range is either all allocated (val = 0) or
752  * all free (val = 1).
753  */
754 int
755 xfs_rtcheck_range(
756 	struct xfs_rtalloc_args	*args,
757 	xfs_rtxnum_t		start,	/* starting rtext number of extent */
758 	xfs_rtxlen_t		len,	/* length of extent */
759 	int			val,	/* 1 for free, 0 for allocated */
760 	xfs_rtxnum_t		*new,	/* out: first rtext not matching */
761 	int			*stat)	/* out: 1 for matches, 0 for not */
762 {
763 	struct xfs_mount	*mp = args->mp;
764 	int			bit;	/* bit number in the word */
765 	xfs_fileoff_t		block;	/* bitmap block number */
766 	int			error;
767 	xfs_rtxnum_t		i;	/* current bit number rel. to start */
768 	xfs_rtxnum_t		lastbit; /* last useful bit in word */
769 	xfs_rtword_t		mask;	/* mask of relevant bits for value */
770 	xfs_rtword_t		wdiff;	/* difference from wanted value */
771 	xfs_rtword_t		incore;
772 	unsigned int		word;	/* word number in the buffer */
773 
774 	/*
775 	 * Compute starting bitmap block number
776 	 */
777 	block = xfs_rtx_to_rbmblock(mp, start);
778 	/*
779 	 * Read the bitmap block.
780 	 */
781 	error = xfs_rtbitmap_read_buf(args, block);
782 	if (error)
783 		return error;
784 
785 	/*
786 	 * Compute the starting word's address, and starting bit.
787 	 */
788 	word = xfs_rtx_to_rbmword(mp, start);
789 	bit = (int)(start & (XFS_NBWORD - 1));
790 	/*
791 	 * 0 (allocated) => all zero's; 1 (free) => all one's.
792 	 */
793 	val = -val;
794 	/*
795 	 * If not starting on a word boundary, deal with the first
796 	 * (partial) word.
797 	 */
798 	if (bit) {
799 		/*
800 		 * Compute first bit not examined.
801 		 */
802 		lastbit = XFS_RTMIN(bit + len, XFS_NBWORD);
803 		/*
804 		 * Mask of relevant bits.
805 		 */
806 		mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit;
807 		/*
808 		 * Compute difference between actual and desired value.
809 		 */
810 		incore = xfs_rtbitmap_getword(args, word);
811 		if ((wdiff = (incore ^ val) & mask)) {
812 			/*
813 			 * Different, compute first wrong bit and return.
814 			 */
815 			i = XFS_RTLOBIT(wdiff) - bit;
816 			*new = start + i;
817 			*stat = 0;
818 			return 0;
819 		}
820 		i = lastbit - bit;
821 		/*
822 		 * Go on to next block if that's where the next word is
823 		 * and we need the next word.
824 		 */
825 		if (++word == mp->m_blockwsize && i < len) {
826 			/*
827 			 * If done with this block, get the next one.
828 			 */
829 			error = xfs_rtbitmap_read_buf(args, ++block);
830 			if (error)
831 				return error;
832 
833 			word = 0;
834 		}
835 	} else {
836 		/*
837 		 * Starting on a word boundary, no partial word.
838 		 */
839 		i = 0;
840 	}
841 	/*
842 	 * Loop over whole words in buffers.  When we use up one buffer
843 	 * we move on to the next one.
844 	 */
845 	while (len - i >= XFS_NBWORD) {
846 		/*
847 		 * Compute difference between actual and desired value.
848 		 */
849 		incore = xfs_rtbitmap_getword(args, word);
850 		if ((wdiff = incore ^ val)) {
851 			/*
852 			 * Different, compute first wrong bit and return.
853 			 */
854 			i += XFS_RTLOBIT(wdiff);
855 			*new = start + i;
856 			*stat = 0;
857 			return 0;
858 		}
859 		i += XFS_NBWORD;
860 		/*
861 		 * Go on to next block if that's where the next word is
862 		 * and we need the next word.
863 		 */
864 		if (++word == mp->m_blockwsize && i < len) {
865 			/*
866 			 * If done with this block, get the next one.
867 			 */
868 			error = xfs_rtbitmap_read_buf(args, ++block);
869 			if (error)
870 				return error;
871 
872 			word = 0;
873 		}
874 	}
875 	/*
876 	 * If not ending on a word boundary, deal with the last
877 	 * (partial) word.
878 	 */
879 	if ((lastbit = len - i)) {
880 		/*
881 		 * Mask of relevant bits.
882 		 */
883 		mask = ((xfs_rtword_t)1 << lastbit) - 1;
884 		/*
885 		 * Compute difference between actual and desired value.
886 		 */
887 		incore = xfs_rtbitmap_getword(args, word);
888 		if ((wdiff = (incore ^ val) & mask)) {
889 			/*
890 			 * Different, compute first wrong bit and return.
891 			 */
892 			i += XFS_RTLOBIT(wdiff);
893 			*new = start + i;
894 			*stat = 0;
895 			return 0;
896 		} else
897 			i = len;
898 	}
899 	/*
900 	 * Successful, return.
901 	 */
902 	*new = start + i;
903 	*stat = 1;
904 	return 0;
905 }
906 
907 #ifdef DEBUG
908 /*
909  * Check that the given extent (block range) is allocated already.
910  */
911 STATIC int
912 xfs_rtcheck_alloc_range(
913 	struct xfs_rtalloc_args	*args,
914 	xfs_rtxnum_t		start,	/* starting rtext number of extent */
915 	xfs_rtxlen_t		len)	/* length of extent */
916 {
917 	xfs_rtxnum_t		new;	/* dummy for xfs_rtcheck_range */
918 	int			stat;
919 	int			error;
920 
921 	error = xfs_rtcheck_range(args, start, len, 0, &new, &stat);
922 	if (error)
923 		return error;
924 	ASSERT(stat);
925 	return 0;
926 }
927 #else
928 #define xfs_rtcheck_alloc_range(a,b,l)	(0)
929 #endif
930 /*
931  * Free an extent in the realtime subvolume.  Length is expressed in
932  * realtime extents, as is the block number.
933  */
934 int
935 xfs_rtfree_extent(
936 	struct xfs_trans	*tp,	/* transaction pointer */
937 	xfs_rtxnum_t		start,	/* starting rtext number to free */
938 	xfs_rtxlen_t		len)	/* length of extent freed */
939 {
940 	struct xfs_mount	*mp = tp->t_mountp;
941 	struct xfs_rtalloc_args	args = {
942 		.mp		= mp,
943 		.tp		= tp,
944 	};
945 	int			error;
946 	struct timespec64	atime;
947 
948 	ASSERT(mp->m_rbmip->i_itemp != NULL);
949 	ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL));
950 
951 	error = xfs_rtcheck_alloc_range(&args, start, len);
952 	if (error)
953 		return error;
954 
955 	/*
956 	 * Free the range of realtime blocks.
957 	 */
958 	error = xfs_rtfree_range(&args, start, len);
959 	if (error)
960 		goto out;
961 
962 	/*
963 	 * Mark more blocks free in the superblock.
964 	 */
965 	xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len);
966 	/*
967 	 * If we've now freed all the blocks, reset the file sequence
968 	 * number to 0.
969 	 */
970 	if (tp->t_frextents_delta + mp->m_sb.sb_frextents ==
971 	    mp->m_sb.sb_rextents) {
972 		if (!(mp->m_rbmip->i_diflags & XFS_DIFLAG_NEWRTBM))
973 			mp->m_rbmip->i_diflags |= XFS_DIFLAG_NEWRTBM;
974 
975 		atime = inode_get_atime(VFS_I(mp->m_rbmip));
976 		atime.tv_sec = 0;
977 		inode_set_atime_to_ts(VFS_I(mp->m_rbmip), atime);
978 		xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE);
979 	}
980 	error = 0;
981 out:
982 	xfs_rtbuf_cache_relse(&args);
983 	return error;
984 }
985 
986 /*
987  * Free some blocks in the realtime subvolume.  rtbno and rtlen are in units of
988  * rt blocks, not rt extents; must be aligned to the rt extent size; and rtlen
989  * cannot exceed XFS_MAX_BMBT_EXTLEN.
990  */
991 int
992 xfs_rtfree_blocks(
993 	struct xfs_trans	*tp,
994 	xfs_fsblock_t		rtbno,
995 	xfs_filblks_t		rtlen)
996 {
997 	struct xfs_mount	*mp = tp->t_mountp;
998 	xfs_rtxnum_t		start;
999 	xfs_filblks_t		len;
1000 	xfs_extlen_t		mod;
1001 
1002 	ASSERT(rtlen <= XFS_MAX_BMBT_EXTLEN);
1003 
1004 	len = xfs_rtb_to_rtxrem(mp, rtlen, &mod);
1005 	if (mod) {
1006 		ASSERT(mod == 0);
1007 		return -EIO;
1008 	}
1009 
1010 	start = xfs_rtb_to_rtxrem(mp, rtbno, &mod);
1011 	if (mod) {
1012 		ASSERT(mod == 0);
1013 		return -EIO;
1014 	}
1015 
1016 	return xfs_rtfree_extent(tp, start, len);
1017 }
1018 
1019 /* Find all the free records within a given range. */
1020 int
1021 xfs_rtalloc_query_range(
1022 	struct xfs_mount		*mp,
1023 	struct xfs_trans		*tp,
1024 	const struct xfs_rtalloc_rec	*low_rec,
1025 	const struct xfs_rtalloc_rec	*high_rec,
1026 	xfs_rtalloc_query_range_fn	fn,
1027 	void				*priv)
1028 {
1029 	struct xfs_rtalloc_args		args = {
1030 		.mp			= mp,
1031 		.tp			= tp,
1032 	};
1033 	struct xfs_rtalloc_rec		rec;
1034 	xfs_rtxnum_t			rtstart;
1035 	xfs_rtxnum_t			rtend;
1036 	xfs_rtxnum_t			high_key;
1037 	int				is_free;
1038 	int				error = 0;
1039 
1040 	if (low_rec->ar_startext > high_rec->ar_startext)
1041 		return -EINVAL;
1042 	if (low_rec->ar_startext >= mp->m_sb.sb_rextents ||
1043 	    low_rec->ar_startext == high_rec->ar_startext)
1044 		return 0;
1045 
1046 	high_key = min(high_rec->ar_startext, mp->m_sb.sb_rextents - 1);
1047 
1048 	/* Iterate the bitmap, looking for discrepancies. */
1049 	rtstart = low_rec->ar_startext;
1050 	while (rtstart <= high_key) {
1051 		/* Is the first block free? */
1052 		error = xfs_rtcheck_range(&args, rtstart, 1, 1, &rtend,
1053 				&is_free);
1054 		if (error)
1055 			break;
1056 
1057 		/* How long does the extent go for? */
1058 		error = xfs_rtfind_forw(&args, rtstart, high_key, &rtend);
1059 		if (error)
1060 			break;
1061 
1062 		if (is_free) {
1063 			rec.ar_startext = rtstart;
1064 			rec.ar_extcount = rtend - rtstart + 1;
1065 
1066 			error = fn(mp, tp, &rec, priv);
1067 			if (error)
1068 				break;
1069 		}
1070 
1071 		rtstart = rtend + 1;
1072 	}
1073 
1074 	xfs_rtbuf_cache_relse(&args);
1075 	return error;
1076 }
1077 
1078 /* Find all the free records. */
1079 int
1080 xfs_rtalloc_query_all(
1081 	struct xfs_mount		*mp,
1082 	struct xfs_trans		*tp,
1083 	xfs_rtalloc_query_range_fn	fn,
1084 	void				*priv)
1085 {
1086 	struct xfs_rtalloc_rec		keys[2];
1087 
1088 	keys[0].ar_startext = 0;
1089 	keys[1].ar_startext = mp->m_sb.sb_rextents - 1;
1090 	keys[0].ar_extcount = keys[1].ar_extcount = 0;
1091 
1092 	return xfs_rtalloc_query_range(mp, tp, &keys[0], &keys[1], fn, priv);
1093 }
1094 
1095 /* Is the given extent all free? */
1096 int
1097 xfs_rtalloc_extent_is_free(
1098 	struct xfs_mount		*mp,
1099 	struct xfs_trans		*tp,
1100 	xfs_rtxnum_t			start,
1101 	xfs_rtxlen_t			len,
1102 	bool				*is_free)
1103 {
1104 	struct xfs_rtalloc_args		args = {
1105 		.mp			= mp,
1106 		.tp			= tp,
1107 	};
1108 	xfs_rtxnum_t			end;
1109 	int				matches;
1110 	int				error;
1111 
1112 	error = xfs_rtcheck_range(&args, start, len, 1, &end, &matches);
1113 	xfs_rtbuf_cache_relse(&args);
1114 	if (error)
1115 		return error;
1116 
1117 	*is_free = matches;
1118 	return 0;
1119 }
1120 
1121 /*
1122  * Compute the number of rtbitmap blocks needed to track the given number of rt
1123  * extents.
1124  */
1125 xfs_filblks_t
1126 xfs_rtbitmap_blockcount(
1127 	struct xfs_mount	*mp,
1128 	xfs_rtbxlen_t		rtextents)
1129 {
1130 	return howmany_64(rtextents, NBBY * mp->m_sb.sb_blocksize);
1131 }
1132 
1133 /*
1134  * Compute the number of rtbitmap words needed to populate every block of a
1135  * bitmap that is large enough to track the given number of rt extents.
1136  */
1137 unsigned long long
1138 xfs_rtbitmap_wordcount(
1139 	struct xfs_mount	*mp,
1140 	xfs_rtbxlen_t		rtextents)
1141 {
1142 	xfs_filblks_t		blocks;
1143 
1144 	blocks = xfs_rtbitmap_blockcount(mp, rtextents);
1145 	return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;
1146 }
1147 
1148 /* Compute the number of rtsummary blocks needed to track the given rt space. */
1149 xfs_filblks_t
1150 xfs_rtsummary_blockcount(
1151 	struct xfs_mount	*mp,
1152 	unsigned int		rsumlevels,
1153 	xfs_extlen_t		rbmblocks)
1154 {
1155 	unsigned long long	rsumwords;
1156 
1157 	rsumwords = (unsigned long long)rsumlevels * rbmblocks;
1158 	return XFS_B_TO_FSB(mp, rsumwords << XFS_WORDLOG);
1159 }
1160 
1161 /*
1162  * Compute the number of rtsummary info words needed to populate every block of
1163  * a summary file that is large enough to track the given rt space.
1164  */
1165 unsigned long long
1166 xfs_rtsummary_wordcount(
1167 	struct xfs_mount	*mp,
1168 	unsigned int		rsumlevels,
1169 	xfs_extlen_t		rbmblocks)
1170 {
1171 	xfs_filblks_t		blocks;
1172 
1173 	blocks = xfs_rtsummary_blockcount(mp, rsumlevels, rbmblocks);
1174 	return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;
1175 }
1176