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