]> Git Repo - J-linux.git/blob - fs/xfs/libxfs/xfs_rtbitmap.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / fs / xfs / libxfs / xfs_rtbitmap.c
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_bmap_btree.h"
17 #include "xfs_trans_space.h"
18 #include "xfs_trans.h"
19 #include "xfs_rtalloc.h"
20 #include "xfs_error.h"
21 #include "xfs_rtbitmap.h"
22 #include "xfs_health.h"
23 #include "xfs_sb.h"
24 #include "xfs_errortag.h"
25 #include "xfs_log.h"
26 #include "xfs_buf_item.h"
27 #include "xfs_extent_busy.h"
28
29 /*
30  * Realtime allocator bitmap functions shared with userspace.
31  */
32
33 static xfs_failaddr_t
34 xfs_rtbuf_verify(
35         struct xfs_buf                  *bp)
36 {
37         struct xfs_mount                *mp = bp->b_mount;
38         struct xfs_rtbuf_blkinfo        *hdr = bp->b_addr;
39
40         if (!xfs_verify_magic(bp, hdr->rt_magic))
41                 return __this_address;
42         if (!xfs_has_rtgroups(mp))
43                 return __this_address;
44         if (!xfs_has_crc(mp))
45                 return __this_address;
46         if (!uuid_equal(&hdr->rt_uuid, &mp->m_sb.sb_meta_uuid))
47                 return __this_address;
48         if (hdr->rt_blkno != cpu_to_be64(xfs_buf_daddr(bp)))
49                 return __this_address;
50         return NULL;
51 }
52
53 static void
54 xfs_rtbuf_verify_read(
55         struct xfs_buf                  *bp)
56 {
57         struct xfs_mount                *mp = bp->b_mount;
58         struct xfs_rtbuf_blkinfo        *hdr = bp->b_addr;
59         xfs_failaddr_t                  fa;
60
61         if (!xfs_has_rtgroups(mp))
62                 return;
63
64         if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr->rt_lsn))) {
65                 fa = __this_address;
66                 goto fail;
67         }
68
69         if (!xfs_buf_verify_cksum(bp, XFS_RTBUF_CRC_OFF)) {
70                 fa = __this_address;
71                 goto fail;
72         }
73
74         fa = xfs_rtbuf_verify(bp);
75         if (fa)
76                 goto fail;
77
78         return;
79 fail:
80         xfs_verifier_error(bp, -EFSCORRUPTED, fa);
81 }
82
83 static void
84 xfs_rtbuf_verify_write(
85         struct xfs_buf  *bp)
86 {
87         struct xfs_mount                *mp = bp->b_mount;
88         struct xfs_rtbuf_blkinfo        *hdr = bp->b_addr;
89         struct xfs_buf_log_item         *bip = bp->b_log_item;
90         xfs_failaddr_t                  fa;
91
92         if (!xfs_has_rtgroups(mp))
93                 return;
94
95         fa = xfs_rtbuf_verify(bp);
96         if (fa) {
97                 xfs_verifier_error(bp, -EFSCORRUPTED, fa);
98                 return;
99         }
100
101         if (bip)
102                 hdr->rt_lsn = cpu_to_be64(bip->bli_item.li_lsn);
103         xfs_buf_update_cksum(bp, XFS_RTBUF_CRC_OFF);
104 }
105
106 const struct xfs_buf_ops xfs_rtbuf_ops = {
107         .name = "rtbuf",
108         .verify_read = xfs_rtbuf_verify_read,
109         .verify_write = xfs_rtbuf_verify_write,
110 };
111
112 const struct xfs_buf_ops xfs_rtbitmap_buf_ops = {
113         .name           = "xfs_rtbitmap",
114         .magic          = { 0, cpu_to_be32(XFS_RTBITMAP_MAGIC) },
115         .verify_read    = xfs_rtbuf_verify_read,
116         .verify_write   = xfs_rtbuf_verify_write,
117         .verify_struct  = xfs_rtbuf_verify,
118 };
119
120 const struct xfs_buf_ops xfs_rtsummary_buf_ops = {
121         .name           = "xfs_rtsummary",
122         .magic          = { 0, cpu_to_be32(XFS_RTSUMMARY_MAGIC) },
123         .verify_read    = xfs_rtbuf_verify_read,
124         .verify_write   = xfs_rtbuf_verify_write,
125         .verify_struct  = xfs_rtbuf_verify,
126 };
127
128 /* Release cached rt bitmap and summary buffers. */
129 void
130 xfs_rtbuf_cache_relse(
131         struct xfs_rtalloc_args *args)
132 {
133         if (args->rbmbp) {
134                 xfs_trans_brelse(args->tp, args->rbmbp);
135                 args->rbmbp = NULL;
136                 args->rbmoff = NULLFILEOFF;
137         }
138         if (args->sumbp) {
139                 xfs_trans_brelse(args->tp, args->sumbp);
140                 args->sumbp = NULL;
141                 args->sumoff = NULLFILEOFF;
142         }
143 }
144
145 /*
146  * Get a buffer for the bitmap or summary file block specified.
147  * The buffer is returned read and locked.
148  */
149 static int
150 xfs_rtbuf_get(
151         struct xfs_rtalloc_args *args,
152         xfs_fileoff_t           block,  /* block number in bitmap or summary */
153         enum xfs_rtg_inodes     type)
154 {
155         struct xfs_inode        *ip = args->rtg->rtg_inodes[type];
156         struct xfs_mount        *mp = args->mp;
157         struct xfs_buf          **cbpp; /* cached block buffer */
158         xfs_fileoff_t           *coffp; /* cached block number */
159         struct xfs_buf          *bp;    /* block buffer, result */
160         struct xfs_bmbt_irec    map;
161         enum xfs_blft           buf_type;
162         int                     nmap = 1;
163         int                     error;
164
165         switch (type) {
166         case XFS_RTGI_SUMMARY:
167                 cbpp = &args->sumbp;
168                 coffp = &args->sumoff;
169                 buf_type = XFS_BLFT_RTSUMMARY_BUF;
170                 break;
171         case XFS_RTGI_BITMAP:
172                 cbpp = &args->rbmbp;
173                 coffp = &args->rbmoff;
174                 buf_type = XFS_BLFT_RTBITMAP_BUF;
175                 break;
176         default:
177                 return -EINVAL;
178         }
179
180         /*
181          * If we have a cached buffer, and the block number matches, use that.
182          */
183         if (*cbpp && *coffp == block)
184                 return 0;
185
186         /*
187          * Otherwise we have to have to get the buffer.  If there was an old
188          * one, get rid of it first.
189          */
190         if (*cbpp) {
191                 xfs_trans_brelse(args->tp, *cbpp);
192                 *cbpp = NULL;
193         }
194
195         error = xfs_bmapi_read(ip, block, 1, &map, &nmap, 0);
196         if (error)
197                 return error;
198
199         if (XFS_IS_CORRUPT(mp, nmap == 0 || !xfs_bmap_is_written_extent(&map))) {
200                 xfs_rtginode_mark_sick(args->rtg, type);
201                 return -EFSCORRUPTED;
202         }
203
204         ASSERT(map.br_startblock != NULLFSBLOCK);
205         error = xfs_trans_read_buf(mp, args->tp, mp->m_ddev_targp,
206                                    XFS_FSB_TO_DADDR(mp, map.br_startblock),
207                                    mp->m_bsize, 0, &bp,
208                                    xfs_rtblock_ops(mp, type));
209         if (xfs_metadata_is_sick(error))
210                 xfs_rtginode_mark_sick(args->rtg, type);
211         if (error)
212                 return error;
213
214         if (xfs_has_rtgroups(mp)) {
215                 struct xfs_rtbuf_blkinfo        *hdr = bp->b_addr;
216
217                 if (hdr->rt_owner != cpu_to_be64(ip->i_ino)) {
218                         xfs_buf_mark_corrupt(bp);
219                         xfs_trans_brelse(args->tp, bp);
220                         xfs_rtginode_mark_sick(args->rtg, type);
221                         return -EFSCORRUPTED;
222                 }
223         }
224
225         xfs_trans_buf_set_type(args->tp, bp, buf_type);
226         *cbpp = bp;
227         *coffp = block;
228         return 0;
229 }
230
231 int
232 xfs_rtbitmap_read_buf(
233         struct xfs_rtalloc_args         *args,
234         xfs_fileoff_t                   block)
235 {
236         struct xfs_mount                *mp = args->mp;
237
238         if (XFS_IS_CORRUPT(mp, block >= mp->m_sb.sb_rbmblocks)) {
239                 xfs_rtginode_mark_sick(args->rtg, XFS_RTGI_BITMAP);
240                 return -EFSCORRUPTED;
241         }
242
243         return xfs_rtbuf_get(args, block, XFS_RTGI_BITMAP);
244 }
245
246 int
247 xfs_rtsummary_read_buf(
248         struct xfs_rtalloc_args         *args,
249         xfs_fileoff_t                   block)
250 {
251         struct xfs_mount                *mp = args->mp;
252
253         if (XFS_IS_CORRUPT(mp, block >= mp->m_rsumblocks)) {
254                 xfs_rtginode_mark_sick(args->rtg, XFS_RTGI_SUMMARY);
255                 return -EFSCORRUPTED;
256         }
257         return xfs_rtbuf_get(args, block, XFS_RTGI_SUMMARY);
258 }
259
260 /*
261  * Searching backward from start find the first block whose allocated/free state
262  * is different from start's.
263  */
264 int
265 xfs_rtfind_back(
266         struct xfs_rtalloc_args *args,
267         xfs_rtxnum_t            start,  /* starting rtext to look at */
268         xfs_rtxnum_t            *rtx)   /* out: start rtext found */
269 {
270         struct xfs_mount        *mp = args->mp;
271         int                     bit;    /* bit number in the word */
272         xfs_fileoff_t           block;  /* bitmap block number */
273         int                     error;  /* error value */
274         xfs_rtxnum_t            firstbit; /* first useful bit in the word */
275         xfs_rtxnum_t            i;      /* current bit number rel. to start */
276         xfs_rtxnum_t            len;    /* length of inspected area */
277         xfs_rtword_t            mask;   /* mask of relevant bits for value */
278         xfs_rtword_t            want;   /* mask for "good" values */
279         xfs_rtword_t            wdiff;  /* difference from wanted value */
280         xfs_rtword_t            incore;
281         unsigned int            word;   /* word number in the buffer */
282
283         /*
284          * Compute and read in starting bitmap block for starting block.
285          */
286         block = xfs_rtx_to_rbmblock(mp, start);
287         error = xfs_rtbitmap_read_buf(args, block);
288         if (error)
289                 return error;
290
291         /*
292          * Get the first word's index & point to it.
293          */
294         word = xfs_rtx_to_rbmword(mp, start);
295         bit = (int)(start & (XFS_NBWORD - 1));
296         len = start + 1;
297         /*
298          * Compute match value, based on the bit at start: if 1 (free)
299          * then all-ones, else all-zeroes.
300          */
301         incore = xfs_rtbitmap_getword(args, word);
302         want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0;
303         /*
304          * If the starting position is not word-aligned, deal with the
305          * partial word.
306          */
307         if (bit < XFS_NBWORD - 1) {
308                 /*
309                  * Calculate first (leftmost) bit number to look at,
310                  * and mask for all the relevant bits in this word.
311                  */
312                 firstbit = max_t(xfs_srtblock_t, bit - len + 1, 0);
313                 mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) <<
314                         firstbit;
315                 /*
316                  * Calculate the difference between the value there
317                  * and what we're looking for.
318                  */
319                 if ((wdiff = (incore ^ want) & mask)) {
320                         /*
321                          * Different.  Mark where we are and return.
322                          */
323                         i = bit - xfs_highbit32(wdiff);
324                         *rtx = start - i + 1;
325                         return 0;
326                 }
327                 i = bit - firstbit + 1;
328                 /*
329                  * Go on to previous block if that's where the previous word is
330                  * and we need the previous word.
331                  */
332                 if (--word == -1 && i < len) {
333                         /*
334                          * If done with this block, get the previous one.
335                          */
336                         error = xfs_rtbitmap_read_buf(args, --block);
337                         if (error)
338                                 return error;
339
340                         word = mp->m_blockwsize - 1;
341                 }
342         } else {
343                 /*
344                  * Starting on a word boundary, no partial word.
345                  */
346                 i = 0;
347         }
348         /*
349          * Loop over whole words in buffers.  When we use up one buffer
350          * we move on to the previous one.
351          */
352         while (len - i >= XFS_NBWORD) {
353                 /*
354                  * Compute difference between actual and desired value.
355                  */
356                 incore = xfs_rtbitmap_getword(args, word);
357                 if ((wdiff = incore ^ want)) {
358                         /*
359                          * Different, mark where we are and return.
360                          */
361                         i += XFS_NBWORD - 1 - xfs_highbit32(wdiff);
362                         *rtx = start - i + 1;
363                         return 0;
364                 }
365                 i += XFS_NBWORD;
366                 /*
367                  * Go on to previous block if that's where the previous word is
368                  * and we need the previous word.
369                  */
370                 if (--word == -1 && i < len) {
371                         /*
372                          * If done with this block, get the previous one.
373                          */
374                         error = xfs_rtbitmap_read_buf(args, --block);
375                         if (error)
376                                 return error;
377
378                         word = mp->m_blockwsize - 1;
379                 }
380         }
381         /*
382          * If not ending on a word boundary, deal with the last
383          * (partial) word.
384          */
385         if (len - i) {
386                 /*
387                  * Calculate first (leftmost) bit number to look at,
388                  * and mask for all the relevant bits in this word.
389                  */
390                 firstbit = XFS_NBWORD - (len - i);
391                 mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit;
392                 /*
393                  * Compute difference between actual and desired value.
394                  */
395                 incore = xfs_rtbitmap_getword(args, word);
396                 if ((wdiff = (incore ^ want) & mask)) {
397                         /*
398                          * Different, mark where we are and return.
399                          */
400                         i += XFS_NBWORD - 1 - xfs_highbit32(wdiff);
401                         *rtx = start - i + 1;
402                         return 0;
403                 } else
404                         i = len;
405         }
406         /*
407          * No match, return that we scanned the whole area.
408          */
409         *rtx = start - i + 1;
410         return 0;
411 }
412
413 /*
414  * Searching forward from start to limit, find the first block whose
415  * allocated/free state is different from start's.
416  */
417 int
418 xfs_rtfind_forw(
419         struct xfs_rtalloc_args *args,
420         xfs_rtxnum_t            start,  /* starting rtext to look at */
421         xfs_rtxnum_t            limit,  /* last rtext to look at */
422         xfs_rtxnum_t            *rtx)   /* out: start rtext found */
423 {
424         struct xfs_mount        *mp = args->mp;
425         int                     bit;    /* bit number in the word */
426         xfs_fileoff_t           block;  /* bitmap block number */
427         int                     error;
428         xfs_rtxnum_t            i;      /* current bit number rel. to start */
429         xfs_rtxnum_t            lastbit;/* last useful bit in the word */
430         xfs_rtxnum_t            len;    /* length of inspected area */
431         xfs_rtword_t            mask;   /* mask of relevant bits for value */
432         xfs_rtword_t            want;   /* mask for "good" values */
433         xfs_rtword_t            wdiff;  /* difference from wanted value */
434         xfs_rtword_t            incore;
435         unsigned int            word;   /* word number in the buffer */
436
437         ASSERT(start <= limit);
438
439         /*
440          * Compute and read in starting bitmap block for starting block.
441          */
442         block = xfs_rtx_to_rbmblock(mp, start);
443         error = xfs_rtbitmap_read_buf(args, block);
444         if (error)
445                 return error;
446
447         /*
448          * Get the first word's index & point to it.
449          */
450         word = xfs_rtx_to_rbmword(mp, start);
451         bit = (int)(start & (XFS_NBWORD - 1));
452         len = limit - start + 1;
453         /*
454          * Compute match value, based on the bit at start: if 1 (free)
455          * then all-ones, else all-zeroes.
456          */
457         incore = xfs_rtbitmap_getword(args, word);
458         want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0;
459         /*
460          * If the starting position is not word-aligned, deal with the
461          * partial word.
462          */
463         if (bit) {
464                 /*
465                  * Calculate last (rightmost) bit number to look at,
466                  * and mask for all the relevant bits in this word.
467                  */
468                 lastbit = min(bit + len, XFS_NBWORD);
469                 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit;
470                 /*
471                  * Calculate the difference between the value there
472                  * and what we're looking for.
473                  */
474                 if ((wdiff = (incore ^ want) & mask)) {
475                         /*
476                          * Different.  Mark where we are and return.
477                          */
478                         i = xfs_lowbit32(wdiff) - bit;
479                         *rtx = start + i - 1;
480                         return 0;
481                 }
482                 i = lastbit - bit;
483                 /*
484                  * Go on to next block if that's where the next word is
485                  * and we need the next word.
486                  */
487                 if (++word == mp->m_blockwsize && i < len) {
488                         /*
489                          * If done with this block, get the previous one.
490                          */
491                         error = xfs_rtbitmap_read_buf(args, ++block);
492                         if (error)
493                                 return error;
494
495                         word = 0;
496                 }
497         } else {
498                 /*
499                  * Starting on a word boundary, no partial word.
500                  */
501                 i = 0;
502         }
503         /*
504          * Loop over whole words in buffers.  When we use up one buffer
505          * we move on to the next one.
506          */
507         while (len - i >= XFS_NBWORD) {
508                 /*
509                  * Compute difference between actual and desired value.
510                  */
511                 incore = xfs_rtbitmap_getword(args, word);
512                 if ((wdiff = incore ^ want)) {
513                         /*
514                          * Different, mark where we are and return.
515                          */
516                         i += xfs_lowbit32(wdiff);
517                         *rtx = start + i - 1;
518                         return 0;
519                 }
520                 i += XFS_NBWORD;
521                 /*
522                  * Go on to next block if that's where the next word is
523                  * and we need the next word.
524                  */
525                 if (++word == mp->m_blockwsize && i < len) {
526                         /*
527                          * If done with this block, get the next one.
528                          */
529                         error = xfs_rtbitmap_read_buf(args, ++block);
530                         if (error)
531                                 return error;
532
533                         word = 0;
534                 }
535         }
536         /*
537          * If not ending on a word boundary, deal with the last
538          * (partial) word.
539          */
540         if ((lastbit = len - i)) {
541                 /*
542                  * Calculate mask for all the relevant bits in this word.
543                  */
544                 mask = ((xfs_rtword_t)1 << lastbit) - 1;
545                 /*
546                  * Compute difference between actual and desired value.
547                  */
548                 incore = xfs_rtbitmap_getword(args, word);
549                 if ((wdiff = (incore ^ want) & mask)) {
550                         /*
551                          * Different, mark where we are and return.
552                          */
553                         i += xfs_lowbit32(wdiff);
554                         *rtx = start + i - 1;
555                         return 0;
556                 } else
557                         i = len;
558         }
559         /*
560          * No match, return that we scanned the whole area.
561          */
562         *rtx = start + i - 1;
563         return 0;
564 }
565
566 /* Log rtsummary counter at @infoword. */
567 static inline void
568 xfs_trans_log_rtsummary(
569         struct xfs_rtalloc_args *args,
570         unsigned int            infoword)
571 {
572         struct xfs_buf          *bp = args->sumbp;
573         size_t                  first, last;
574
575         first = (void *)xfs_rsumblock_infoptr(args, infoword) - bp->b_addr;
576         last = first + sizeof(xfs_suminfo_t) - 1;
577
578         xfs_trans_log_buf(args->tp, bp, first, last);
579 }
580
581 /*
582  * Modify the summary information for a given extent size, bitmap block
583  * combination.
584  */
585 int
586 xfs_rtmodify_summary(
587         struct xfs_rtalloc_args *args,
588         int                     log,    /* log2 of extent size */
589         xfs_fileoff_t           bbno,   /* bitmap block number */
590         int                     delta)  /* in/out: summary block number */
591 {
592         struct xfs_mount        *mp = args->mp;
593         xfs_rtsumoff_t          so = xfs_rtsumoffs(mp, log, bbno);
594         uint8_t                 *rsum_cache = args->rtg->rtg_rsum_cache;
595         unsigned int            infoword;
596         xfs_suminfo_t           val;
597         int                     error;
598
599         error = xfs_rtsummary_read_buf(args, xfs_rtsumoffs_to_block(mp, so));
600         if (error)
601                 return error;
602
603         infoword = xfs_rtsumoffs_to_infoword(mp, so);
604         val = xfs_suminfo_add(args, infoword, delta);
605
606         if (rsum_cache) {
607                 if (val == 0 && log + 1 == rsum_cache[bbno])
608                         rsum_cache[bbno] = log;
609                 if (val != 0 && log >= rsum_cache[bbno])
610                         rsum_cache[bbno] = log + 1;
611         }
612
613         xfs_trans_log_rtsummary(args, infoword);
614         return 0;
615 }
616
617 /*
618  * Read and return the summary information for a given extent size, bitmap block
619  * combination.
620  */
621 int
622 xfs_rtget_summary(
623         struct xfs_rtalloc_args *args,
624         int                     log,    /* log2 of extent size */
625         xfs_fileoff_t           bbno,   /* bitmap block number */
626         xfs_suminfo_t           *sum)   /* out: summary info for this block */
627 {
628         struct xfs_mount        *mp = args->mp;
629         xfs_rtsumoff_t          so = xfs_rtsumoffs(mp, log, bbno);
630         int                     error;
631
632         error = xfs_rtsummary_read_buf(args, xfs_rtsumoffs_to_block(mp, so));
633         if (!error)
634                 *sum = xfs_suminfo_get(args, xfs_rtsumoffs_to_infoword(mp, so));
635         return error;
636 }
637
638 /* Log rtbitmap block from the word @from to the byte before @next. */
639 static inline void
640 xfs_trans_log_rtbitmap(
641         struct xfs_rtalloc_args *args,
642         unsigned int            from,
643         unsigned int            next)
644 {
645         struct xfs_buf          *bp = args->rbmbp;
646         size_t                  first, last;
647
648         first = (void *)xfs_rbmblock_wordptr(args, from) - bp->b_addr;
649         last = ((void *)xfs_rbmblock_wordptr(args, next) - 1) - bp->b_addr;
650
651         xfs_trans_log_buf(args->tp, bp, first, last);
652 }
653
654 /*
655  * Set the given range of bitmap bits to the given value.
656  * Do whatever I/O and logging is required.
657  */
658 int
659 xfs_rtmodify_range(
660         struct xfs_rtalloc_args *args,
661         xfs_rtxnum_t            start,  /* starting rtext to modify */
662         xfs_rtxlen_t            len,    /* length of extent to modify */
663         int                     val)    /* 1 for free, 0 for allocated */
664 {
665         struct xfs_mount        *mp = args->mp;
666         int                     bit;    /* bit number in the word */
667         xfs_fileoff_t           block;  /* bitmap block number */
668         int                     error;
669         int                     i;      /* current bit number rel. to start */
670         int                     lastbit; /* last useful bit in word */
671         xfs_rtword_t            mask;    /* mask of relevant bits for value */
672         xfs_rtword_t            incore;
673         unsigned int            firstword; /* first word used in the buffer */
674         unsigned int            word;   /* word number in the buffer */
675
676         /*
677          * Compute starting bitmap block number.
678          */
679         block = xfs_rtx_to_rbmblock(mp, start);
680         /*
681          * Read the bitmap block, and point to its data.
682          */
683         error = xfs_rtbitmap_read_buf(args, block);
684         if (error)
685                 return error;
686
687         /*
688          * Compute the starting word's address, and starting bit.
689          */
690         firstword = word = xfs_rtx_to_rbmword(mp, start);
691         bit = (int)(start & (XFS_NBWORD - 1));
692         /*
693          * 0 (allocated) => all zeroes; 1 (free) => all ones.
694          */
695         val = -val;
696         /*
697          * If not starting on a word boundary, deal with the first
698          * (partial) word.
699          */
700         if (bit) {
701                 /*
702                  * Compute first bit not changed and mask of relevant bits.
703                  */
704                 lastbit = min(bit + len, XFS_NBWORD);
705                 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit;
706                 /*
707                  * Set/clear the active bits.
708                  */
709                 incore = xfs_rtbitmap_getword(args, word);
710                 if (val)
711                         incore |= mask;
712                 else
713                         incore &= ~mask;
714                 xfs_rtbitmap_setword(args, word, incore);
715                 i = lastbit - bit;
716                 /*
717                  * Go on to the next block if that's where the next word is
718                  * and we need the next word.
719                  */
720                 if (++word == mp->m_blockwsize && i < len) {
721                         /*
722                          * Log the changed part of this block.
723                          * Get the next one.
724                          */
725                         xfs_trans_log_rtbitmap(args, firstword, word);
726                         error = xfs_rtbitmap_read_buf(args, ++block);
727                         if (error)
728                                 return error;
729
730                         firstword = word = 0;
731                 }
732         } else {
733                 /*
734                  * Starting on a word boundary, no partial word.
735                  */
736                 i = 0;
737         }
738         /*
739          * Loop over whole words in buffers.  When we use up one buffer
740          * we move on to the next one.
741          */
742         while (len - i >= XFS_NBWORD) {
743                 /*
744                  * Set the word value correctly.
745                  */
746                 xfs_rtbitmap_setword(args, word, val);
747                 i += XFS_NBWORD;
748                 /*
749                  * Go on to the next block if that's where the next word is
750                  * and we need the next word.
751                  */
752                 if (++word == mp->m_blockwsize && i < len) {
753                         /*
754                          * Log the changed part of this block.
755                          * Get the next one.
756                          */
757                         xfs_trans_log_rtbitmap(args, firstword, word);
758                         error = xfs_rtbitmap_read_buf(args, ++block);
759                         if (error)
760                                 return error;
761
762                         firstword = word = 0;
763                 }
764         }
765         /*
766          * If not ending on a word boundary, deal with the last
767          * (partial) word.
768          */
769         if ((lastbit = len - i)) {
770                 /*
771                  * Compute a mask of relevant bits.
772                  */
773                 mask = ((xfs_rtword_t)1 << lastbit) - 1;
774                 /*
775                  * Set/clear the active bits.
776                  */
777                 incore = xfs_rtbitmap_getword(args, word);
778                 if (val)
779                         incore |= mask;
780                 else
781                         incore &= ~mask;
782                 xfs_rtbitmap_setword(args, word, incore);
783                 word++;
784         }
785         /*
786          * Log any remaining changed bytes.
787          */
788         if (word > firstword)
789                 xfs_trans_log_rtbitmap(args, firstword, word);
790         return 0;
791 }
792
793 /*
794  * Mark an extent specified by start and len freed.
795  * Updates all the summary information as well as the bitmap.
796  */
797 int
798 xfs_rtfree_range(
799         struct xfs_rtalloc_args *args,
800         xfs_rtxnum_t            start,  /* starting rtext to free */
801         xfs_rtxlen_t            len)    /* in/out: summary block number */
802 {
803         struct xfs_mount        *mp = args->mp;
804         xfs_rtxnum_t            end;    /* end of the freed extent */
805         int                     error;  /* error value */
806         xfs_rtxnum_t            postblock; /* first rtext freed > end */
807         xfs_rtxnum_t            preblock;  /* first rtext freed < start */
808
809         end = start + len - 1;
810         /*
811          * Modify the bitmap to mark this extent freed.
812          */
813         error = xfs_rtmodify_range(args, start, len, 1);
814         if (error) {
815                 return error;
816         }
817         /*
818          * Assume we're freeing out of the middle of an allocated extent.
819          * We need to find the beginning and end of the extent so we can
820          * properly update the summary.
821          */
822         error = xfs_rtfind_back(args, start, &preblock);
823         if (error) {
824                 return error;
825         }
826         /*
827          * Find the next allocated block (end of allocated extent).
828          */
829         error = xfs_rtfind_forw(args, end, args->rtg->rtg_extents - 1,
830                         &postblock);
831         if (error)
832                 return error;
833         /*
834          * If there are blocks not being freed at the front of the
835          * old extent, add summary data for them to be allocated.
836          */
837         if (preblock < start) {
838                 error = xfs_rtmodify_summary(args,
839                                 xfs_highbit64(start - preblock),
840                                 xfs_rtx_to_rbmblock(mp, preblock), -1);
841                 if (error) {
842                         return error;
843                 }
844         }
845         /*
846          * If there are blocks not being freed at the end of the
847          * old extent, add summary data for them to be allocated.
848          */
849         if (postblock > end) {
850                 error = xfs_rtmodify_summary(args,
851                                 xfs_highbit64(postblock - end),
852                                 xfs_rtx_to_rbmblock(mp, end + 1), -1);
853                 if (error) {
854                         return error;
855                 }
856         }
857         /*
858          * Increment the summary information corresponding to the entire
859          * (new) free extent.
860          */
861         return xfs_rtmodify_summary(args,
862                         xfs_highbit64(postblock + 1 - preblock),
863                         xfs_rtx_to_rbmblock(mp, preblock), 1);
864 }
865
866 /*
867  * Check that the given range is either all allocated (val = 0) or
868  * all free (val = 1).
869  */
870 int
871 xfs_rtcheck_range(
872         struct xfs_rtalloc_args *args,
873         xfs_rtxnum_t            start,  /* starting rtext number of extent */
874         xfs_rtxlen_t            len,    /* length of extent */
875         int                     val,    /* 1 for free, 0 for allocated */
876         xfs_rtxnum_t            *new,   /* out: first rtext not matching */
877         int                     *stat)  /* out: 1 for matches, 0 for not */
878 {
879         struct xfs_mount        *mp = args->mp;
880         int                     bit;    /* bit number in the word */
881         xfs_fileoff_t           block;  /* bitmap block number */
882         int                     error;
883         xfs_rtxnum_t            i;      /* current bit number rel. to start */
884         xfs_rtxnum_t            lastbit; /* last useful bit in word */
885         xfs_rtword_t            mask;   /* mask of relevant bits for value */
886         xfs_rtword_t            wdiff;  /* difference from wanted value */
887         xfs_rtword_t            incore;
888         unsigned int            word;   /* word number in the buffer */
889
890         /*
891          * Compute starting bitmap block number
892          */
893         block = xfs_rtx_to_rbmblock(mp, start);
894         /*
895          * Read the bitmap block.
896          */
897         error = xfs_rtbitmap_read_buf(args, block);
898         if (error)
899                 return error;
900
901         /*
902          * Compute the starting word's address, and starting bit.
903          */
904         word = xfs_rtx_to_rbmword(mp, start);
905         bit = (int)(start & (XFS_NBWORD - 1));
906         /*
907          * 0 (allocated) => all zero's; 1 (free) => all one's.
908          */
909         val = -val;
910         /*
911          * If not starting on a word boundary, deal with the first
912          * (partial) word.
913          */
914         if (bit) {
915                 /*
916                  * Compute first bit not examined.
917                  */
918                 lastbit = min(bit + len, XFS_NBWORD);
919                 /*
920                  * Mask of relevant bits.
921                  */
922                 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit;
923                 /*
924                  * Compute difference between actual and desired value.
925                  */
926                 incore = xfs_rtbitmap_getword(args, word);
927                 if ((wdiff = (incore ^ val) & mask)) {
928                         /*
929                          * Different, compute first wrong bit and return.
930                          */
931                         i = xfs_lowbit32(wdiff) - bit;
932                         *new = start + i;
933                         *stat = 0;
934                         return 0;
935                 }
936                 i = lastbit - bit;
937                 /*
938                  * Go on to next block if that's where the next word is
939                  * and we need the next word.
940                  */
941                 if (++word == mp->m_blockwsize && i < len) {
942                         /*
943                          * If done with this block, get the next one.
944                          */
945                         error = xfs_rtbitmap_read_buf(args, ++block);
946                         if (error)
947                                 return error;
948
949                         word = 0;
950                 }
951         } else {
952                 /*
953                  * Starting on a word boundary, no partial word.
954                  */
955                 i = 0;
956         }
957         /*
958          * Loop over whole words in buffers.  When we use up one buffer
959          * we move on to the next one.
960          */
961         while (len - i >= XFS_NBWORD) {
962                 /*
963                  * Compute difference between actual and desired value.
964                  */
965                 incore = xfs_rtbitmap_getword(args, word);
966                 if ((wdiff = incore ^ val)) {
967                         /*
968                          * Different, compute first wrong bit and return.
969                          */
970                         i += xfs_lowbit32(wdiff);
971                         *new = start + i;
972                         *stat = 0;
973                         return 0;
974                 }
975                 i += XFS_NBWORD;
976                 /*
977                  * Go on to next block if that's where the next word is
978                  * and we need the next word.
979                  */
980                 if (++word == mp->m_blockwsize && i < len) {
981                         /*
982                          * If done with this block, get the next one.
983                          */
984                         error = xfs_rtbitmap_read_buf(args, ++block);
985                         if (error)
986                                 return error;
987
988                         word = 0;
989                 }
990         }
991         /*
992          * If not ending on a word boundary, deal with the last
993          * (partial) word.
994          */
995         if ((lastbit = len - i)) {
996                 /*
997                  * Mask of relevant bits.
998                  */
999                 mask = ((xfs_rtword_t)1 << lastbit) - 1;
1000                 /*
1001                  * Compute difference between actual and desired value.
1002                  */
1003                 incore = xfs_rtbitmap_getword(args, word);
1004                 if ((wdiff = (incore ^ val) & mask)) {
1005                         /*
1006                          * Different, compute first wrong bit and return.
1007                          */
1008                         i += xfs_lowbit32(wdiff);
1009                         *new = start + i;
1010                         *stat = 0;
1011                         return 0;
1012                 } else
1013                         i = len;
1014         }
1015         /*
1016          * Successful, return.
1017          */
1018         *new = start + i;
1019         *stat = 1;
1020         return 0;
1021 }
1022
1023 #ifdef DEBUG
1024 /*
1025  * Check that the given extent (block range) is allocated already.
1026  */
1027 STATIC int
1028 xfs_rtcheck_alloc_range(
1029         struct xfs_rtalloc_args *args,
1030         xfs_rtxnum_t            start,  /* starting rtext number of extent */
1031         xfs_rtxlen_t            len)    /* length of extent */
1032 {
1033         xfs_rtxnum_t            new;    /* dummy for xfs_rtcheck_range */
1034         int                     stat;
1035         int                     error;
1036
1037         error = xfs_rtcheck_range(args, start, len, 0, &new, &stat);
1038         if (error)
1039                 return error;
1040         ASSERT(stat);
1041         return 0;
1042 }
1043 #else
1044 #define xfs_rtcheck_alloc_range(a,b,l)  (0)
1045 #endif
1046 /*
1047  * Free an extent in the realtime subvolume.  Length is expressed in
1048  * realtime extents, as is the block number.
1049  */
1050 int
1051 xfs_rtfree_extent(
1052         struct xfs_trans        *tp,    /* transaction pointer */
1053         struct xfs_rtgroup      *rtg,
1054         xfs_rtxnum_t            start,  /* starting rtext number to free */
1055         xfs_rtxlen_t            len)    /* length of extent freed */
1056 {
1057         struct xfs_mount        *mp = tp->t_mountp;
1058         struct xfs_inode        *rbmip = rtg->rtg_inodes[XFS_RTGI_BITMAP];
1059         struct xfs_rtalloc_args args = {
1060                 .mp             = mp,
1061                 .tp             = tp,
1062                 .rtg            = rtg,
1063         };
1064         int                     error;
1065         struct timespec64       atime;
1066
1067         ASSERT(rbmip->i_itemp != NULL);
1068         xfs_assert_ilocked(rbmip, XFS_ILOCK_EXCL);
1069
1070         if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_FREE_EXTENT))
1071                 return -EIO;
1072
1073         error = xfs_rtcheck_alloc_range(&args, start, len);
1074         if (error)
1075                 return error;
1076
1077         /*
1078          * Free the range of realtime blocks.
1079          */
1080         error = xfs_rtfree_range(&args, start, len);
1081         if (error)
1082                 goto out;
1083
1084         /*
1085          * Mark more blocks free in the superblock.
1086          */
1087         xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len);
1088
1089         /*
1090          * If we've now freed all the blocks, reset the file sequence
1091          * number to 0 for pre-RTG file systems.
1092          */
1093         if (!xfs_has_rtgroups(mp) &&
1094             tp->t_frextents_delta + mp->m_sb.sb_frextents ==
1095             mp->m_sb.sb_rextents) {
1096                 if (!(rbmip->i_diflags & XFS_DIFLAG_NEWRTBM))
1097                         rbmip->i_diflags |= XFS_DIFLAG_NEWRTBM;
1098
1099                 atime = inode_get_atime(VFS_I(rbmip));
1100                 atime.tv_sec = 0;
1101                 inode_set_atime_to_ts(VFS_I(rbmip), atime);
1102                 xfs_trans_log_inode(tp, rbmip, XFS_ILOG_CORE);
1103         }
1104         error = 0;
1105 out:
1106         xfs_rtbuf_cache_relse(&args);
1107         return error;
1108 }
1109
1110 /*
1111  * Free some blocks in the realtime subvolume.  rtbno and rtlen are in units of
1112  * rt blocks, not rt extents; must be aligned to the rt extent size; and rtlen
1113  * cannot exceed XFS_MAX_BMBT_EXTLEN.
1114  */
1115 int
1116 xfs_rtfree_blocks(
1117         struct xfs_trans        *tp,
1118         struct xfs_rtgroup      *rtg,
1119         xfs_fsblock_t           rtbno,
1120         xfs_filblks_t           rtlen)
1121 {
1122         struct xfs_mount        *mp = tp->t_mountp;
1123         xfs_extlen_t            mod;
1124         int                     error;
1125
1126         ASSERT(rtlen <= XFS_MAX_BMBT_EXTLEN);
1127
1128         mod = xfs_blen_to_rtxoff(mp, rtlen);
1129         if (mod) {
1130                 ASSERT(mod == 0);
1131                 return -EIO;
1132         }
1133
1134         mod = xfs_rtb_to_rtxoff(mp, rtbno);
1135         if (mod) {
1136                 ASSERT(mod == 0);
1137                 return -EIO;
1138         }
1139
1140         error = xfs_rtfree_extent(tp, rtg, xfs_rtb_to_rtx(mp, rtbno),
1141                         xfs_extlen_to_rtxlen(mp, rtlen));
1142         if (error)
1143                 return error;
1144
1145         if (xfs_has_rtgroups(mp))
1146                 xfs_extent_busy_insert(tp, rtg_group(rtg),
1147                                 xfs_rtb_to_rgbno(mp, rtbno), rtlen, 0);
1148
1149         return 0;
1150 }
1151
1152 /* Find all the free records within a given range. */
1153 int
1154 xfs_rtalloc_query_range(
1155         struct xfs_rtgroup              *rtg,
1156         struct xfs_trans                *tp,
1157         xfs_rtxnum_t                    start,
1158         xfs_rtxnum_t                    end,
1159         xfs_rtalloc_query_range_fn      fn,
1160         void                            *priv)
1161 {
1162         struct xfs_mount                *mp = rtg_mount(rtg);
1163         struct xfs_rtalloc_args         args = {
1164                 .rtg                    = rtg,
1165                 .mp                     = mp,
1166                 .tp                     = tp,
1167         };
1168         int                             error = 0;
1169
1170         if (start > end)
1171                 return -EINVAL;
1172         if (start == end || start >= rtg->rtg_extents)
1173                 return 0;
1174
1175         end = min(end, rtg->rtg_extents - 1);
1176
1177         /* Iterate the bitmap, looking for discrepancies. */
1178         while (start <= end) {
1179                 struct xfs_rtalloc_rec  rec;
1180                 int                     is_free;
1181                 xfs_rtxnum_t            rtend;
1182
1183                 /* Is the first block free? */
1184                 error = xfs_rtcheck_range(&args, start, 1, 1, &rtend,
1185                                 &is_free);
1186                 if (error)
1187                         break;
1188
1189                 /* How long does the extent go for? */
1190                 error = xfs_rtfind_forw(&args, start, end, &rtend);
1191                 if (error)
1192                         break;
1193
1194                 if (is_free) {
1195                         rec.ar_startext = start;
1196                         rec.ar_extcount = rtend - start + 1;
1197
1198                         error = fn(rtg, tp, &rec, priv);
1199                         if (error)
1200                                 break;
1201                 }
1202
1203                 start = rtend + 1;
1204         }
1205
1206         xfs_rtbuf_cache_relse(&args);
1207         return error;
1208 }
1209
1210 /* Find all the free records. */
1211 int
1212 xfs_rtalloc_query_all(
1213         struct xfs_rtgroup              *rtg,
1214         struct xfs_trans                *tp,
1215         xfs_rtalloc_query_range_fn      fn,
1216         void                            *priv)
1217 {
1218         return xfs_rtalloc_query_range(rtg, tp, 0, rtg->rtg_extents - 1, fn,
1219                         priv);
1220 }
1221
1222 /* Is the given extent all free? */
1223 int
1224 xfs_rtalloc_extent_is_free(
1225         struct xfs_rtgroup              *rtg,
1226         struct xfs_trans                *tp,
1227         xfs_rtxnum_t                    start,
1228         xfs_rtxlen_t                    len,
1229         bool                            *is_free)
1230 {
1231         struct xfs_rtalloc_args         args = {
1232                 .mp                     = rtg_mount(rtg),
1233                 .rtg                    = rtg,
1234                 .tp                     = tp,
1235         };
1236         xfs_rtxnum_t                    end;
1237         int                             matches;
1238         int                             error;
1239
1240         error = xfs_rtcheck_range(&args, start, len, 1, &end, &matches);
1241         xfs_rtbuf_cache_relse(&args);
1242         if (error)
1243                 return error;
1244
1245         *is_free = matches;
1246         return 0;
1247 }
1248
1249 /* Compute the number of rt extents tracked by a single bitmap block. */
1250 xfs_rtxnum_t
1251 xfs_rtbitmap_rtx_per_rbmblock(
1252         struct xfs_mount        *mp)
1253 {
1254         unsigned int            rbmblock_bytes = mp->m_sb.sb_blocksize;
1255
1256         if (xfs_has_rtgroups(mp))
1257                 rbmblock_bytes -= sizeof(struct xfs_rtbuf_blkinfo);
1258
1259         return rbmblock_bytes * NBBY;
1260 }
1261
1262 /*
1263  * Compute the number of rtbitmap blocks needed to track the given number of rt
1264  * extents.
1265  */
1266 xfs_filblks_t
1267 xfs_rtbitmap_blockcount_len(
1268         struct xfs_mount        *mp,
1269         xfs_rtbxlen_t           rtextents)
1270 {
1271         return howmany_64(rtextents, xfs_rtbitmap_rtx_per_rbmblock(mp));
1272 }
1273
1274 /* How many rt extents does each rtbitmap file track? */
1275 static inline xfs_rtbxlen_t
1276 xfs_rtbitmap_bitcount(
1277         struct xfs_mount        *mp)
1278 {
1279         if (!mp->m_sb.sb_rextents)
1280                 return 0;
1281
1282         /* rtgroup size can be nonzero even if rextents is zero */
1283         if (xfs_has_rtgroups(mp))
1284                 return mp->m_sb.sb_rgextents;
1285
1286         return mp->m_sb.sb_rextents;
1287 }
1288
1289 /*
1290  * Compute the number of rtbitmap blocks used for a given file system.
1291  */
1292 xfs_filblks_t
1293 xfs_rtbitmap_blockcount(
1294         struct xfs_mount        *mp)
1295 {
1296         return xfs_rtbitmap_blockcount_len(mp, xfs_rtbitmap_bitcount(mp));
1297 }
1298
1299 /*
1300  * Compute the geometry of the rtsummary file needed to track the given rt
1301  * space.
1302  */
1303 xfs_filblks_t
1304 xfs_rtsummary_blockcount(
1305         struct xfs_mount        *mp,
1306         unsigned int            *rsumlevels)
1307 {
1308         xfs_rtbxlen_t           rextents = xfs_rtbitmap_bitcount(mp);
1309         unsigned long long      rsumwords;
1310
1311         *rsumlevels = xfs_compute_rextslog(rextents) + 1;
1312         rsumwords = xfs_rtbitmap_blockcount_len(mp, rextents) * (*rsumlevels);
1313         return howmany_64(rsumwords, mp->m_blockwsize);
1314 }
1315
1316 static int
1317 xfs_rtfile_alloc_blocks(
1318         struct xfs_inode        *ip,
1319         xfs_fileoff_t           offset_fsb,
1320         xfs_filblks_t           count_fsb,
1321         struct xfs_bmbt_irec    *map)
1322 {
1323         struct xfs_mount        *mp = ip->i_mount;
1324         struct xfs_trans        *tp;
1325         int                     nmap = 1;
1326         int                     error;
1327
1328         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtalloc,
1329                         XFS_GROWFSRT_SPACE_RES(mp, count_fsb), 0, 0, &tp);
1330         if (error)
1331                 return error;
1332
1333         xfs_ilock(ip, XFS_ILOCK_EXCL);
1334         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
1335
1336         error = xfs_iext_count_extend(tp, ip, XFS_DATA_FORK,
1337                                 XFS_IEXT_ADD_NOSPLIT_CNT);
1338         if (error)
1339                 goto out_trans_cancel;
1340
1341         error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb,
1342                         XFS_BMAPI_METADATA, 0, map, &nmap);
1343         if (error)
1344                 goto out_trans_cancel;
1345
1346         return xfs_trans_commit(tp);
1347
1348 out_trans_cancel:
1349         xfs_trans_cancel(tp);
1350         return error;
1351 }
1352
1353 /* Get a buffer for the block. */
1354 static int
1355 xfs_rtfile_initialize_block(
1356         struct xfs_rtgroup      *rtg,
1357         enum xfs_rtg_inodes     type,
1358         xfs_fsblock_t           fsbno,
1359         void                    *data)
1360 {
1361         struct xfs_mount        *mp = rtg_mount(rtg);
1362         struct xfs_inode        *ip = rtg->rtg_inodes[type];
1363         struct xfs_trans        *tp;
1364         struct xfs_buf          *bp;
1365         void                    *bufdata;
1366         const size_t            copylen = mp->m_blockwsize << XFS_WORDLOG;
1367         enum xfs_blft           buf_type;
1368         int                     error;
1369
1370         if (type == XFS_RTGI_BITMAP)
1371                 buf_type = XFS_BLFT_RTBITMAP_BUF;
1372         else if (type == XFS_RTGI_SUMMARY)
1373                 buf_type = XFS_BLFT_RTSUMMARY_BUF;
1374         else
1375                 return -EINVAL;
1376
1377         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtzero, 0, 0, 0, &tp);
1378         if (error)
1379                 return error;
1380         xfs_ilock(ip, XFS_ILOCK_EXCL);
1381         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
1382
1383         error = xfs_trans_get_buf(tp, mp->m_ddev_targp,
1384                         XFS_FSB_TO_DADDR(mp, fsbno), mp->m_bsize, 0, &bp);
1385         if (error) {
1386                 xfs_trans_cancel(tp);
1387                 return error;
1388         }
1389         bufdata = bp->b_addr;
1390
1391         xfs_trans_buf_set_type(tp, bp, buf_type);
1392         bp->b_ops = xfs_rtblock_ops(mp, type);
1393
1394         if (xfs_has_rtgroups(mp)) {
1395                 struct xfs_rtbuf_blkinfo        *hdr = bp->b_addr;
1396
1397                 if (type == XFS_RTGI_BITMAP)
1398                         hdr->rt_magic = cpu_to_be32(XFS_RTBITMAP_MAGIC);
1399                 else
1400                         hdr->rt_magic = cpu_to_be32(XFS_RTSUMMARY_MAGIC);
1401                 hdr->rt_owner = cpu_to_be64(ip->i_ino);
1402                 hdr->rt_blkno = cpu_to_be64(XFS_FSB_TO_DADDR(mp, fsbno));
1403                 hdr->rt_lsn = 0;
1404                 uuid_copy(&hdr->rt_uuid, &mp->m_sb.sb_meta_uuid);
1405
1406                 bufdata += sizeof(*hdr);
1407         }
1408
1409         if (data)
1410                 memcpy(bufdata, data, copylen);
1411         else
1412                 memset(bufdata, 0, copylen);
1413         xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1);
1414         return xfs_trans_commit(tp);
1415 }
1416
1417 /*
1418  * Allocate space to the bitmap or summary file, and zero it, for growfs.
1419  * @data must be a contiguous buffer large enough to fill all blocks in the
1420  * file; or NULL to initialize the contents to zeroes.
1421  */
1422 int
1423 xfs_rtfile_initialize_blocks(
1424         struct xfs_rtgroup      *rtg,
1425         enum xfs_rtg_inodes     type,
1426         xfs_fileoff_t           offset_fsb,     /* offset to start from */
1427         xfs_fileoff_t           end_fsb,        /* offset to allocate to */
1428         void                    *data)          /* data to fill the blocks */
1429 {
1430         struct xfs_mount        *mp = rtg_mount(rtg);
1431         const size_t            copylen = mp->m_blockwsize << XFS_WORDLOG;
1432
1433         while (offset_fsb < end_fsb) {
1434                 struct xfs_bmbt_irec    map;
1435                 xfs_filblks_t           i;
1436                 int                     error;
1437
1438                 error = xfs_rtfile_alloc_blocks(rtg->rtg_inodes[type],
1439                                 offset_fsb, end_fsb - offset_fsb, &map);
1440                 if (error)
1441                         return error;
1442
1443                 /*
1444                  * Now we need to clear the allocated blocks.
1445                  *
1446                  * Do this one block per transaction, to keep it simple.
1447                  */
1448                 for (i = 0; i < map.br_blockcount; i++) {
1449                         error = xfs_rtfile_initialize_block(rtg, type,
1450                                         map.br_startblock + i, data);
1451                         if (error)
1452                                 return error;
1453                         if (data)
1454                                 data += copylen;
1455                 }
1456
1457                 offset_fsb = map.br_startoff + map.br_blockcount;
1458         }
1459
1460         return 0;
1461 }
1462
1463 int
1464 xfs_rtbitmap_create(
1465         struct xfs_rtgroup      *rtg,
1466         struct xfs_inode        *ip,
1467         struct xfs_trans        *tp,
1468         bool                    init)
1469 {
1470         struct xfs_mount        *mp = rtg_mount(rtg);
1471
1472         ip->i_disk_size = mp->m_sb.sb_rbmblocks * mp->m_sb.sb_blocksize;
1473         if (init && !xfs_has_rtgroups(mp)) {
1474                 ip->i_diflags |= XFS_DIFLAG_NEWRTBM;
1475                 inode_set_atime(VFS_I(ip), 0, 0);
1476         }
1477         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1478         return 0;
1479 }
1480
1481 int
1482 xfs_rtsummary_create(
1483         struct xfs_rtgroup      *rtg,
1484         struct xfs_inode        *ip,
1485         struct xfs_trans        *tp,
1486         bool                    init)
1487 {
1488         struct xfs_mount        *mp = rtg_mount(rtg);
1489
1490         ip->i_disk_size = mp->m_rsumblocks * mp->m_sb.sb_blocksize;
1491         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1492         return 0;
1493 }
This page took 0.11343 seconds and 4 git commands to generate.