1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
13 #include "xfs_mount.h"
14 #include "xfs_inode.h"
15 #include "xfs_alloc.h"
17 #include "xfs_bmap_btree.h"
18 #include "xfs_bmap_util.h"
19 #include "xfs_trans.h"
20 #include "xfs_trans_space.h"
21 #include "xfs_icache.h"
22 #include "xfs_rtalloc.h"
24 #include "xfs_rtbitmap.h"
25 #include "xfs_quota.h"
26 #include "xfs_log_priv.h"
27 #include "xfs_health.h"
28 #include "xfs_da_format.h"
29 #include "xfs_metafile.h"
30 #include "xfs_rtgroup.h"
31 #include "xfs_error.h"
32 #include "xfs_trace.h"
35 * Return whether there are any free extents in the size range given
36 * by low and high, for the bitmap block bbno.
40 struct xfs_rtalloc_args
*args
,
41 int low
, /* low log2 extent size */
42 int high
, /* high log2 extent size */
43 xfs_fileoff_t bbno
, /* bitmap block number */
44 int *maxlog
) /* out: max log2 extent size free */
46 uint8_t *rsum_cache
= args
->rtg
->rtg_rsum_cache
;
48 int log
; /* loop counter, log2 of ext. size */
49 xfs_suminfo_t sum
; /* summary data */
51 /* There are no extents at levels >= rsum_cache[bbno]. */
53 high
= min(high
, rsum_cache
[bbno
] - 1);
61 * Loop over logs of extent sizes.
63 for (log
= high
; log
>= low
; log
--) {
65 * Get one summary datum.
67 error
= xfs_rtget_summary(args
, log
, bbno
, &sum
);
72 * If there are any, return success.
80 * Found nothing, return failure.
84 /* There were no extents at levels > log. */
85 if (rsum_cache
&& log
+ 1 < rsum_cache
[bbno
])
86 rsum_cache
[bbno
] = log
+ 1;
91 * Copy and transform the summary file, given the old and new
92 * parameters in the mount structures.
96 struct xfs_rtalloc_args
*oargs
,
97 struct xfs_rtalloc_args
*nargs
)
99 xfs_fileoff_t bbno
; /* bitmap block number */
101 int log
; /* summary level number (log length) */
102 xfs_suminfo_t sum
; /* summary data */
104 for (log
= oargs
->mp
->m_rsumlevels
- 1; log
>= 0; log
--) {
105 for (bbno
= oargs
->mp
->m_sb
.sb_rbmblocks
- 1;
106 (xfs_srtblock_t
)bbno
>= 0;
108 error
= xfs_rtget_summary(oargs
, log
, bbno
, &sum
);
113 error
= xfs_rtmodify_summary(oargs
, log
, bbno
, -sum
);
116 error
= xfs_rtmodify_summary(nargs
, log
, bbno
, sum
);
124 xfs_rtbuf_cache_relse(oargs
);
128 * Mark an extent specified by start and len allocated.
129 * Updates all the summary information as well as the bitmap.
132 xfs_rtallocate_range(
133 struct xfs_rtalloc_args
*args
,
134 xfs_rtxnum_t start
, /* start rtext to allocate */
135 xfs_rtxlen_t len
) /* in/out: summary block number */
137 struct xfs_mount
*mp
= args
->mp
;
138 xfs_rtxnum_t end
; /* end of the allocated rtext */
140 xfs_rtxnum_t postblock
= 0; /* first rtext allocated > end */
141 xfs_rtxnum_t preblock
= 0; /* first rtext allocated < start */
143 end
= start
+ len
- 1;
145 * Assume we're allocating out of the middle of a free extent.
146 * We need to find the beginning and end of the extent so we can
147 * properly update the summary.
149 error
= xfs_rtfind_back(args
, start
, &preblock
);
154 * Find the next allocated block (end of free extent).
156 error
= xfs_rtfind_forw(args
, end
, args
->rtg
->rtg_extents
- 1,
162 * Decrement the summary information corresponding to the entire
165 error
= xfs_rtmodify_summary(args
,
166 xfs_highbit64(postblock
+ 1 - preblock
),
167 xfs_rtx_to_rbmblock(mp
, preblock
), -1);
172 * If there are blocks not being allocated at the front of the
173 * old extent, add summary data for them to be free.
175 if (preblock
< start
) {
176 error
= xfs_rtmodify_summary(args
,
177 xfs_highbit64(start
- preblock
),
178 xfs_rtx_to_rbmblock(mp
, preblock
), 1);
184 * If there are blocks not being allocated at the end of the
185 * old extent, add summary data for them to be free.
187 if (postblock
> end
) {
188 error
= xfs_rtmodify_summary(args
,
189 xfs_highbit64(postblock
- end
),
190 xfs_rtx_to_rbmblock(mp
, end
+ 1), 1);
196 * Modify the bitmap to mark this extent allocated.
198 return xfs_rtmodify_range(args
, start
, len
, 0);
201 /* Reduce @rtxlen until it is a multiple of @prod. */
202 static inline xfs_rtxlen_t
203 xfs_rtalloc_align_len(
207 if (unlikely(prod
> 1))
208 return rounddown(rtxlen
, prod
);
213 * Make sure we don't run off the end of the rt volume. Be careful that
214 * adjusting maxlen downwards doesn't cause us to fail the alignment checks.
216 static inline xfs_rtxlen_t
217 xfs_rtallocate_clamp_len(
218 struct xfs_rtgroup
*rtg
,
219 xfs_rtxnum_t startrtx
,
225 ret
= min(rtg
->rtg_extents
, startrtx
+ rtxlen
) - startrtx
;
226 return xfs_rtalloc_align_len(ret
, prod
);
230 * Attempt to allocate an extent minlen<=len<=maxlen starting from
231 * bitmap block bbno. If we don't get maxlen then use prod to trim
232 * the length, if given. Returns error; returns starting block in *rtx.
233 * The lengths are all in rtextents.
236 xfs_rtallocate_extent_block(
237 struct xfs_rtalloc_args
*args
,
238 xfs_fileoff_t bbno
, /* bitmap block number */
239 xfs_rtxlen_t minlen
, /* minimum length to allocate */
240 xfs_rtxlen_t maxlen
, /* maximum length to allocate */
241 xfs_rtxlen_t
*len
, /* out: actual length allocated */
242 xfs_rtxnum_t
*nextp
, /* out: next rtext to try */
243 xfs_rtxlen_t prod
, /* extent product factor */
244 xfs_rtxnum_t
*rtx
) /* out: start rtext allocated */
246 struct xfs_mount
*mp
= args
->mp
;
247 xfs_rtxnum_t besti
= -1; /* best rtext found so far */
248 xfs_rtxnum_t end
; /* last rtext in chunk */
249 xfs_rtxnum_t i
; /* current rtext trying */
250 xfs_rtxnum_t next
; /* next rtext to try */
251 xfs_rtxlen_t scanlen
; /* number of free rtx to look for */
252 xfs_rtxlen_t bestlen
= 0; /* best length found so far */
253 int stat
; /* status from internal calls */
257 * Loop over all the extents starting in this bitmap block up to the
258 * end of the rt volume, looking for one that's long enough.
260 end
= min(args
->rtg
->rtg_extents
, xfs_rbmblock_to_rtx(mp
, bbno
+ 1)) -
262 for (i
= xfs_rbmblock_to_rtx(mp
, bbno
); i
<= end
; i
++) {
263 /* Make sure we don't scan off the end of the rt volume. */
264 scanlen
= xfs_rtallocate_clamp_len(args
->rtg
, i
, maxlen
, prod
);
265 if (scanlen
< minlen
)
269 * See if there's a free extent of scanlen starting at i.
270 * If it's not so then next will contain the first non-free.
272 error
= xfs_rtcheck_range(args
, i
, scanlen
, 1, &next
, &stat
);
277 * i to scanlen is all free, allocate and return that.
285 * In the case where we have a variable-sized allocation
286 * request, figure out how big this free piece is,
287 * and if it's big enough for the minimum, and the best
288 * so far, remember it.
290 if (minlen
< maxlen
) {
291 xfs_rtxnum_t thislen
; /* this extent size */
294 if (thislen
>= minlen
&& thislen
> bestlen
) {
300 * If not done yet, find the start of the next free space.
304 error
= xfs_rtfind_forw(args
, next
, end
, &i
);
309 /* Searched the whole thing & didn't find a maxlen free extent. */
314 * Ensure bestlen is a multiple of prod, but don't return a too-short
317 bestlen
= xfs_rtalloc_align_len(bestlen
, prod
);
318 if (bestlen
< minlen
)
322 * Pick besti for bestlen & return that.
328 /* Allocation failed. Set *nextp to the next block to try. */
334 * Allocate an extent of length minlen<=len<=maxlen, starting at block
335 * bno. If we don't get maxlen then use prod to trim the length, if given.
336 * Returns error; returns starting block in *rtx.
337 * The lengths are all in rtextents.
340 xfs_rtallocate_extent_exact(
341 struct xfs_rtalloc_args
*args
,
342 xfs_rtxnum_t start
, /* starting rtext number to allocate */
343 xfs_rtxlen_t minlen
, /* minimum length to allocate */
344 xfs_rtxlen_t maxlen
, /* maximum length to allocate */
345 xfs_rtxlen_t
*len
, /* out: actual length allocated */
346 xfs_rtxlen_t prod
, /* extent product factor */
347 xfs_rtxnum_t
*rtx
) /* out: start rtext allocated */
349 xfs_rtxnum_t next
; /* next rtext to try (dummy) */
350 xfs_rtxlen_t alloclen
; /* candidate length */
351 xfs_rtxlen_t scanlen
; /* number of free rtx to look for */
352 int isfree
; /* extent is free */
355 ASSERT(minlen
% prod
== 0);
356 ASSERT(maxlen
% prod
== 0);
358 /* Make sure we don't run off the end of the rt volume. */
359 scanlen
= xfs_rtallocate_clamp_len(args
->rtg
, start
, maxlen
, prod
);
360 if (scanlen
< minlen
)
363 /* Check if the range in question (for scanlen) is free. */
364 error
= xfs_rtcheck_range(args
, start
, scanlen
, 1, &next
, &isfree
);
369 /* start to scanlen is all free; allocate it. */
376 * If not, allocate what there is, if it's at least minlen.
378 alloclen
= next
- start
;
379 if (alloclen
< minlen
)
382 /* Ensure alloclen is a multiple of prod. */
383 alloclen
= xfs_rtalloc_align_len(alloclen
, prod
);
384 if (alloclen
< minlen
)
393 * Allocate an extent of length minlen<=len<=maxlen, starting as near
394 * to start as possible. If we don't get maxlen then use prod to trim
395 * the length, if given. The lengths are all in rtextents.
398 xfs_rtallocate_extent_near(
399 struct xfs_rtalloc_args
*args
,
400 xfs_rtxnum_t start
, /* starting rtext number to allocate */
401 xfs_rtxlen_t minlen
, /* minimum length to allocate */
402 xfs_rtxlen_t maxlen
, /* maximum length to allocate */
403 xfs_rtxlen_t
*len
, /* out: actual length allocated */
404 xfs_rtxlen_t prod
, /* extent product factor */
405 xfs_rtxnum_t
*rtx
) /* out: start rtext allocated */
407 struct xfs_mount
*mp
= args
->mp
;
408 int maxlog
; /* max useful extent from summary */
409 xfs_fileoff_t bbno
; /* bitmap block number */
411 int i
; /* bitmap block offset (loop control) */
412 int j
; /* secondary loop control */
413 int log2len
; /* log2 of minlen */
414 xfs_rtxnum_t n
; /* next rtext to try */
416 ASSERT(minlen
% prod
== 0);
417 ASSERT(maxlen
% prod
== 0);
420 * If the block number given is off the end, silently set it to the last
423 start
= min(start
, args
->rtg
->rtg_extents
- 1);
426 * Try the exact allocation first.
428 error
= xfs_rtallocate_extent_exact(args
, start
, minlen
, maxlen
, len
,
430 if (error
!= -ENOSPC
)
433 bbno
= xfs_rtx_to_rbmblock(mp
, start
);
437 log2len
= xfs_highbit32(minlen
);
439 * Loop over all bitmap blocks (bbno + i is current block).
443 * Get summary information of extents of all useful levels
444 * starting in this bitmap block.
446 error
= xfs_rtany_summary(args
, log2len
, mp
->m_rsumlevels
- 1,
452 * If there are any useful extents starting here, try
456 xfs_extlen_t maxavail
=
457 min_t(xfs_rtblock_t
, maxlen
,
458 (1ULL << (maxlog
+ 1)) - 1);
460 * On the positive side of the starting location.
464 * Try to allocate an extent starting in
467 error
= xfs_rtallocate_extent_block(args
,
468 bbno
+ i
, minlen
, maxavail
, len
,
470 if (error
!= -ENOSPC
)
474 * On the negative side of the starting location.
480 * Loop backwards to find the end of the extent
481 * we found in the realtime summary.
483 * maxblocks is the maximum possible number of
484 * bitmap blocks from the start of the extent
485 * to the end of the extent.
489 else if (maxlog
< mp
->m_blkbit_log
)
492 maxblocks
= 2 << (maxlog
- mp
->m_blkbit_log
);
495 * We need to check bbno + i + maxblocks down to
496 * bbno + i. We already checked bbno down to
497 * bbno + j + 1, so we don't need to check those
500 j
= min(i
+ maxblocks
, j
);
501 for (; j
>= i
; j
--) {
502 error
= xfs_rtallocate_extent_block(args
,
504 maxavail
, len
, &n
, prod
,
506 if (error
!= -ENOSPC
)
512 * Loop control. If we were on the positive side, and there's
513 * still more blocks on the negative side, go there.
515 if (i
> 0 && (int)bbno
- i
>= 0)
518 * If positive, and no more negative, but there are more
519 * positive, go there.
521 else if (i
> 0 && (int)bbno
+ i
< mp
->m_sb
.sb_rbmblocks
- 1)
524 * If negative or 0 (just started), and there are positive
525 * blocks to go, go there. The 0 case moves to block 1.
527 else if (i
<= 0 && (int)bbno
- i
< mp
->m_sb
.sb_rbmblocks
- 1)
530 * If negative or 0 and there are more negative blocks,
533 else if (i
<= 0 && (int)bbno
+ i
> 0)
536 * Must be done. Return failure.
545 xfs_rtalloc_sumlevel(
546 struct xfs_rtalloc_args
*args
,
547 int l
, /* level number */
548 xfs_rtxlen_t minlen
, /* minimum length to allocate */
549 xfs_rtxlen_t maxlen
, /* maximum length to allocate */
550 xfs_rtxlen_t prod
, /* extent product factor */
551 xfs_rtxlen_t
*len
, /* out: actual length allocated */
552 xfs_rtxnum_t
*rtx
) /* out: start rtext allocated */
554 xfs_fileoff_t i
; /* bitmap block number */
557 for (i
= 0; i
< args
->mp
->m_sb
.sb_rbmblocks
; i
++) {
558 xfs_suminfo_t sum
; /* summary information for extents */
559 xfs_rtxnum_t n
; /* next rtext to be tried */
561 error
= xfs_rtget_summary(args
, l
, i
, &sum
);
566 * Nothing there, on to the next block.
572 * Try allocating the extent.
574 error
= xfs_rtallocate_extent_block(args
, i
, minlen
, maxlen
,
576 if (error
!= -ENOSPC
)
580 * If the "next block to try" returned from the allocator is
581 * beyond the next bitmap block, skip to that bitmap block.
583 if (xfs_rtx_to_rbmblock(args
->mp
, n
) > i
+ 1)
584 i
= xfs_rtx_to_rbmblock(args
->mp
, n
) - 1;
591 * Allocate an extent of length minlen<=len<=maxlen, with no position
592 * specified. If we don't get maxlen then use prod to trim
593 * the length, if given. The lengths are all in rtextents.
596 xfs_rtallocate_extent_size(
597 struct xfs_rtalloc_args
*args
,
598 xfs_rtxlen_t minlen
, /* minimum length to allocate */
599 xfs_rtxlen_t maxlen
, /* maximum length to allocate */
600 xfs_rtxlen_t
*len
, /* out: actual length allocated */
601 xfs_rtxlen_t prod
, /* extent product factor */
602 xfs_rtxnum_t
*rtx
) /* out: start rtext allocated */
605 int l
; /* level number (loop control) */
607 ASSERT(minlen
% prod
== 0);
608 ASSERT(maxlen
% prod
== 0);
612 * Loop over all the levels starting with maxlen.
614 * At each level, look at all the bitmap blocks, to see if there are
615 * extents starting there that are long enough (>= maxlen).
617 * Note, only on the initial level can the allocation fail if the
618 * summary says there's an extent.
620 for (l
= xfs_highbit32(maxlen
); l
< args
->mp
->m_rsumlevels
; l
++) {
621 error
= xfs_rtalloc_sumlevel(args
, l
, minlen
, maxlen
, prod
, len
,
623 if (error
!= -ENOSPC
)
628 * Didn't find any maxlen blocks. Try smaller ones, unless we are
629 * looking for a fixed size extent.
631 if (minlen
> --maxlen
)
637 * Loop over sizes, from maxlen down to minlen.
639 * This time, when we do the allocations, allow smaller ones to succeed,
640 * but make sure the specified minlen/maxlen are in the possible range
641 * for this summary level.
643 for (l
= xfs_highbit32(maxlen
); l
>= xfs_highbit32(minlen
); l
--) {
644 error
= xfs_rtalloc_sumlevel(args
, l
,
645 max_t(xfs_rtxlen_t
, minlen
, 1 << l
),
646 min_t(xfs_rtxlen_t
, maxlen
, (1 << (l
+ 1)) - 1),
648 if (error
!= -ENOSPC
)
657 struct xfs_rtgroup
*rtg
)
661 for (i
= 0; i
< XFS_RTGI_MAX
; i
++)
662 xfs_rtginode_irele(&rtg
->rtg_inodes
[i
]);
663 kvfree(rtg
->rtg_rsum_cache
);
667 xfs_alloc_rsum_cache(
668 struct xfs_rtgroup
*rtg
,
669 xfs_extlen_t rbmblocks
)
672 * The rsum cache is initialized to the maximum value, which is
673 * trivially an upper bound on the maximum level with any free extents.
675 rtg
->rtg_rsum_cache
= kvmalloc(rbmblocks
, GFP_KERNEL
);
676 if (!rtg
->rtg_rsum_cache
)
678 memset(rtg
->rtg_rsum_cache
, -1, rbmblocks
);
683 * If we changed the rt extent size (meaning there was no rt volume previously)
684 * and the root directory had EXTSZINHERIT and RTINHERIT set, it's possible
685 * that the extent size hint on the root directory is no longer congruent with
686 * the new rt extent size. Log the rootdir inode to fix this.
689 xfs_growfs_rt_fixup_extsize(
690 struct xfs_mount
*mp
)
692 struct xfs_inode
*ip
= mp
->m_rootip
;
693 struct xfs_trans
*tp
;
696 xfs_ilock(ip
, XFS_IOLOCK_EXCL
);
697 if (!(ip
->i_diflags
& XFS_DIFLAG_RTINHERIT
) ||
698 !(ip
->i_diflags
& XFS_DIFLAG_EXTSZINHERIT
))
701 error
= xfs_trans_alloc_inode(ip
, &M_RES(mp
)->tr_ichange
, 0, 0, false,
706 xfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
707 error
= xfs_trans_commit(tp
);
708 xfs_iunlock(ip
, XFS_ILOCK_EXCL
);
711 xfs_iunlock(ip
, XFS_IOLOCK_EXCL
);
715 /* Ensure that the rtgroup metadata inode is loaded, creating it if neeeded. */
718 struct xfs_rtgroup
*rtg
,
719 enum xfs_rtg_inodes type
)
721 struct xfs_trans
*tp
;
724 if (rtg
->rtg_inodes
[type
])
727 error
= xfs_trans_alloc_empty(rtg_mount(rtg
), &tp
);
730 error
= xfs_rtginode_load(rtg
, type
, tp
);
731 xfs_trans_cancel(tp
);
733 if (error
!= -ENOENT
)
735 return xfs_rtginode_create(rtg
, type
, true);
738 static struct xfs_mount
*
739 xfs_growfs_rt_alloc_fake_mount(
740 const struct xfs_mount
*mp
,
741 xfs_rfsblock_t rblocks
,
742 xfs_agblock_t rextsize
)
744 struct xfs_mount
*nmp
;
746 nmp
= kmemdup(mp
, sizeof(*mp
), GFP_KERNEL
);
749 xfs_mount_sb_set_rextsize(nmp
, &nmp
->m_sb
, rextsize
);
750 nmp
->m_sb
.sb_rblocks
= rblocks
;
751 nmp
->m_sb
.sb_rextents
= xfs_blen_to_rtbxlen(nmp
, nmp
->m_sb
.sb_rblocks
);
752 nmp
->m_sb
.sb_rbmblocks
= xfs_rtbitmap_blockcount(nmp
);
753 nmp
->m_sb
.sb_rextslog
= xfs_compute_rextslog(nmp
->m_sb
.sb_rextents
);
754 if (xfs_has_rtgroups(nmp
))
755 nmp
->m_sb
.sb_rgcount
= howmany_64(nmp
->m_sb
.sb_rextents
,
756 nmp
->m_sb
.sb_rgextents
);
758 nmp
->m_sb
.sb_rgcount
= 1;
759 nmp
->m_rsumblocks
= xfs_rtsummary_blockcount(nmp
, &nmp
->m_rsumlevels
);
762 nmp
->m_features
|= XFS_FEAT_REALTIME
;
764 /* recompute growfsrt reservation from new rsumsize */
765 xfs_trans_resv_calc(nmp
, &nmp
->m_resv
);
769 /* Free all the new space and return the number of extents actually freed. */
771 xfs_growfs_rt_free_new(
772 struct xfs_rtgroup
*rtg
,
773 struct xfs_rtalloc_args
*nargs
,
774 xfs_rtbxlen_t
*freed_rtx
)
776 struct xfs_mount
*mp
= rtg_mount(rtg
);
777 xfs_rgnumber_t rgno
= rtg_rgno(rtg
);
778 xfs_rtxnum_t start_rtx
= 0, end_rtx
;
780 if (rgno
< mp
->m_sb
.sb_rgcount
)
781 start_rtx
= xfs_rtgroup_extents(mp
, rgno
);
782 end_rtx
= xfs_rtgroup_extents(nargs
->mp
, rgno
);
785 * Compute the first new extent that we want to free, being careful to
786 * skip past a realtime superblock at the start of the realtime volume.
788 if (xfs_has_rtsb(nargs
->mp
) && rgno
== 0 && start_rtx
== 0)
790 *freed_rtx
= end_rtx
- start_rtx
;
791 return xfs_rtfree_range(nargs
, start_rtx
, *freed_rtx
);
794 static xfs_rfsblock_t
795 xfs_growfs_rt_nrblocks(
796 struct xfs_rtgroup
*rtg
,
797 xfs_rfsblock_t nrblocks
,
798 xfs_agblock_t rextsize
,
801 struct xfs_mount
*mp
= rtg_mount(rtg
);
804 step
= (bmbno
+ 1) * mp
->m_rtx_per_rbmblock
* rextsize
;
805 if (xfs_has_rtgroups(mp
)) {
806 xfs_rfsblock_t rgblocks
= mp
->m_sb
.sb_rgextents
* rextsize
;
808 step
= min(rgblocks
, step
) + rgblocks
* rtg_rgno(rtg
);
811 return min(nrblocks
, step
);
815 * If the post-grow filesystem will have an rtsb; we're initializing the first
816 * rtgroup; and the filesystem didn't have a realtime section, write the rtsb
817 * now, and attach the rtsb buffer to the real mount.
820 xfs_growfs_rt_init_rtsb(
821 const struct xfs_rtalloc_args
*nargs
,
822 const struct xfs_rtgroup
*rtg
,
823 const struct xfs_rtalloc_args
*args
)
825 struct xfs_mount
*mp
= args
->mp
;
826 struct xfs_buf
*rtsb_bp
;
829 if (!xfs_has_rtsb(nargs
->mp
))
831 if (rtg_rgno(rtg
) > 0)
833 if (mp
->m_sb
.sb_rblocks
)
836 error
= xfs_buf_get_uncached(mp
->m_rtdev_targp
, XFS_FSB_TO_BB(mp
, 1),
841 rtsb_bp
->b_maps
[0].bm_bn
= XFS_RTSB_DADDR
;
842 rtsb_bp
->b_ops
= &xfs_rtsb_buf_ops
;
844 xfs_update_rtsb(rtsb_bp
, mp
->m_sb_bp
);
845 mp
->m_rtsb_bp
= rtsb_bp
;
846 error
= xfs_bwrite(rtsb_bp
);
847 xfs_buf_unlock(rtsb_bp
);
852 xfs_growfs_rt_bmblock(
853 struct xfs_rtgroup
*rtg
,
854 xfs_rfsblock_t nrblocks
,
855 xfs_agblock_t rextsize
,
858 struct xfs_mount
*mp
= rtg_mount(rtg
);
859 struct xfs_inode
*rbmip
= rtg
->rtg_inodes
[XFS_RTGI_BITMAP
];
860 struct xfs_inode
*rsumip
= rtg
->rtg_inodes
[XFS_RTGI_SUMMARY
];
861 struct xfs_rtalloc_args args
= {
865 struct xfs_rtalloc_args nargs
= {
868 struct xfs_mount
*nmp
;
869 xfs_rtbxlen_t freed_rtx
;
873 * Calculate new sb and mount fields for this round. Also ensure the
874 * rtg_extents value is uptodate as the rtbitmap code relies on it.
876 nmp
= nargs
.mp
= xfs_growfs_rt_alloc_fake_mount(mp
,
877 xfs_growfs_rt_nrblocks(rtg
, nrblocks
, rextsize
, bmbno
),
882 xfs_rtgroup_calc_geometry(nmp
, rtg
, rtg_rgno(rtg
),
883 nmp
->m_sb
.sb_rgcount
, nmp
->m_sb
.sb_rextents
);
886 * Recompute the growfsrt reservation from the new rsumsize, so that the
887 * transaction below use the new, potentially larger value.
889 xfs_trans_resv_calc(nmp
, &nmp
->m_resv
);
890 error
= xfs_trans_alloc(mp
, &M_RES(nmp
)->tr_growrtfree
, 0, 0, 0,
896 xfs_rtgroup_lock(args
.rtg
, XFS_RTGLOCK_BITMAP
);
897 xfs_rtgroup_trans_join(args
.tp
, args
.rtg
, XFS_RTGLOCK_BITMAP
);
900 * Update the bitmap inode's size ondisk and incore. We need to update
901 * the incore size so that inode inactivation won't punch what it thinks
902 * are "posteof" blocks.
904 rbmip
->i_disk_size
= nmp
->m_sb
.sb_rbmblocks
* nmp
->m_sb
.sb_blocksize
;
905 i_size_write(VFS_I(rbmip
), rbmip
->i_disk_size
);
906 xfs_trans_log_inode(args
.tp
, rbmip
, XFS_ILOG_CORE
);
909 * Update the summary inode's size. We need to update the incore size
910 * so that inode inactivation won't punch what it thinks are "posteof"
913 rsumip
->i_disk_size
= nmp
->m_rsumblocks
* nmp
->m_sb
.sb_blocksize
;
914 i_size_write(VFS_I(rsumip
), rsumip
->i_disk_size
);
915 xfs_trans_log_inode(args
.tp
, rsumip
, XFS_ILOG_CORE
);
918 * Copy summary data from old to new sizes when the real size (not
919 * block-aligned) changes.
921 if (mp
->m_sb
.sb_rbmblocks
!= nmp
->m_sb
.sb_rbmblocks
||
922 mp
->m_rsumlevels
!= nmp
->m_rsumlevels
) {
923 error
= xfs_rtcopy_summary(&args
, &nargs
);
928 error
= xfs_growfs_rt_init_rtsb(&nargs
, rtg
, &args
);
933 * Update superblock fields.
935 if (nmp
->m_sb
.sb_rextsize
!= mp
->m_sb
.sb_rextsize
)
936 xfs_trans_mod_sb(args
.tp
, XFS_TRANS_SB_REXTSIZE
,
937 nmp
->m_sb
.sb_rextsize
- mp
->m_sb
.sb_rextsize
);
938 if (nmp
->m_sb
.sb_rbmblocks
!= mp
->m_sb
.sb_rbmblocks
)
939 xfs_trans_mod_sb(args
.tp
, XFS_TRANS_SB_RBMBLOCKS
,
940 nmp
->m_sb
.sb_rbmblocks
- mp
->m_sb
.sb_rbmblocks
);
941 if (nmp
->m_sb
.sb_rblocks
!= mp
->m_sb
.sb_rblocks
)
942 xfs_trans_mod_sb(args
.tp
, XFS_TRANS_SB_RBLOCKS
,
943 nmp
->m_sb
.sb_rblocks
- mp
->m_sb
.sb_rblocks
);
944 if (nmp
->m_sb
.sb_rextents
!= mp
->m_sb
.sb_rextents
)
945 xfs_trans_mod_sb(args
.tp
, XFS_TRANS_SB_REXTENTS
,
946 nmp
->m_sb
.sb_rextents
- mp
->m_sb
.sb_rextents
);
947 if (nmp
->m_sb
.sb_rextslog
!= mp
->m_sb
.sb_rextslog
)
948 xfs_trans_mod_sb(args
.tp
, XFS_TRANS_SB_REXTSLOG
,
949 nmp
->m_sb
.sb_rextslog
- mp
->m_sb
.sb_rextslog
);
950 if (nmp
->m_sb
.sb_rgcount
!= mp
->m_sb
.sb_rgcount
)
951 xfs_trans_mod_sb(args
.tp
, XFS_TRANS_SB_RGCOUNT
,
952 nmp
->m_sb
.sb_rgcount
- mp
->m_sb
.sb_rgcount
);
955 * Free the new extent.
957 error
= xfs_growfs_rt_free_new(rtg
, &nargs
, &freed_rtx
);
958 xfs_rtbuf_cache_relse(&nargs
);
963 * Mark more blocks free in the superblock.
965 xfs_trans_mod_sb(args
.tp
, XFS_TRANS_SB_FREXTENTS
, freed_rtx
);
968 * Update the calculated values in the real mount structure.
970 mp
->m_rsumlevels
= nmp
->m_rsumlevels
;
971 mp
->m_rsumblocks
= nmp
->m_rsumblocks
;
974 * Recompute the growfsrt reservation from the new rsumsize.
976 xfs_trans_resv_calc(mp
, &mp
->m_resv
);
978 error
= xfs_trans_commit(args
.tp
);
983 * Ensure the mount RT feature flag is now set.
985 mp
->m_features
|= XFS_FEAT_REALTIME
;
991 xfs_trans_cancel(args
.tp
);
998 xfs_last_rtgroup_extents(
999 struct xfs_mount
*mp
)
1001 return mp
->m_sb
.sb_rextents
-
1002 ((xfs_rtxnum_t
)(mp
->m_sb
.sb_rgcount
- 1) *
1003 mp
->m_sb
.sb_rgextents
);
1007 * Calculate the last rbmblock currently used.
1009 * This also deals with the case where there were no rtextents before.
1011 static xfs_fileoff_t
1012 xfs_last_rt_bmblock(
1013 struct xfs_rtgroup
*rtg
)
1015 struct xfs_mount
*mp
= rtg_mount(rtg
);
1016 xfs_rgnumber_t rgno
= rtg_rgno(rtg
);
1017 xfs_fileoff_t bmbno
= 0;
1019 ASSERT(!mp
->m_sb
.sb_rgcount
|| rgno
>= mp
->m_sb
.sb_rgcount
- 1);
1021 if (mp
->m_sb
.sb_rgcount
&& rgno
== mp
->m_sb
.sb_rgcount
- 1) {
1022 xfs_rtxnum_t nrext
= xfs_last_rtgroup_extents(mp
);
1024 /* Also fill up the previous block if not entirely full. */
1025 bmbno
= xfs_rtbitmap_blockcount_len(mp
, nrext
);
1026 if (xfs_rtx_to_rbmword(mp
, nrext
) != 0)
1034 * Allocate space to the bitmap and summary files, as necessary.
1037 xfs_growfs_rt_alloc_blocks(
1038 struct xfs_rtgroup
*rtg
,
1039 xfs_rfsblock_t nrblocks
,
1040 xfs_agblock_t rextsize
,
1041 xfs_extlen_t
*nrbmblocks
)
1043 struct xfs_mount
*mp
= rtg_mount(rtg
);
1044 struct xfs_inode
*rbmip
= rtg
->rtg_inodes
[XFS_RTGI_BITMAP
];
1045 struct xfs_inode
*rsumip
= rtg
->rtg_inodes
[XFS_RTGI_SUMMARY
];
1046 xfs_extlen_t orbmblocks
= 0;
1047 xfs_extlen_t orsumblocks
= 0;
1048 struct xfs_mount
*nmp
;
1051 nmp
= xfs_growfs_rt_alloc_fake_mount(mp
, nrblocks
, rextsize
);
1054 *nrbmblocks
= nmp
->m_sb
.sb_rbmblocks
;
1056 if (xfs_has_rtgroups(mp
)) {
1058 * For file systems with the rtgroups feature, the RT bitmap and
1059 * summary are always fully allocated, which means that we never
1060 * need to grow the existing files.
1062 * But we have to be careful to only fill the bitmap until the
1063 * end of the actually used range.
1065 if (rtg_rgno(rtg
) == nmp
->m_sb
.sb_rgcount
- 1)
1066 *nrbmblocks
= xfs_rtbitmap_blockcount_len(nmp
,
1067 xfs_last_rtgroup_extents(nmp
));
1069 if (mp
->m_sb
.sb_rgcount
&&
1070 rtg_rgno(rtg
) == mp
->m_sb
.sb_rgcount
- 1)
1074 * Get the old block counts for bitmap and summary inodes.
1075 * These can't change since other growfs callers are locked out.
1077 orbmblocks
= XFS_B_TO_FSB(mp
, rbmip
->i_disk_size
);
1078 orsumblocks
= XFS_B_TO_FSB(mp
, rsumip
->i_disk_size
);
1081 error
= xfs_rtfile_initialize_blocks(rtg
, XFS_RTGI_BITMAP
, orbmblocks
,
1082 nmp
->m_sb
.sb_rbmblocks
, NULL
);
1085 error
= xfs_rtfile_initialize_blocks(rtg
, XFS_RTGI_SUMMARY
, orsumblocks
,
1086 nmp
->m_rsumblocks
, NULL
);
1094 struct xfs_mount
*mp
,
1095 xfs_rgnumber_t rgno
,
1096 xfs_rfsblock_t nrblocks
,
1097 xfs_agblock_t rextsize
)
1099 uint8_t *old_rsum_cache
= NULL
;
1100 xfs_extlen_t bmblocks
;
1101 xfs_fileoff_t bmbno
;
1102 struct xfs_rtgroup
*rtg
;
1106 rtg
= xfs_rtgroup_grab(mp
, rgno
);
1110 for (i
= 0; i
< XFS_RTGI_MAX
; i
++) {
1111 error
= xfs_rtginode_ensure(rtg
, i
);
1116 error
= xfs_growfs_rt_alloc_blocks(rtg
, nrblocks
, rextsize
, &bmblocks
);
1120 if (bmblocks
!= rtg_mount(rtg
)->m_sb
.sb_rbmblocks
) {
1121 old_rsum_cache
= rtg
->rtg_rsum_cache
;
1122 error
= xfs_alloc_rsum_cache(rtg
, bmblocks
);
1127 for (bmbno
= xfs_last_rt_bmblock(rtg
); bmbno
< bmblocks
; bmbno
++) {
1128 error
= xfs_growfs_rt_bmblock(rtg
, nrblocks
, rextsize
, bmbno
);
1134 kvfree(old_rsum_cache
);
1135 xfs_rtgroup_rele(rtg
);
1140 * Reset rtg_extents to the old value if adding more blocks failed.
1142 xfs_rtgroup_calc_geometry(mp
, rtg
, rtg_rgno(rtg
), mp
->m_sb
.sb_rgcount
,
1143 mp
->m_sb
.sb_rextents
);
1144 if (old_rsum_cache
) {
1145 kvfree(rtg
->rtg_rsum_cache
);
1146 rtg
->rtg_rsum_cache
= old_rsum_cache
;
1149 xfs_rtgroup_rele(rtg
);
1154 xfs_growfs_check_rtgeom(
1155 const struct xfs_mount
*mp
,
1156 xfs_rfsblock_t rblocks
,
1157 xfs_extlen_t rextsize
)
1159 struct xfs_mount
*nmp
;
1162 nmp
= xfs_growfs_rt_alloc_fake_mount(mp
, rblocks
, rextsize
);
1167 * New summary size can't be more than half the size of the log. This
1168 * prevents us from getting a log overflow, since we'll log basically
1169 * the whole summary file at once.
1171 if (nmp
->m_rsumblocks
> (mp
->m_sb
.sb_logblocks
>> 1))
1179 * Compute the new number of rt groups and ensure that /rtgroups exists.
1181 * Changing the rtgroup size is not allowed (even if the rt volume hasn't yet
1182 * been initialized) because the userspace ABI doesn't support it.
1185 xfs_growfs_rt_prep_groups(
1186 struct xfs_mount
*mp
,
1187 xfs_rfsblock_t rblocks
,
1188 xfs_extlen_t rextsize
,
1189 xfs_rgnumber_t
*new_rgcount
)
1193 *new_rgcount
= howmany_64(rblocks
, mp
->m_sb
.sb_rgextents
* rextsize
);
1194 if (*new_rgcount
> XFS_MAX_RGNUMBER
)
1197 /* Make sure the /rtgroups dir has been created */
1198 if (!mp
->m_rtdirip
) {
1199 struct xfs_trans
*tp
;
1201 error
= xfs_trans_alloc_empty(mp
, &tp
);
1204 error
= xfs_rtginode_load_parent(tp
);
1205 xfs_trans_cancel(tp
);
1207 if (error
== -ENOENT
)
1208 error
= xfs_rtginode_mkdir_parent(mp
);
1218 struct xfs_mount
*mp
)
1220 if (!xfs_has_rtgroups(mp
))
1222 if (mp
->m_sb
.sb_rgcount
== 0)
1224 return xfs_rtgroup_extents(mp
, mp
->m_sb
.sb_rgcount
- 1) <=
1225 mp
->m_sb
.sb_rgextents
;
1229 * Grow the realtime area of the filesystem.
1233 struct xfs_mount
*mp
,
1234 struct xfs_growfs_rt
*in
)
1236 xfs_rgnumber_t old_rgcount
= mp
->m_sb
.sb_rgcount
;
1237 xfs_rgnumber_t new_rgcount
= 1;
1238 xfs_rgnumber_t rgno
;
1240 xfs_agblock_t old_rextsize
= mp
->m_sb
.sb_rextsize
;
1243 if (!capable(CAP_SYS_ADMIN
))
1246 /* Needs to have been mounted with an rt device. */
1247 if (!XFS_IS_REALTIME_MOUNT(mp
))
1250 if (!mutex_trylock(&mp
->m_growlock
))
1251 return -EWOULDBLOCK
;
1253 /* Shrink not supported. */
1255 if (in
->newblocks
<= mp
->m_sb
.sb_rblocks
)
1257 /* Can only change rt extent size when adding rt volume. */
1258 if (mp
->m_sb
.sb_rblocks
> 0 && in
->extsize
!= mp
->m_sb
.sb_rextsize
)
1261 /* Range check the extent size. */
1262 if (XFS_FSB_TO_B(mp
, in
->extsize
) > XFS_MAX_RTEXTSIZE
||
1263 XFS_FSB_TO_B(mp
, in
->extsize
) < XFS_MIN_RTEXTSIZE
)
1266 /* Unsupported realtime features. */
1267 error
= -EOPNOTSUPP
;
1268 if (xfs_has_quota(mp
) && !xfs_has_rtgroups(mp
))
1270 if (xfs_has_rmapbt(mp
) || xfs_has_reflink(mp
))
1273 error
= xfs_sb_validate_fsb_count(&mp
->m_sb
, in
->newblocks
);
1277 * Read in the last block of the device, make sure it exists.
1279 error
= xfs_buf_read_uncached(mp
->m_rtdev_targp
,
1280 XFS_FSB_TO_BB(mp
, in
->newblocks
- 1),
1281 XFS_FSB_TO_BB(mp
, 1), 0, &bp
, NULL
);
1287 * Calculate new parameters. These are the final values to be reached.
1290 if (in
->newblocks
< in
->extsize
)
1293 /* Make sure the new fs size won't cause problems with the log. */
1294 error
= xfs_growfs_check_rtgeom(mp
, in
->newblocks
, in
->extsize
);
1298 if (xfs_has_rtgroups(mp
)) {
1299 error
= xfs_growfs_rt_prep_groups(mp
, in
->newblocks
,
1300 in
->extsize
, &new_rgcount
);
1305 if (xfs_grow_last_rtg(mp
)) {
1306 error
= xfs_growfs_rtg(mp
, old_rgcount
- 1, in
->newblocks
,
1312 for (rgno
= old_rgcount
; rgno
< new_rgcount
; rgno
++) {
1313 xfs_rtbxlen_t rextents
= div_u64(in
->newblocks
, in
->extsize
);
1315 error
= xfs_rtgroup_alloc(mp
, rgno
, new_rgcount
, rextents
);
1319 error
= xfs_growfs_rtg(mp
, rgno
, in
->newblocks
, in
->extsize
);
1321 struct xfs_rtgroup
*rtg
;
1323 rtg
= xfs_rtgroup_grab(mp
, rgno
);
1324 if (!WARN_ON_ONCE(!rtg
)) {
1325 xfs_rtunmount_rtg(rtg
);
1326 xfs_rtgroup_rele(rtg
);
1327 xfs_rtgroup_free(mp
, rgno
);
1333 if (!error
&& old_rextsize
!= in
->extsize
)
1334 error
= xfs_growfs_rt_fixup_extsize(mp
);
1337 * Update secondary superblocks now the physical grow has completed.
1339 * Also do this in case of an error as we might have already
1340 * successfully updated one or more RTGs and incremented sb_rgcount.
1342 if (!xfs_is_shutdown(mp
)) {
1343 int error2
= xfs_update_secondary_sbs(mp
);
1350 mutex_unlock(&mp
->m_growlock
);
1354 /* Read the realtime superblock and attach it to the mount. */
1357 struct xfs_mount
*mp
)
1362 if (!xfs_has_rtsb(mp
))
1364 if (mp
->m_sb
.sb_rblocks
== 0)
1366 if (mp
->m_rtdev_targp
== NULL
) {
1368 "Filesystem has a realtime volume, use rtdev=device option");
1372 /* m_blkbb_log is not set up yet */
1373 error
= xfs_buf_read_uncached(mp
->m_rtdev_targp
, XFS_RTSB_DADDR
,
1374 mp
->m_sb
.sb_blocksize
>> BBSHIFT
, XBF_NO_IOACCT
, &bp
,
1377 xfs_warn(mp
, "rt sb validate failed with error %d.", error
);
1378 /* bad CRC means corrupted metadata */
1379 if (error
== -EFSBADCRC
)
1380 error
= -EFSCORRUPTED
;
1389 /* Detach the realtime superblock from the mount and free it. */
1392 struct xfs_mount
*mp
)
1394 struct xfs_buf
*bp
= mp
->m_rtsb_bp
;
1400 mp
->m_rtsb_bp
= NULL
;
1405 * Initialize realtime fields in the mount structure.
1409 struct xfs_mount
*mp
) /* file system mount structure */
1411 struct xfs_buf
*bp
; /* buffer for last block of subvolume */
1412 xfs_daddr_t d
; /* address of last block of subvolume */
1415 if (mp
->m_sb
.sb_rblocks
== 0)
1417 if (mp
->m_rtdev_targp
== NULL
) {
1419 "Filesystem has a realtime volume, use rtdev=device option");
1423 mp
->m_rsumblocks
= xfs_rtsummary_blockcount(mp
, &mp
->m_rsumlevels
);
1426 * Check that the realtime section is an ok size.
1428 d
= (xfs_daddr_t
)XFS_FSB_TO_BB(mp
, mp
->m_sb
.sb_rblocks
);
1429 if (XFS_BB_TO_FSB(mp
, d
) != mp
->m_sb
.sb_rblocks
) {
1430 xfs_warn(mp
, "realtime mount -- %llu != %llu",
1431 (unsigned long long) XFS_BB_TO_FSB(mp
, d
),
1432 (unsigned long long) mp
->m_sb
.sb_rblocks
);
1435 error
= xfs_buf_read_uncached(mp
->m_rtdev_targp
,
1436 d
- XFS_FSB_TO_BB(mp
, 1),
1437 XFS_FSB_TO_BB(mp
, 1), 0, &bp
, NULL
);
1439 xfs_warn(mp
, "realtime device size check failed");
1447 xfs_rtalloc_count_frextent(
1448 struct xfs_rtgroup
*rtg
,
1449 struct xfs_trans
*tp
,
1450 const struct xfs_rtalloc_rec
*rec
,
1453 uint64_t *valp
= priv
;
1455 *valp
+= rec
->ar_extcount
;
1460 * Reinitialize the number of free realtime extents from the realtime bitmap.
1461 * Callers must ensure that there is no other activity in the filesystem.
1464 xfs_rtalloc_reinit_frextents(
1465 struct xfs_mount
*mp
)
1470 struct xfs_rtgroup
*rtg
= NULL
;
1472 while ((rtg
= xfs_rtgroup_next(mp
, rtg
))) {
1473 xfs_rtgroup_lock(rtg
, XFS_RTGLOCK_BITMAP_SHARED
);
1474 error
= xfs_rtalloc_query_all(rtg
, NULL
,
1475 xfs_rtalloc_count_frextent
, &val
);
1476 xfs_rtgroup_unlock(rtg
, XFS_RTGLOCK_BITMAP_SHARED
);
1478 xfs_rtgroup_rele(rtg
);
1483 spin_lock(&mp
->m_sb_lock
);
1484 mp
->m_sb
.sb_frextents
= val
;
1485 spin_unlock(&mp
->m_sb_lock
);
1486 percpu_counter_set(&mp
->m_frextents
, mp
->m_sb
.sb_frextents
);
1491 * Read in the bmbt of an rt metadata inode so that we never have to load them
1492 * at runtime. This enables the use of shared ILOCKs for rtbitmap scans. Use
1493 * an empty transaction to avoid deadlocking on loops in the bmbt.
1496 xfs_rtmount_iread_extents(
1497 struct xfs_trans
*tp
,
1498 struct xfs_inode
*ip
)
1502 xfs_ilock(ip
, XFS_ILOCK_EXCL
);
1504 error
= xfs_iread_extents(tp
, ip
, XFS_DATA_FORK
);
1508 if (xfs_inode_has_attr_fork(ip
)) {
1509 error
= xfs_iread_extents(tp
, ip
, XFS_ATTR_FORK
);
1515 xfs_iunlock(ip
, XFS_ILOCK_EXCL
);
1521 struct xfs_mount
*mp
,
1522 struct xfs_trans
*tp
,
1523 struct xfs_rtgroup
*rtg
)
1527 for (i
= 0; i
< XFS_RTGI_MAX
; i
++) {
1528 error
= xfs_rtginode_load(rtg
, i
, tp
);
1532 if (rtg
->rtg_inodes
[i
]) {
1533 error
= xfs_rtmount_iread_extents(tp
,
1534 rtg
->rtg_inodes
[i
]);
1540 return xfs_alloc_rsum_cache(rtg
, mp
->m_sb
.sb_rbmblocks
);
1544 * Get the bitmap and summary inodes and the summary cache into the mount
1545 * structure at mount time.
1549 struct xfs_mount
*mp
)
1551 struct xfs_trans
*tp
;
1552 struct xfs_rtgroup
*rtg
= NULL
;
1555 error
= xfs_trans_alloc_empty(mp
, &tp
);
1559 if (xfs_has_rtgroups(mp
) && mp
->m_sb
.sb_rgcount
> 0) {
1560 error
= xfs_rtginode_load_parent(tp
);
1565 while ((rtg
= xfs_rtgroup_next(mp
, rtg
))) {
1566 error
= xfs_rtmount_rtg(mp
, tp
, rtg
);
1568 xfs_rtgroup_rele(rtg
);
1569 xfs_rtunmount_inodes(mp
);
1575 xfs_trans_cancel(tp
);
1580 xfs_rtunmount_inodes(
1581 struct xfs_mount
*mp
)
1583 struct xfs_rtgroup
*rtg
= NULL
;
1585 while ((rtg
= xfs_rtgroup_next(mp
, rtg
)))
1586 xfs_rtunmount_rtg(rtg
);
1587 xfs_rtginode_irele(&mp
->m_rtdirip
);
1591 * Pick an extent for allocation at the start of a new realtime file.
1592 * Use the sequence number stored in the atime field of the bitmap inode.
1593 * Translate this to a fraction of the rtextents, and return the product
1594 * of rtextents and the fraction.
1595 * The fraction sequence is 0, 1/2, 1/4, 3/4, 1/8, ..., 7/8, 1/16, ...
1599 struct xfs_rtgroup
*rtg
,
1600 struct xfs_trans
*tp
,
1601 xfs_rtxlen_t len
) /* allocation length (rtextents) */
1603 struct xfs_mount
*mp
= rtg_mount(rtg
);
1604 struct xfs_inode
*rbmip
= rtg
->rtg_inodes
[XFS_RTGI_BITMAP
];
1605 xfs_rtxnum_t b
= 0; /* result rtext */
1606 int log2
; /* log of sequence number */
1607 uint64_t resid
; /* residual after log removed */
1608 uint64_t seq
; /* sequence number of file creation */
1609 struct timespec64 ts
; /* timespec in inode */
1611 xfs_assert_ilocked(rbmip
, XFS_ILOCK_EXCL
);
1613 ts
= inode_get_atime(VFS_I(rbmip
));
1614 if (!(rbmip
->i_diflags
& XFS_DIFLAG_NEWRTBM
)) {
1615 rbmip
->i_diflags
|= XFS_DIFLAG_NEWRTBM
;
1620 log2
= xfs_highbit64(seq
);
1622 resid
= seq
- (1ULL << log2
);
1623 b
= (mp
->m_sb
.sb_rextents
* ((resid
<< 1) + 1ULL)) >>
1625 if (b
>= mp
->m_sb
.sb_rextents
)
1626 div64_u64_rem(b
, mp
->m_sb
.sb_rextents
, &b
);
1627 if (b
+ len
> mp
->m_sb
.sb_rextents
)
1628 b
= mp
->m_sb
.sb_rextents
- len
;
1630 ts
.tv_sec
= seq
+ 1;
1631 inode_set_atime_to_ts(VFS_I(rbmip
), ts
);
1632 xfs_trans_log_inode(tp
, rbmip
, XFS_ILOG_CORE
);
1637 xfs_rtalloc_align_minmax(
1638 xfs_rtxlen_t
*raminlen
,
1639 xfs_rtxlen_t
*ramaxlen
,
1642 xfs_rtxlen_t newmaxlen
= *ramaxlen
;
1643 xfs_rtxlen_t newminlen
= *raminlen
;
1646 slack
= newmaxlen
% *prod
;
1649 slack
= newminlen
% *prod
;
1651 newminlen
+= *prod
- slack
;
1654 * If adjusting for extent size hint alignment produces an invalid
1655 * min/max len combination, go ahead without it.
1657 if (newmaxlen
< newminlen
) {
1661 *ramaxlen
= newmaxlen
;
1662 *raminlen
= newminlen
;
1665 /* Given a free extent, find any part of it that isn't busy, if possible. */
1667 xfs_rtalloc_check_busy(
1668 struct xfs_rtalloc_args
*args
,
1670 xfs_rtxlen_t minlen_rtx
,
1671 xfs_rtxlen_t maxlen_rtx
,
1672 xfs_rtxlen_t len_rtx
,
1675 xfs_rtxlen_t
*reslen
,
1676 xfs_rtxnum_t
*resrtx
,
1679 struct xfs_rtgroup
*rtg
= args
->rtg
;
1680 struct xfs_mount
*mp
= rtg_mount(rtg
);
1681 xfs_agblock_t rgbno
= xfs_rtx_to_rgbno(rtg
, rtx
);
1682 xfs_rgblock_t min_rgbno
= xfs_rtx_to_rgbno(rtg
, start
);
1683 xfs_extlen_t minlen
= xfs_rtxlen_to_extlen(mp
, minlen_rtx
);
1684 xfs_extlen_t len
= xfs_rtxlen_to_extlen(mp
, len_rtx
);
1688 busy
= xfs_extent_busy_trim(rtg_group(rtg
), minlen
,
1689 xfs_rtxlen_to_extlen(mp
, maxlen_rtx
), &rgbno
, &len
,
1693 * If we have a largish extent that happens to start before min_rgbno,
1694 * see if we can shift it into range...
1696 if (rgbno
< min_rgbno
&& rgbno
+ len
> min_rgbno
) {
1697 diff
= min_rgbno
- rgbno
;
1704 if (prod
> 1 && len
>= minlen
) {
1705 xfs_rgblock_t aligned_rgbno
= roundup(rgbno
, prod
);
1707 diff
= aligned_rgbno
- rgbno
;
1709 *resrtx
= xfs_rgbno_to_rtx(mp
, aligned_rgbno
);
1710 *reslen
= xfs_extlen_to_rtxlen(mp
,
1711 diff
>= len
? 0 : len
- diff
);
1713 *resrtx
= xfs_rgbno_to_rtx(mp
, rgbno
);
1714 *reslen
= xfs_extlen_to_rtxlen(mp
, len
);
1721 * Adjust the given free extent so that it isn't busy, or flush the log and
1722 * wait for the space to become unbusy. Only needed for rtgroups.
1725 xfs_rtallocate_adjust_for_busy(
1726 struct xfs_rtalloc_args
*args
,
1728 xfs_rtxlen_t minlen
,
1729 xfs_rtxlen_t maxlen
,
1734 xfs_rtxnum_t resrtx
;
1735 xfs_rtxlen_t reslen
;
1741 busy
= xfs_rtalloc_check_busy(args
, start
, minlen
, maxlen
, *len
, prod
,
1742 *rtx
, &reslen
, &resrtx
, &busy_gen
);
1746 if (reslen
< minlen
|| (start
!= 0 && resrtx
!= *rtx
)) {
1748 * Enough of the extent was busy that we cannot satisfy the
1749 * allocation, or this is a near allocation and the start of
1750 * the extent is busy. Flush the log and wait for the busy
1751 * situation to resolve.
1753 trace_xfs_rtalloc_extent_busy(args
->rtg
, start
, minlen
, maxlen
,
1754 *len
, prod
, *rtx
, busy_gen
);
1756 error
= xfs_extent_busy_flush(args
->tp
, rtg_group(args
->rtg
),
1764 /* Some of the free space wasn't busy, hand that back to the caller. */
1765 trace_xfs_rtalloc_extent_busy_trim(args
->rtg
, *rtx
, *len
, resrtx
,
1775 struct xfs_trans
*tp
,
1776 xfs_rgnumber_t rgno
,
1777 xfs_rtblock_t bno_hint
,
1778 xfs_rtxlen_t minlen
,
1779 xfs_rtxlen_t maxlen
,
1782 bool initial_user_data
,
1787 struct xfs_rtalloc_args args
= {
1791 xfs_rtxnum_t start
= 0;
1793 xfs_rtxlen_t len
= 0;
1796 args
.rtg
= xfs_rtgroup_grab(args
.mp
, rgno
);
1801 * We need to lock out modifications to both the RT bitmap and summary
1802 * inodes for finding free space in xfs_rtallocate_extent_{near,size}
1803 * and join the bitmap and summary inodes for the actual allocation
1804 * down in xfs_rtallocate_range.
1806 * For RTG-enabled file system we don't want to join the inodes to the
1807 * transaction until we are committed to allocate to allocate from this
1808 * RTG so that only one inode of each type is locked at a time.
1810 * But for pre-RTG file systems we need to already to join the bitmap
1811 * inode to the transaction for xfs_rtpick_extent, which bumps the
1812 * sequence number in it, so we'll have to join the inode to the
1813 * transaction early here.
1815 * This is all a bit messy, but at least the mess is contained in
1819 xfs_rtgroup_lock(args
.rtg
, XFS_RTGLOCK_BITMAP
);
1820 if (!xfs_has_rtgroups(args
.mp
))
1821 xfs_rtgroup_trans_join(tp
, args
.rtg
,
1822 XFS_RTGLOCK_BITMAP
);
1827 * For an allocation to an empty file at offset 0, pick an extent that
1828 * will space things out in the rt area.
1831 start
= xfs_rtb_to_rtx(args
.mp
, bno_hint
);
1832 else if (!xfs_has_rtgroups(args
.mp
) && initial_user_data
)
1833 start
= xfs_rtpick_extent(args
.rtg
, tp
, maxlen
);
1836 error
= xfs_rtallocate_extent_near(&args
, start
, minlen
, maxlen
,
1839 * If we can't allocate near a specific rt extent, try again
1840 * without locality criteria.
1842 if (error
== -ENOSPC
) {
1843 xfs_rtbuf_cache_relse(&args
);
1849 error
= xfs_rtallocate_extent_size(&args
, minlen
, maxlen
, &len
,
1854 if (xfs_has_rtgroups(args
.mp
))
1859 if (xfs_has_rtgroups(args
.mp
)) {
1860 error
= xfs_rtallocate_adjust_for_busy(&args
, start
, minlen
,
1861 maxlen
, &len
, prod
, &rtx
);
1865 xfs_rtgroup_trans_join(tp
, args
.rtg
, XFS_RTGLOCK_BITMAP
);
1868 error
= xfs_rtallocate_range(&args
, rtx
, len
);
1872 xfs_trans_mod_sb(tp
, wasdel
?
1873 XFS_TRANS_SB_RES_FREXTENTS
: XFS_TRANS_SB_FREXTENTS
,
1875 *bno
= xfs_rtx_to_rtb(args
.rtg
, rtx
);
1876 *blen
= xfs_rtxlen_to_extlen(args
.mp
, len
);
1879 xfs_rtgroup_rele(args
.rtg
);
1880 xfs_rtbuf_cache_relse(&args
);
1883 xfs_rtgroup_unlock(args
.rtg
, XFS_RTGLOCK_BITMAP
);
1889 xfs_rtallocate_rtgs(
1890 struct xfs_trans
*tp
,
1891 xfs_fsblock_t bno_hint
,
1892 xfs_rtxlen_t minlen
,
1893 xfs_rtxlen_t maxlen
,
1896 bool initial_user_data
,
1900 struct xfs_mount
*mp
= tp
->t_mountp
;
1901 xfs_rgnumber_t start_rgno
, rgno
;
1905 * For now this just blindly iterates over the RTGs for an initial
1906 * allocation. We could try to keep an in-memory rtg_longest member
1907 * to avoid the locking when just looking for big enough free space,
1908 * but for now this keeps things simple.
1910 if (bno_hint
!= NULLFSBLOCK
)
1911 start_rgno
= xfs_rtb_to_rgno(mp
, bno_hint
);
1913 start_rgno
= (atomic_inc_return(&mp
->m_rtgrotor
) - 1) %
1914 mp
->m_sb
.sb_rgcount
;
1918 bool rtlocked
= false;
1920 error
= xfs_rtallocate_rtg(tp
, rgno
, bno_hint
, minlen
, maxlen
,
1921 prod
, wasdel
, initial_user_data
, &rtlocked
,
1923 if (error
!= -ENOSPC
)
1927 if (++rgno
== mp
->m_sb
.sb_rgcount
)
1929 bno_hint
= NULLFSBLOCK
;
1930 } while (rgno
!= start_rgno
);
1936 xfs_rtallocate_align(
1937 struct xfs_bmalloca
*ap
,
1938 xfs_rtxlen_t
*ralen
,
1939 xfs_rtxlen_t
*raminlen
,
1943 struct xfs_mount
*mp
= ap
->ip
->i_mount
;
1944 xfs_fileoff_t orig_offset
= ap
->offset
;
1945 xfs_extlen_t minlen
= mp
->m_sb
.sb_rextsize
;
1946 xfs_extlen_t align
; /* minimum allocation alignment */
1947 xfs_extlen_t mod
; /* product factor for allocators */
1951 align
= mp
->m_sb
.sb_rextsize
;
1953 align
= xfs_get_extsz_hint(ap
->ip
);
1956 if (align
== mp
->m_sb
.sb_rextsize
)
1960 error
= xfs_bmap_extsize_align(mp
, &ap
->got
, &ap
->prev
, align
, 1,
1961 ap
->eof
, 0, ap
->conv
, &ap
->offset
, &ap
->length
);
1965 ASSERT(xfs_extlen_to_rtxmod(mp
, ap
->length
) == 0);
1968 * If we shifted the file offset downward to satisfy an extent size
1969 * hint, increase minlen by that amount so that the allocator won't
1970 * give us an allocation that's too short to cover at least one of the
1971 * blocks that the caller asked for.
1973 if (ap
->offset
!= orig_offset
)
1974 minlen
+= orig_offset
- ap
->offset
;
1977 * Set ralen to be the actual requested length in rtextents.
1979 * If the old value was close enough to XFS_BMBT_MAX_EXTLEN that
1980 * we rounded up to it, cut it back so it's valid again.
1981 * Note that if it's a really large request (bigger than
1982 * XFS_BMBT_MAX_EXTLEN), we don't hear about that number, and can't
1983 * adjust the starting point to match it.
1985 *ralen
= xfs_extlen_to_rtxlen(mp
, min(ap
->length
, XFS_MAX_BMBT_EXTLEN
));
1986 *raminlen
= max_t(xfs_rtxlen_t
, 1, xfs_extlen_to_rtxlen(mp
, minlen
));
1987 ASSERT(*raminlen
> 0);
1988 ASSERT(*raminlen
<= *ralen
);
1991 * Only bother calculating a real prod factor if offset & length are
1992 * perfectly aligned, otherwise it will just get us in trouble.
1994 div_u64_rem(ap
->offset
, align
, &mod
);
1995 if (mod
|| ap
->length
% align
)
1998 *prod
= xfs_extlen_to_rtxlen(mp
, align
);
2001 xfs_rtalloc_align_minmax(raminlen
, ralen
, prod
);
2007 struct xfs_bmalloca
*ap
)
2009 xfs_fileoff_t orig_offset
= ap
->offset
;
2010 xfs_rtxlen_t prod
= 0; /* product factor for allocators */
2011 xfs_rtxlen_t ralen
= 0; /* realtime allocation length */
2012 xfs_rtblock_t bno_hint
= NULLRTBLOCK
;
2013 xfs_extlen_t orig_length
= ap
->length
;
2014 xfs_rtxlen_t raminlen
;
2015 bool rtlocked
= false;
2016 bool noalign
= false;
2017 bool initial_user_data
=
2018 ap
->datatype
& XFS_ALLOC_INITIAL_USER_DATA
;
2022 error
= xfs_rtallocate_align(ap
, &ralen
, &raminlen
, &prod
, &noalign
);
2026 if (xfs_bmap_adjacent(ap
))
2027 bno_hint
= ap
->blkno
;
2029 if (xfs_has_rtgroups(ap
->ip
->i_mount
)) {
2030 error
= xfs_rtallocate_rtgs(ap
->tp
, bno_hint
, raminlen
, ralen
,
2031 prod
, ap
->wasdel
, initial_user_data
,
2032 &ap
->blkno
, &ap
->length
);
2034 error
= xfs_rtallocate_rtg(ap
->tp
, 0, bno_hint
, raminlen
, ralen
,
2035 prod
, ap
->wasdel
, initial_user_data
,
2036 &rtlocked
, &ap
->blkno
, &ap
->length
);
2039 if (error
== -ENOSPC
) {
2042 * We previously enlarged the request length to try to
2043 * satisfy an extent size hint. The allocator didn't
2044 * return anything, so reset the parameters to the
2045 * original values and try again without alignment
2048 ap
->offset
= orig_offset
;
2049 ap
->length
= orig_length
;
2054 ap
->blkno
= NULLFSBLOCK
;
2061 xfs_bmap_alloc_account(ap
);