LCOV - code coverage report
Current view: top level - fsck - rgrepair.c (source / functions) Coverage Total Hit
Test: gfs2-utils.info Lines: 77.3 % 604 467
Test Date: 2024-03-07 16:24:06 Functions: 92.9 % 14 13

            Line data    Source code
       1              : #include "clusterautoconfig.h"
       2              : 
       3              : #include <unistd.h>
       4              : #include <inttypes.h>
       5              : #include <stdio.h>
       6              : #include <stdint.h>
       7              : #include <stdlib.h>
       8              : #include <string.h>
       9              : #include <errno.h>
      10              : #include <libintl.h>
      11              : #define _(String) gettext(String)
      12              : 
      13              : #include <logging.h>
      14              : #include "libgfs2.h"
      15              : #include "osi_list.h"
      16              : #include "fsck.h"
      17              : #include "fs_recovery.h"
      18              : 
      19              : static int rindex_modified = 0;
      20              : static struct special_blocks false_rgrps;
      21              : static struct osi_root rgcalc;
      22              : /* Number of resource groups */
      23              : static uint64_t nrgrp = 0;
      24              : 
      25              : #define BAD_RG_PERCENT_TOLERANCE 11
      26              : #define AWAY_FROM_BITMAPS 0x1000
      27              : #define MAX_RGSEGMENTS 20
      28              : 
      29              : #define ri_compare(rg, ondisk, expected, field, fmt)    \
      30              :         if (ondisk->field != expected->field) { \
      31              :                 log_warn( _("rindex #%d " #field " discrepancy: index 0x%" \
      32              :                             fmt " != expected: 0x%" fmt "\n"),              \
      33              :                           rg + 1, ondisk->field, expected->field);        \
      34              :                 ondisk->field = expected->field;                          \
      35              :                 rindex_modified = 1;                                    \
      36              :         }
      37              : 
      38              : /*
      39              :  * find_journal_entry_rgs - find all RG blocks within all journals
      40              :  *
      41              :  * Since Resource Groups (RGs) are journaled, it is not uncommon for them
      42              :  * to appear inside a journal.  But if there is severe damage to the rindex
      43              :  * file or some of the RGs, we may need to hunt and peck for RGs and in that
      44              :  * case, we don't want to mistake these blocks that look just a real RG
      45              :  * for a real RG block.  These are "fake" RGs that need to be ignored for
      46              :  * the purposes of finding where things are.
      47              :  *
      48              :  * NOTE: This function assumes that the jindex and journals have been read in,
      49              :  *       which isn't often the case. Normally the rindex needs to be read in
      50              :  *       first. If the rindex is damaged, that's not an option.
      51              :  */
      52            4 : static void find_journaled_rgs(struct lgfs2_sbd *sdp)
      53              : {
      54            4 :         int j, new = 0;
      55              :         unsigned int jblocks;
      56              :         uint64_t b, dblock;
      57              :         struct lgfs2_inode *ip;
      58              :         struct lgfs2_buffer_head *bh;
      59              :         int false_count;
      60              : 
      61            4 :         osi_list_init(&false_rgrps.list);
      62            8 :         for (j = 0; j < sdp->md.journals; j++) {
      63            4 :                 ip = sdp->md.journal[j];
      64            4 :                 log_debug(_("Checking for rgrps in journal%d which starts at block 0x%"PRIx64".\n"),
      65              :                           j, ip->i_num.in_addr);
      66            4 :                 jblocks = ip->i_size / sdp->sd_bsize;
      67            4 :                 false_count = 0;
      68       131076 :                 for (b = 0; b < jblocks; b++) {
      69       131072 :                         if (lgfs2_block_map(ip, b, &new, &dblock, NULL, 0)) {
      70            0 :                                 log_crit(_("Failed to map block 0x%"PRIu64" in journal at 0x%"PRIu64": %s\n"),
      71              :                                          b, ip->i_num.in_addr, strerror(errno));
      72            0 :                                 exit(1);
      73              :                         }
      74       131072 :                         if (!dblock)
      75            0 :                                 break;
      76       131072 :                         bh = lgfs2_bread(sdp, dblock);
      77       131072 :                         if (!lgfs2_check_meta(bh->b_data, GFS2_METATYPE_RG)) {
      78              :                                 /* False rgrp found at block dblock */
      79            0 :                                 false_count++;
      80            0 :                                 special_set(&false_rgrps, dblock);
      81              :                         }
      82       131072 :                         lgfs2_brelse(bh);
      83              :                 }
      84            4 :                 log_debug("\n%d false positives identified.\n", false_count);
      85              :         }
      86            4 : }
      87              : 
      88      4152432 : static int is_false_rg(uint64_t block)
      89              : {
      90      4152432 :         if (blockfind(&false_rgrps, block))
      91            0 :                 return 1;
      92      4152432 :         return 0;
      93              : }
      94              : 
      95              : /*
      96              :  * find_shortest_rgdist - hunt and peck for the shortest distance between RGs.
      97              :  *
      98              :  * Sample several of them because an RG that's been blasted may
      99              :  * look like twice the distance.  If we can find 6 of them, that
     100              :  * should be enough to figure out the correct layout.
     101              :  * This also figures out first_rg_dist since that's always different.
     102              :  *
     103              :  * This function was revised to return the number of segments, usually 2.
     104              :  * The shortest distance is now returned in the highest entry in rg_dist
     105              :  */
     106            4 : static int find_shortest_rgdist(struct lgfs2_sbd *sdp, uint64_t *dist_array,
     107              :                                 int *dist_cnt)
     108              : {
     109              :         uint64_t blk, block_last_rg, shortest_dist_btwn_rgs;
     110              :         struct lgfs2_buffer_head *bh;
     111            4 :         int rgs_sampled = 0;
     112              :         uint64_t initial_first_rg_dist;
     113            4 :         int gsegment = 0;
     114              :         int is_rgrp;
     115              : 
     116              :         /* Figure out if there are any RG-looking blocks in the journal we
     117              :            need to ignore. */
     118            4 :         find_journaled_rgs(sdp);
     119              : 
     120            4 :         initial_first_rg_dist = dist_array[0] = block_last_rg =
     121            4 :                 LGFS2_SB_ADDR(sdp) + 1;
     122            4 :         shortest_dist_btwn_rgs = sdp->device.length;
     123              : 
     124      4152432 :         for (blk = LGFS2_SB_ADDR(sdp) + 1; blk < sdp->device.length; blk++) {
     125              :                 uint64_t dist;
     126              : 
     127      4152428 :                 if (blk == LGFS2_SB_ADDR(sdp) + 1)
     128            4 :                         is_rgrp = 1;
     129      4152424 :                 else if (is_false_rg(blk))
     130            0 :                         is_rgrp = 0;
     131              :                 else {
     132      4152424 :                         bh = lgfs2_bread(sdp, blk);
     133      4152424 :                         is_rgrp = (lgfs2_check_meta(bh->b_data, GFS2_METATYPE_RG) == 0);
     134      4152424 :                         lgfs2_brelse(bh);
     135              :                 }
     136      4152428 :                 if (!is_rgrp) {
     137      4152104 :                         if (rgs_sampled >= 6) {
     138              :                                 uint64_t nblk;
     139              : 
     140            8 :                                 log_info(_("rgrp not found at block 0x%"PRIx64". "
     141              :                                            "Last found rgrp was 0x%"PRIx64". "
     142              :                                            "Checking the next one.\n"),
     143              :                                          blk, block_last_rg);
     144              :                                 /* check for just a damaged rgrp */
     145            8 :                                 nblk = blk + dist_array[gsegment];
     146            8 :                                 if (is_false_rg(nblk)) {
     147            0 :                                         is_rgrp = 0;
     148              :                                 } else {
     149            8 :                                         bh = lgfs2_bread(sdp, nblk);
     150            8 :                                         is_rgrp = (((lgfs2_check_meta(bh->b_data,
     151            8 :                                                 GFS2_METATYPE_RG) == 0)));
     152            8 :                                         lgfs2_brelse(bh);
     153              :                                 }
     154            8 :                                 if (is_rgrp) {
     155            0 :                                         log_info(_("Next rgrp is intact, so "
     156              :                                                    "this one is damaged.\n"));
     157            0 :                                         blk = nblk - 1;
     158            0 :                                         dist_cnt[gsegment]++;
     159            0 :                                         continue;
     160              :                                 }
     161            8 :                                 log_info(_("Looking for new segment.\n"));
     162            8 :                                 blk -= 16;
     163            8 :                                 rgs_sampled = 0;
     164            8 :                                 shortest_dist_btwn_rgs = sdp->device.length;
     165              :                                 /* That last one didn't pan out, so: */
     166            8 :                                 dist_cnt[gsegment]--;
     167            8 :                                 gsegment++;
     168            8 :                                 if (gsegment >= MAX_RGSEGMENTS)
     169            0 :                                         break;
     170              :                         }
     171      4152104 :                         if ((blk - block_last_rg) > (524288 * 2)) {
     172            0 :                                 log_info(_("No rgrps were found within 4GB "
     173              :                                            "of the last rgrp. Must be the "
     174              :                                            "end of the file system.\n"));
     175              : 
     176            0 :                                 break;
     177              :                         }
     178      4152104 :                         continue;
     179              :                 }
     180              : 
     181          324 :                 dist_cnt[gsegment]++;
     182          324 :                 if (rgs_sampled >= 6) {
     183          248 :                         block_last_rg = blk;
     184          248 :                         blk += dist_array[gsegment] - 1; /* prev value in
     185              :                                                             array minus 1. */
     186          248 :                         continue;
     187              :                 }
     188           76 :                 log_info(_("segment %d: rgrp found at block 0x%"PRIx64"\n"),
     189              :                          gsegment + 1, blk);
     190           76 :                 dist = blk - block_last_rg;
     191           76 :                 if (blk > LGFS2_SB_ADDR(sdp) + 1) { /* not the very first rgrp */
     192              : 
     193           72 :                         log_info("dist 0x%"PRIx64" = 0x%"PRIx64" - 0x%"PRIx64" ",
     194              :                                  dist, blk, block_last_rg);
     195              :                         /**
     196              :                          * We found an RG.  Check to see if we need to set the
     197              :                          * first_rg_dist based on whether it is still at its
     198              :                          * initial value (i.e. the fs.)  The first rg distance
     199              :                          * is different from the rest because of the
     200              :                          * superblock and 64K dead space.
     201              :                          **/
     202           72 :                         if (dist_array[0] == initial_first_rg_dist) {
     203            4 :                                 dist_array[0] = dist;
     204            4 :                                 dist_cnt[0] = 1;
     205            4 :                                 rgs_sampled = 0;
     206              :                         }
     207           72 :                         if (dist < shortest_dist_btwn_rgs) {
     208           12 :                                 shortest_dist_btwn_rgs = dist;
     209           12 :                                 log_info( _("(shortest so far)"));
     210              :                         }
     211           72 :                         log_info("\n");
     212           72 :                         if (++rgs_sampled == 6) {
     213           12 :                                 dist_array[gsegment] = shortest_dist_btwn_rgs;
     214           12 :                                 log_info(_("Settled on distance 0x%"PRIx64" for segment %d\n"),
     215              :                                          dist_array[gsegment], gsegment + 1);
     216              :                         }
     217              :                 } else {
     218            4 :                         gsegment++;
     219            4 :                         if (gsegment >= MAX_RGSEGMENTS)
     220            0 :                                 break;
     221              :                 }
     222           76 :                 block_last_rg = blk;
     223           76 :                 if (rgs_sampled < 6)
     224           64 :                         blk += 250; /* skip ahead for performance */
     225              :                 else
     226           12 :                         blk += shortest_dist_btwn_rgs - 1;
     227              :         }
     228            4 :         if (gsegment >= MAX_RGSEGMENTS) {
     229            0 :                 log_err(_("Maximum number of rgrp grow segments reached.\n"));
     230            0 :                 log_err(_("This file system has more than %d resource "
     231              :                           "group segments.\n"), MAX_RGSEGMENTS);
     232              :         }
     233              :         /* -------------------------------------------------------------- */
     234              :         /* Sanity-check our first_rg_dist. If RG #2 got nuked, the        */
     235              :         /* first_rg_dist would measure from #1 to #3, which would be bad. */
     236              :         /* We need to take remedial measures to fix it (from the index).  */
     237              :         /* -------------------------------------------------------------- */
     238            4 :         if (*dist_array >= shortest_dist_btwn_rgs +
     239            4 :             (shortest_dist_btwn_rgs / 4)) {
     240              :                 struct gfs2_rindex ri;
     241              : 
     242              :                 /* read in the second RG index entry for this subd. */
     243            0 :                 lgfs2_readi(sdp->md.riinode, &ri, sizeof(ri), sizeof(ri));
     244              : 
     245            0 :                 if (be64_to_cpu(ri.ri_addr) > LGFS2_SB_ADDR(sdp) + 1) { /* sanity check */
     246            0 :                         log_warn( _("rgrp 2 is damaged: getting dist from index: "));
     247            0 :                         *dist_array = be64_to_cpu(ri.ri_addr) - (LGFS2_SB_ADDR(sdp) + 1);
     248            0 :                         log_warn("0x%"PRIx64"\n", *dist_array);
     249              :                 } else {
     250            0 :                         log_warn( _("rgrp index 2 is damaged: extrapolating dist: "));
     251            0 :                         *dist_array = sdp->device.length - (nrgrp - 1) *
     252            0 :                                 (sdp->device.length / nrgrp);
     253            0 :                         log_warn("0x%"PRIx64"\n", *dist_array);
     254              :                 }
     255            0 :                 log_debug(_("Adjusted first rgrp distance: 0x%"PRIx64"\n"), *dist_array);
     256              :         } /* if first RG distance is within tolerance */
     257              : 
     258            4 :         special_free(&false_rgrps);
     259            4 :         return gsegment;
     260              : }
     261              : 
     262              : /*
     263              :  * count_usedspace - count the used bits in a rgrp bitmap buffer
     264              :  */
     265          168 : static uint64_t count_usedspace(struct lgfs2_sbd *sdp, int first,
     266              :                                 struct lgfs2_buffer_head *bh)
     267              : {
     268              :         int off, x, y, bytes_to_check;
     269          168 :         uint32_t rg_used = 0;
     270              :         unsigned int state;
     271              : 
     272              :         /* Count up the free blocks in the bitmap */
     273          168 :         if (first)
     274          160 :                 off = sizeof(struct gfs2_rgrp);
     275              :         else
     276            8 :                 off = sizeof(struct gfs2_meta_header);
     277          168 :         bytes_to_check = sdp->sd_bsize - off;
     278       667624 :         for (x = 0; x < bytes_to_check; x++) {
     279              :                 unsigned char *byte;
     280              : 
     281       667456 :                 byte = (unsigned char *)&bh->b_data[off + x];
     282       667456 :                 if (*byte == 0x55) {
     283          128 :                         rg_used += GFS2_NBBY;
     284          128 :                         continue;
     285              :                 }
     286       667328 :                 if (*byte == 0x00)
     287       667322 :                         continue;
     288           30 :                 for (y = 0; y < GFS2_NBBY; y++) {
     289           24 :                         state = (*byte >> (GFS2_BIT_SIZE * y)) & GFS2_BIT_MASK;
     290           24 :                         if (state == GFS2_BLKST_FREE ||
     291              :                             state == GFS2_BLKST_UNLINKED)
     292            2 :                                 continue;
     293           22 :                         rg_used++;
     294              :                 }
     295              :         }
     296          168 :         return rg_used;
     297              : }
     298              : 
     299              : /*
     300              :  * find_next_rgrp_dist - find the distance to the next rgrp
     301              :  *
     302              :  * This function is only called if the rgrps are determined to be on uneven
     303              :  * boundaries.  In a normal gfs2 file system, after mkfs.gfs2, all the
     304              :  * rgrps but the first and second one will be the same distance from the
     305              :  * previous rgrp.  (The first rgrp will predictably be after the superblock
     306              :  * and the second one will be adjusted based on the number 64KB skipped
     307              :  * at the start of the file system.)  The only way we can deviate from that
     308              :  * pattern is if the user did gfs_grow on a gfs1 file system, then converted
     309              :  * it to gfs2 using gfs2_convert.
     310              :  *
     311              :  * This function finds the distance to the next rgrp for these cases.
     312              :  */
     313          160 : static uint64_t find_next_rgrp_dist(struct lgfs2_sbd *sdp, uint64_t blk,
     314              :                                     struct lgfs2_rgrp_tree *prevrgd)
     315              : {
     316          160 :         struct osi_node *n, *next = NULL;
     317          160 :         uint64_t rgrp_dist = 0, used_blocks, block, next_block, twogigs;
     318          160 :         struct lgfs2_rgrp_tree *rgd = NULL, *next_rgd;
     319              :         struct lgfs2_buffer_head *bh;
     320              :         int first, length, b, found;
     321              :         uint64_t mega_in_blocks;
     322              :         uint32_t free_blocks;
     323              : 
     324          160 :         for (n = osi_first(&sdp->rgtree); n; n = next) {
     325            0 :                 next = osi_next(n);
     326            0 :                 rgd = (struct lgfs2_rgrp_tree *)n;
     327            0 :                 if (rgd->rt_addr == blk)
     328            0 :                         break;
     329              :         }
     330          160 :         if (rgd && n && osi_next(n) && rgd->rt_addr == blk) {
     331              :                 /* coverity[returned_null:SUPPRESS] False positive */
     332            0 :                 n = osi_next(n);
     333            0 :                 next_rgd = (struct lgfs2_rgrp_tree *)n;
     334            0 :                 rgrp_dist = next_rgd->rt_addr - rgd->rt_addr;
     335            0 :                 return rgrp_dist;
     336              :         }
     337          160 :         mega_in_blocks = (1024 * 1024)  / sdp->sd_bsize;
     338          160 :         twogigs = (uint64_t)mega_in_blocks * 2048;
     339              :         /* Unfortunately, if we fall through to here we can't trust the
     340              :            rindex.  So we have to analyze the current rgrp to figure out
     341              :            the bare minimum block number where it ends. If we don't have
     342              :            rindex, all we know about this rgrp is what's on disk: its
     343              :            rg_free.  If we analyze the rgrp's bitmap and the bitmaps that
     344              :            follow, we can figure out how many bits are used.  If we add
     345              :            rg_free, we get the total number of blocks this rgrp
     346              :            represents.  After that should be the next rgrp, but it may
     347              :            skip a few blocks (hopefully no more than 4).  */
     348          160 :         used_blocks = 0;
     349          160 :         length = 0;
     350          160 :         block = prevrgd->rt_addr;
     351          160 :         first = 1;
     352          160 :         found = 0;
     353           10 :         while (1) {
     354              :                 struct gfs2_meta_header *mh;
     355              : 
     356          170 :                 if (block >= sdp->device.length)
     357            0 :                         break;
     358          170 :                 if (block >= prevrgd->rt_addr + twogigs)
     359            0 :                         break;
     360          170 :                 bh = lgfs2_bread(sdp, block);
     361          170 :                 mh = (struct gfs2_meta_header *)bh->b_data;
     362          170 :                 if ((be32_to_cpu(mh->mh_magic) != GFS2_MAGIC) ||
     363          168 :                     (first && be32_to_cpu(mh->mh_type) != GFS2_METATYPE_RG) ||
     364            8 :                     (!first && be32_to_cpu(mh->mh_type) != GFS2_METATYPE_RB)) {
     365            2 :                         lgfs2_brelse(bh);
     366            2 :                         break;
     367              :                 }
     368          168 :                 if (first) {
     369              :                         struct gfs2_rgrp *rg;
     370              : 
     371          160 :                         rg = (struct gfs2_rgrp *)bh->b_data;
     372          160 :                         free_blocks = be32_to_cpu(rg->rg_free);
     373              :                 }
     374          168 :                 used_blocks += count_usedspace(sdp, first, bh);
     375          168 :                 first = 0;
     376          168 :                 block++;
     377          168 :                 length++;
     378          168 :                 lgfs2_brelse(bh);
     379              :                 /* Check if this distance points to an rgrp:
     380              :                    We have to look for blocks that resemble rgrps and bitmaps.
     381              :                    If they do, we need to count blocks used and free and see
     382              :                    if adding that number of free blocks accounts for the
     383              :                    next rgrp we find. Otherwise, you could have a length of
     384              :                    6 with additional user blocks that just happen to look like
     385              :                    bitmap blocks.  Count them all as bitmaps and you'll be
     386              :                    hopelessly lost. */
     387          168 :                 rgrp_dist = used_blocks + free_blocks + length;
     388          168 :                 next_block = prevrgd->rt_addr + rgrp_dist;
     389              :                 /* Now we account for block rounding done by mkfs.gfs2 */
     390          846 :                 for (b = 0; b <= length + GFS2_NBBY; b++) {
     391          846 :                         if (next_block + b >= sdp->device.length)
     392           10 :                                 break;
     393          836 :                         bh = lgfs2_bread(sdp, next_block + b);
     394          836 :                         mh = (struct gfs2_meta_header *)bh->b_data;
     395          836 :                         if (be32_to_cpu(mh->mh_magic) == GFS2_MAGIC) {
     396          158 :                                 if (be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RG)
     397          158 :                                         found = 1;
     398              :                                 /* if the first thing we find is a bitmap,
     399              :                                    there must be a damaged rgrp on the
     400              :                                    previous block. */
     401          158 :                                 if (be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RB) {
     402            0 :                                         found = 1;
     403            0 :                                         rgrp_dist--;
     404              :                                 }
     405              :                         }
     406          836 :                         lgfs2_brelse(bh);
     407          836 :                         if (found)
     408          158 :                                 break;
     409          678 :                         rgrp_dist++;
     410              :                 }
     411          168 :                 if (found) {
     412          158 :                         log_info(_("rgrp found at 0x%"PRIx64", length=%d, used=%"PRIu64", free=%d\n"),
     413              :                                  prevrgd->rt_addr, length, used_blocks, free_blocks);
     414          158 :                         break;
     415              :                 }
     416              :         }
     417          160 :         return rgrp_dist;
     418              : }
     419              : 
     420              : /*
     421              :  * hunt_and_peck - find the distance to the next rgrp
     422              :  *
     423              :  * This function is only called if the rgrps are determined to be on uneven
     424              :  * boundaries, and also corrupt.  So we have to go out searching for one.
     425              :  */
     426            0 : static uint64_t hunt_and_peck(struct lgfs2_sbd *sdp, uint64_t blk,
     427              :                               struct lgfs2_rgrp_tree *prevrgd, uint64_t last_bump)
     428              : {
     429            0 :         uint64_t rgrp_dist = 0, block, twogigs, last_block, last_meg;
     430              :         struct lgfs2_buffer_head *bh;
     431              :         struct gfs2_meta_header *mh;
     432              :         int b, mega_in_blocks;
     433              : 
     434              :         /* Skip ahead the previous amount: we might get lucky.
     435              :            If we're close to the end of the device, take the rest. */
     436            0 :         if (lgfs2_check_range(sdp, blk + last_bump))
     437            0 :                 return sdp->fssize - blk;
     438              : 
     439            0 :         bh = lgfs2_bread(sdp, blk + last_bump);
     440            0 :         mh = (struct gfs2_meta_header *)bh->b_data;
     441            0 :         if (be32_to_cpu(mh->mh_magic) == GFS2_MAGIC &&
     442            0 :             be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RG) {
     443            0 :                 log_info(_("rgrp found at 0x%"PRIx64", length=%"PRIu64"\n"),
     444              :                          blk + last_bump, last_bump);
     445            0 :                 lgfs2_brelse(bh);
     446            0 :                 return last_bump;
     447              :         }
     448            0 :         lgfs2_brelse(bh);
     449              : 
     450            0 :         rgrp_dist = AWAY_FROM_BITMAPS; /* Get away from any bitmaps
     451              :                                           associated with the previous rgrp */
     452            0 :         block = prevrgd->rt_addr + rgrp_dist;
     453              :         /* Now we account for block rounding done by mkfs.gfs2.  A rgrp can
     454              :            be at most 2GB in size, so that's where we call it. We do somewhat
     455              :            obscure math here to avoid integer overflows. */
     456            0 :         mega_in_blocks = (1024 * 1024)  / sdp->sd_bsize;
     457            0 :         twogigs = (uint64_t)2048 * mega_in_blocks;
     458            0 :         if (block + twogigs <= sdp->fssize) {
     459            0 :                 last_block = twogigs;
     460            0 :                 last_meg = 0;
     461              :         } else {
     462              :                 /* There won't be a rgrp in the last megabyte. */
     463            0 :                 last_block = sdp->fssize - block - mega_in_blocks;
     464            0 :                 last_meg = mega_in_blocks;
     465              :         }
     466            0 :         for (b = AWAY_FROM_BITMAPS; b < last_block; b++) {
     467              :                 uint32_t magic, type;
     468              : 
     469            0 :                 bh = lgfs2_bread(sdp, block + b);
     470            0 :                 mh = (struct gfs2_meta_header *)bh->b_data;
     471            0 :                 magic = be32_to_cpu(mh->mh_magic);
     472            0 :                 type = be32_to_cpu(mh->mh_type);
     473            0 :                 lgfs2_brelse(bh);
     474            0 :                 if (magic == GFS2_MAGIC) {
     475            0 :                         if (type == GFS2_METATYPE_RG)
     476            0 :                                 break;
     477              :                         /* if the first thing we find is a bitmap, there must
     478              :                            be a damaged rgrp on the previous block. */
     479            0 :                         if (type == GFS2_METATYPE_RB) {
     480            0 :                                 rgrp_dist--;
     481            0 :                                 break;
     482              :                         }
     483              :                 }
     484            0 :                 rgrp_dist++;
     485              :         }
     486            0 :         return rgrp_dist + last_meg;
     487              : }
     488              : 
     489              : /*
     490              :  * rindex_rebuild - rebuild a corrupt Resource Group (RG) index manually
     491              :  *                  where trust_lvl == DISTRUST
     492              :  *
     493              :  * If this routine is called, it means we have RGs in odd/unexpected places,
     494              :  * and there is a corrupt RG or RG index entry.  It also means we can't trust
     495              :  * the RG index to be sane, and the RGs don't agree with how mkfs would have
     496              :  * built them by default.  So we have no choice but to go through and count
     497              :  * them by hand.  We've tried twice to recover the RGs and RG index, and
     498              :  * failed, so this is our last chance to remedy the situation.
     499              :  *
     500              :  * This routine tries to minimize performance impact by:
     501              :  * 1. Skipping through the filesystem at known increments when possible.
     502              :  * 2. Shuffle through every block when RGs are not found at the predicted
     503              :  *    locations.
     504              :  *
     505              :  * Note: A GFS2 filesystem differs from a GFS1 file system in that there will
     506              :  * only be ONE chunk (i.e. no artificial subdevices on either size of the
     507              :  * journals).  The journals and even the rindex are kept as part of the file
     508              :  * system, so we need to rebuild that information by hand.  Also, with GFS1,
     509              :  * the different chunks ("subdevices") could have different RG sizes, which
     510              :  * made for quite a mess when trying to recover RGs.  GFS2 always uses the
     511              :  * same RG size determined by the original mkfs, so recovery is easier.
     512              :  *
     513              :  * If "gfs_grow" is specified the file system was most likely converted
     514              :  * from gfs1 to gfs2 after a gfs_grow operation.  In that case, the rgrps
     515              :  * will not be on predictable boundaries.
     516              :  */
     517            4 : static int rindex_rebuild(struct fsck_cx *cx, int *num_rgs, int gfs_grow)
     518              : {
     519            4 :         struct lgfs2_sbd *sdp = cx->sdp;
     520            4 :         struct osi_node *n, *next = NULL;
     521              :         struct lgfs2_buffer_head *bh;
     522            4 :         uint64_t rg_dist[MAX_RGSEGMENTS] = {0, };
     523            4 :         int rg_dcnt[MAX_RGSEGMENTS] = {0, };
     524              :         uint64_t blk;
     525              :         uint64_t fwd_block, block_bump;
     526              :         struct lgfs2_rgrp_tree *calc_rgd, *prev_rgd;
     527              :         int number_of_rgs, rgi, segment_rgs;
     528            4 :         int rg_was_fnd = 0, corrupt_rgs = 0;
     529            4 :         int error = -1, j, i;
     530            4 :         int grow_segments, segment = 0;
     531              : 
     532              :         /*
     533              :          * In order to continue, we need to initialize the jindex. We need
     534              :          * the journals in order to correctly eliminate false positives during
     535              :          * rgrp repair. IOW, we need to properly ignore rgrps that appear in
     536              :          * the journals, and we can only do that if we have the journals.
     537              :          * To make matters worse, journals may span several (small) rgrps,
     538              :          * so we can't go by the rgrps.
     539              :          */
     540            4 :         if (init_jindex(cx, 0) != 0) {
     541            0 :                 log_crit(_("Error: Can't read jindex required for rindex "
     542              :                            "repairs.\n"));
     543            0 :                 return -1;
     544              :         }
     545              : 
     546            4 :         rgcalc.osi_node = NULL;
     547            4 :         grow_segments = find_shortest_rgdist(sdp, &rg_dist[0], &rg_dcnt[0]);
     548           16 :         for (i = 0; i < grow_segments; i++)
     549           12 :                 log_info(_("Segment %d: rgrp distance: 0x%"PRIx64", count: %d\n"),
     550              :                           i + 1, rg_dist[i], rg_dcnt[i]);
     551            4 :         number_of_rgs = segment_rgs = 0;
     552              :         /* -------------------------------------------------------------- */
     553              :         /* Now go through the RGs and verify their integrity, fixing as   */
     554              :         /* needed when corruption is encountered.                         */
     555              :         /* -------------------------------------------------------------- */
     556            4 :         prev_rgd = NULL;
     557            4 :         block_bump = rg_dist[0];
     558            4 :         blk = LGFS2_SB_ADDR(sdp) + 1;
     559          178 :         while (blk <= sdp->device.length) {
     560          176 :                 log_debug( _("Block 0x%"PRIx64"\n"), blk);
     561          176 :                 bh = lgfs2_bread(sdp, blk);
     562          176 :                 rg_was_fnd = (!lgfs2_check_meta(bh->b_data, GFS2_METATYPE_RG));
     563          176 :                 lgfs2_brelse(bh);
     564              :                 /* Allocate a new RG and index. */
     565          176 :                 calc_rgd = lgfs2_rgrp_insert(&rgcalc, blk);
     566          176 :                 if (!calc_rgd) {
     567            0 :                         log_crit( _("Can't allocate memory for rgrp repair.\n"));
     568            0 :                         goto out;
     569              :                 }
     570          176 :                 calc_rgd->rt_length = 1;
     571          176 :                 if (!rg_was_fnd) { /* if not an RG */
     572              :                         /* ------------------------------------------------- */
     573              :                         /* This SHOULD be an RG but isn't.                   */
     574              :                         /* ------------------------------------------------- */
     575           10 :                         corrupt_rgs++;
     576           10 :                         if (corrupt_rgs < 5)
     577            8 :                                 log_debug(_("Missing or damaged rgrp at block %"PRIu64" (0x%"PRIx64")\n"),
     578              :                                           blk, blk);
     579              :                         else {
     580            2 :                                 log_crit( _("Error: too many missing or "
     581              :                                             "damaged rgrps using this method. "
     582              :                                             "Time to try another method.\n"));
     583            2 :                                 goto out;
     584              :                         }
     585              :                 }
     586              :                 /* ------------------------------------------------ */
     587              :                 /* Now go through and count the bitmaps for this RG */
     588              :                 /* ------------------------------------------------ */
     589          830 :                 for (fwd_block = blk + 1; fwd_block < sdp->device.length; fwd_block++) {
     590              :                         int bitmap_was_fnd;
     591          830 :                         bh = lgfs2_bread(sdp, fwd_block);
     592          830 :                         bitmap_was_fnd = !lgfs2_check_meta(bh->b_data, GFS2_METATYPE_RB);
     593          830 :                         lgfs2_brelse(bh);
     594          830 :                         if (bitmap_was_fnd) /* if a bitmap */
     595          656 :                                 calc_rgd->rt_length++;
     596              :                         else
     597          174 :                                 break; /* end of bitmap, so call it quits. */
     598              :                 } /* for subsequent bitmaps */
     599              : 
     600          174 :                 calc_rgd->rt_data0 = calc_rgd->rt_addr +
     601          174 :                         calc_rgd->rt_length;
     602          174 :                 if (prev_rgd) {
     603              :                         uint32_t rgblocks;
     604              : 
     605          170 :                         prev_rgd->rt_length = lgfs2_rgblocks2bitblocks(sdp->sd_bsize, block_bump, &rgblocks);
     606          170 :                         prev_rgd->rt_data = rgblocks;
     607          170 :                         prev_rgd->rt_data0 = prev_rgd->rt_addr +
     608          170 :                                 prev_rgd->rt_length;
     609          170 :                         prev_rgd->rt_data -= prev_rgd->rt_data %
     610              :                                 GFS2_NBBY;
     611          170 :                         prev_rgd->rt_bitbytes = prev_rgd->rt_data /
     612              :                                 GFS2_NBBY;
     613          170 :                         log_debug(_("Prev ri_data set to: 0x%"PRIx32"\n"), prev_rgd->rt_data);
     614              :                 }
     615          174 :                 number_of_rgs++;
     616          174 :                 segment_rgs++;
     617          174 :                 if (rg_was_fnd)
     618          166 :                         log_info( _("  rgrp %d at block 0x%"PRIx64" intact\n"),
     619              :                                   number_of_rgs, blk);
     620              :                 else
     621            8 :                         log_warn( _("* rgrp %d at block 0x%"PRIx64" *** DAMAGED ***\n"),
     622              :                                   number_of_rgs, blk);
     623          174 :                 prev_rgd = calc_rgd;
     624              :                 /*
     625              :                  * Figure out where our next rgrp should be.
     626              :                  */
     627          174 :                 if ((blk == LGFS2_SB_ADDR(sdp) + 1) || (!gfs_grow)) {
     628           14 :                         block_bump = rg_dist[segment];
     629           14 :                         if (segment_rgs >= rg_dcnt[segment]) {
     630           14 :                                 log_debug(_("End of segment %d\n"), ++segment);
     631           14 :                                 segment_rgs = 0;
     632           14 :                                 if (segment >= grow_segments) {
     633            0 :                                         log_debug(_("Last segment.\n"));
     634            0 :                                         break;
     635              :                                 }
     636              :                         }
     637              :                         /* if we have uniformly-spaced rgrps, there may be
     638              :                            some wasted space at the end of the device.
     639              :                            Since we don't want to create a short rgrp and
     640              :                            break our uniformity, just quit here. */
     641           14 :                         if (blk + (2 * block_bump) > sdp->device.length)
     642            0 :                                 break;
     643          160 :                 } else if (rg_was_fnd)
     644          160 :                         block_bump = find_next_rgrp_dist(sdp, blk, prev_rgd);
     645              :                 else
     646            0 :                         block_bump = hunt_and_peck(sdp, blk, prev_rgd,
     647              :                                                    block_bump);
     648          174 :                 if (block_bump != 1) {
     649          174 :                         if (rg_was_fnd)
     650          166 :                                 log_info(_(" [length 0x%"PRIx64"]\n"), block_bump);
     651              :                         else
     652            8 :                                 log_warn(_(" [length 0x%"PRIx64"]\n"), block_bump);
     653              :                 } else {
     654            0 :                         log_warn("\n");
     655              :                 }
     656          174 :                 blk += block_bump;
     657              :         } /* for each rg block */
     658              :         /* ----------------------------------------------------------------- */
     659              :         /* If we got to the end of the fs, we still need to fix the          */
     660              :         /* allocation information for the very last RG.                      */
     661              :         /* ----------------------------------------------------------------- */
     662            2 :         if (prev_rgd && !prev_rgd->rt_data) {
     663              :                 uint32_t rgblocks;
     664              : 
     665            2 :                 prev_rgd->rt_length = lgfs2_rgblocks2bitblocks(sdp->sd_bsize, block_bump, &rgblocks);
     666            2 :                 prev_rgd->rt_data0 = prev_rgd->rt_addr + prev_rgd->rt_length;
     667            2 :                 prev_rgd->rt_data = rgblocks;
     668            2 :                 prev_rgd->rt_data -= prev_rgd->rt_data % GFS2_NBBY;
     669            2 :                 prev_rgd->rt_bitbytes = prev_rgd->rt_data / GFS2_NBBY;
     670            2 :                 log_debug(_("Prev ri_data set to: 0x%"PRIx32"\n"), prev_rgd->rt_data);
     671            2 :                 prev_rgd = NULL; /* make sure we don't use it later */
     672              :         }
     673              :         /* ---------------------------------------------- */
     674              :         /* Now dump out the information (if verbose mode) */      
     675              :         /* ---------------------------------------------- */
     676            2 :         log_debug( _("rindex rebuilt as follows:\n"));
     677          164 :         for (n = osi_first(&rgcalc), rgi = 0; n; n = next, rgi++) {
     678          162 :                 next = osi_next(n);
     679          162 :                 calc_rgd = (struct lgfs2_rgrp_tree *)n;
     680          162 :                 log_debug("%d: 0x%"PRIx64"/%"PRIx32"/0x%"PRIx64"/0x%"PRIx32"/0x%"PRIx32"\n",
     681              :                           rgi + 1, calc_rgd->rt_addr, calc_rgd->rt_length,
     682              :                           calc_rgd->rt_data0, calc_rgd->rt_data,
     683              :                           calc_rgd->rt_bitbytes);
     684              :         }
     685            2 :         *num_rgs = number_of_rgs;
     686            2 :         error = 0;
     687            4 : out:
     688            8 :         for (j = 0; j < sdp->md.journals; j++)
     689            4 :                 lgfs2_inode_put(&sdp->md.journal[j]);
     690            4 :         lgfs2_inode_put(&sdp->md.jiinode);
     691            4 :         free(sdp->md.journal);
     692            4 :         return error;
     693              : }
     694              : 
     695              : #define DIV_RU(x, y) (((x) + (y) - 1) / (y))
     696              : 
     697              : /**
     698              :  * how_many_rgrps - figure out how many RG to put in a subdevice
     699              :  * @w: the command line
     700              :  * @dev: the device
     701              :  *
     702              :  * Returns: the number of RGs
     703              :  */
     704           10 : static uint64_t how_many_rgrps(struct lgfs2_sbd *sdp, struct lgfs2_device *dev, unsigned rgsize)
     705              : {
     706              :         uint64_t n;
     707              :         uint32_t rgblocks1, rgblocksn, bitblocks1, bitblocksn;
     708              : 
     709              :         while (1) {
     710           10 :                 n = DIV_RU(dev->length, (rgsize << 20) / sdp->sd_bsize);
     711              : 
     712              :                 /* check to see if the rg length overflows max # bitblks */
     713           10 :                 bitblocksn = lgfs2_rgblocks2bitblocks(sdp->sd_bsize, dev->length / n, &rgblocksn);
     714              :                 /* calculate size of the first rgrp */
     715           10 :                 bitblocks1 = lgfs2_rgblocks2bitblocks(sdp->sd_bsize, dev->length - (n - 1) * (dev->length / n),
     716              :                                                 &rgblocks1);
     717           10 :                 if (bitblocks1 <= 2149 && bitblocksn <= 2149)
     718           10 :                         break;
     719              : 
     720            0 :                 rgsize -= LGFS2_DEFAULT_RGSIZE; /* smaller rgs */
     721              : 
     722            0 :                 if (rgsize < LGFS2_DEFAULT_RGSIZE) {
     723            0 :                         log_err(_("Cannot use the entire device with block size %u bytes.\n"),
     724              :                                 sdp->sd_bsize);
     725            0 :                         return 0;
     726              :                 }
     727              :         }
     728           10 :         log_debug("  rg sz = %"PRIu32"\n  nrgrp = %"PRIu64"\n", rgsize, n);
     729           10 :         return n;
     730              : }
     731              : 
     732              : /**
     733              :  * compute_rgrp_layout - figure out where the RG in a FS are
     734              :  */
     735            2 : static struct osi_root compute_rgrp_layout(struct lgfs2_sbd *sdp, unsigned rgsize)
     736              : {
     737              :         struct lgfs2_device *dev;
     738            2 :         struct lgfs2_rgrp_tree *rl, *rlast = NULL;
     739            2 :         unsigned int rgrp = 0, rglength;
     740            2 :         struct osi_root rgtree = {NULL};
     741              :         uint64_t rgaddr;
     742              : 
     743            2 :         dev = &sdp->device;
     744              : 
     745            2 :         dev->length -= LGFS2_SB_ADDR(sdp) + 1;
     746            2 :         nrgrp = how_many_rgrps(sdp, dev, rgsize);
     747            2 :         if (nrgrp == 0)
     748            0 :                 return (struct osi_root){NULL};
     749            2 :         rglength = dev->length / nrgrp;
     750              : 
     751         2562 :         for (; rgrp < nrgrp; rgrp++) {
     752         2560 :                 if (rgrp) {
     753         2558 :                         rgaddr = rlast->rt_addr + rlast->rt_skip;
     754         2558 :                         rl = lgfs2_rgrp_insert(&rgtree, rgaddr);
     755         2558 :                         rl->rt_skip = rglength;
     756              :                 } else {
     757            2 :                         rgaddr = LGFS2_SB_ADDR(sdp) + 1;
     758            2 :                         rl = lgfs2_rgrp_insert(&rgtree, rgaddr);
     759            2 :                         rl->rt_skip = dev->length -
     760            2 :                                 (nrgrp - 1) * (dev->length / nrgrp);
     761              :                 }
     762         2560 :                 rlast = rl;
     763              :         }
     764            2 :         return rgtree;
     765              : }
     766              : 
     767            2 : static int calc_rgrps(struct lgfs2_sbd *sdp)
     768              : {
     769            2 :         struct osi_node *n, *next = NULL;
     770              :         struct lgfs2_rgrp_tree *rl;
     771              :         uint32_t rgblocks, bitblocks;
     772              : 
     773         2562 :         for (n = osi_first(&rgcalc); n; n = next) {
     774         2560 :                 next = osi_next(n);
     775         2560 :                 rl = (struct lgfs2_rgrp_tree *)n;
     776              : 
     777         2560 :                 bitblocks = lgfs2_rgblocks2bitblocks(sdp->sd_bsize, rl->rt_skip, &rgblocks);
     778              : 
     779         2560 :                 rl->rt_length = bitblocks;
     780         2560 :                 rl->rt_data0 = rl->rt_addr + bitblocks;
     781         2560 :                 rl->rt_data = rgblocks;
     782         2560 :                 rl->rt_bitbytes = rgblocks / GFS2_NBBY;
     783         2560 :                 rl->rt_free = rgblocks;
     784              : 
     785         2560 :                 if (lgfs2_compute_bitstructs(sdp->sd_bsize, rl))
     786            0 :                         return -1;
     787              : 
     788         2560 :                 sdp->blks_total += rgblocks;
     789         2560 :                 sdp->fssize = rl->rt_data0 + rl->rt_data;
     790              :         }
     791            2 :         return 0;
     792              : }
     793              : 
     794              : /*
     795              :  * gfs2_rindex_calculate - calculate what the rindex should look like
     796              :  *                          in a perfect world (trust_lvl == OPEN_MINDED)
     797              :  *
     798              :  * Calculate what the rindex should look like, 
     799              :  * so we can later check if all RG index entries are sane.
     800              :  * This is a lot easier for gfs2 because we can just call the same libgfs2 
     801              :  * functions used by mkfs.
     802              :  *
     803              :  * Returns: 0 on success, -1 on failure
     804              :  * Sets:    sdp->rglist to a linked list of fsck_rgrp structs representing
     805              :  *          what we think the rindex should really look like.
     806              :  */
     807            2 : static int rindex_calculate(struct lgfs2_sbd *sdp, int *num_rgs)
     808              : {
     809            2 :         uint64_t num_rgrps = 0;
     810              :         unsigned rgsize;
     811              : 
     812              :         /* ----------------------------------------------------------------- */
     813              :         /* Calculate how many RGs there are supposed to be based on the      */
     814              :         /* rindex filesize.  Remember that our trust level is open-minded    */
     815              :         /* here.  If the filesize of the rindex file is not a multiple of    */
     816              :         /* our rindex structures, then something's wrong and we can't trust  */
     817              :         /* the index.                                                        */
     818              :         /* ----------------------------------------------------------------- */
     819            2 :         *num_rgs = sdp->md.riinode->i_size / sizeof(struct gfs2_rindex);
     820              : 
     821            2 :         rgcalc.osi_node = NULL;
     822            2 :         lgfs2_fix_device_geometry(sdp);
     823              : 
     824              :         /* Try all possible rgrp sizes: 2048, 1024, 512, 256, 128, 64, 32 */
     825           10 :         for (rgsize = LGFS2_DEFAULT_RGSIZE; rgsize >= 32; rgsize /= 2) {
     826            8 :                 num_rgrps = how_many_rgrps(sdp, &sdp->device, rgsize);
     827            8 :                 if (num_rgrps == *num_rgs) {
     828            0 :                         log_info(_("rgsize must be: %u (0x%x)\n"), rgsize, rgsize);
     829            0 :                         break;
     830              :                 }
     831              :         }
     832              :         /* Compute the default resource group layout as mkfs would have done */
     833            2 :         rgcalc = compute_rgrp_layout(sdp, rgsize);
     834            2 :         if (calc_rgrps(sdp)) { /* Calculate but don't write to disk. */
     835            0 :                 fprintf(stderr, _("Failed to build resource groups\n"));
     836            0 :                 exit(-1);
     837              :         }
     838            2 :         log_debug(_("fs_total_size = 0x%"PRIx64" blocks.\n"), sdp->device.length);
     839            2 :         log_warn( _("L3: number of rgs in the index = %d.\n"), *num_rgs);
     840            2 :         return 0;
     841              : }
     842              : 
     843              : /*
     844              :  * rewrite_rg_block - rewrite ("fix") a buffer with rg or bitmap data
     845              :  * returns: 0 if the rg was repaired, otherwise 1
     846              :  */
     847            4 : static int rewrite_rg_block(struct fsck_cx *cx, struct lgfs2_rgrp_tree *rg,
     848              :                             uint64_t errblock)
     849              : {
     850            4 :         struct lgfs2_sbd *sdp = cx->sdp;
     851            4 :         int x = errblock - rg->rt_addr;
     852            4 :         const char *typedesc = x ? "GFS2_METATYPE_RB" : "GFS2_METATYPE_RG";
     853              :         ssize_t ret;
     854              :         char *buf;
     855              : 
     856            4 :         log_err(_("Block #%"PRIu64" (0x%"PRIx64") (%d of %"PRIu32") is not %s.\n"),
     857              :                 rg->rt_addr + x, rg->rt_addr + x, x+1, rg->rt_length, typedesc);
     858            4 :         if (!query(cx, _("Fix the resource group? (y/n)")))
     859            0 :                 return 1;
     860              : 
     861            4 :         log_err(_("Attempting to repair the resource group.\n"));
     862              : 
     863            4 :         buf = calloc(1, sdp->sd_bsize);
     864            4 :         if (buf == NULL) {
     865            0 :                 log_err(_("Failed to allocate resource group block: %s"), strerror(errno));
     866            0 :                 return 1;
     867              :         }
     868            4 :         ret = pread(sdp->device_fd, buf, sdp->sd_bsize, errblock * sdp->sd_bsize);
     869            4 :         if (ret != sdp->sd_bsize) {
     870            0 :                 log_err(_("Failed to read resource group block %"PRIu64": %s\n"),
     871              :                         errblock, strerror(errno));
     872            0 :                 free(buf);
     873            0 :                 return 1;
     874              :         }
     875            4 :         if (x) {
     876            0 :                 struct gfs2_meta_header mh = {
     877            0 :                         .mh_magic = cpu_to_be32(GFS2_MAGIC),
     878            0 :                         .mh_type = cpu_to_be32(GFS2_METATYPE_RB),
     879            0 :                         .mh_format = cpu_to_be32(GFS2_FORMAT_RB)
     880              :                 };
     881            0 :                 memcpy(buf, &mh, sizeof(mh));
     882              :         } else {
     883            4 :                 rg->rt_free = rg->rt_data;
     884            4 :                 lgfs2_rgrp_out(rg, buf);
     885              :         }
     886            4 :         ret = pwrite(sdp->device_fd, buf, sdp->sd_bsize, errblock * sdp->sd_bsize);
     887            4 :         if (ret != sdp->sd_bsize) {
     888            0 :                 log_err(_("Failed to write resource group block %"PRIu64": %s\n"),
     889              :                         errblock, strerror(errno));
     890            0 :                 free(buf);
     891            0 :                 return 1;
     892              :         }
     893            4 :         free(buf);
     894            4 :         return 0;
     895              : }
     896              : 
     897              : /*
     898              :  * expect_rindex_sanity - the rindex file seems trustworthy, so use those
     899              :  *                        values as our expected values and assume the
     900              :  *                        damage is only to the rgrps themselves.
     901              :  */
     902            4 : static int expect_rindex_sanity(struct lgfs2_sbd *sdp, int *num_rgs)
     903              : {
     904            4 :         struct osi_node *n, *next = NULL;
     905              :         struct lgfs2_rgrp_tree *rgd, *exp;
     906              : 
     907            4 :         *num_rgs = sdp->md.riinode->i_size / sizeof(struct gfs2_rindex) ;
     908          188 :         for (n = osi_first(&sdp->rgtree); n; n = next) {
     909          184 :                 next = osi_next(n);
     910          184 :                 rgd = (struct lgfs2_rgrp_tree *)n;
     911          184 :                 exp = lgfs2_rgrp_insert(&rgcalc, rgd->rt_addr);
     912          184 :                 if (exp == NULL) {
     913            0 :                         fprintf(stderr, "Out of memory in %s\n", __FUNCTION__);
     914            0 :                         exit(-1);
     915              :                 }
     916          184 :                 exp->rt_data0 = rgd->rt_data0;
     917          184 :                 exp->rt_data = rgd->rt_data;
     918          184 :                 exp->rt_length = rgd->rt_length;
     919          184 :                 exp->rt_bitbytes = rgd->rt_bitbytes;
     920          184 :                 exp->rt_flags = rgd->rt_flags;
     921          184 :                 exp->rt_free = rgd->rt_free;
     922          184 :                 exp->rt_igeneration = rgd->rt_igeneration;
     923          184 :                 exp->rt_dinodes = rgd->rt_dinodes;
     924          184 :                 exp->rt_skip = rgd->rt_skip;
     925          184 :                 exp->rt_bits = NULL;
     926          184 :                 lgfs2_compute_bitstructs(sdp->sd_bsize, exp);
     927              :         }
     928            4 :         nrgrp = *num_rgs;
     929            4 :         return 0;
     930              : }
     931              : 
     932              : /*
     933              :  * rindex_repair - try to repair a damaged rg index (rindex)
     934              :  * trust_lvl - This is how much we trust the rindex file.
     935              :  *             BLIND_FAITH means we take the rindex at face value.
     936              :  *             OPEN_MINDED means it might be okay, but we should verify it.
     937              :  *             DISTRUST means it's not to be trusted, so we should go to
     938              :  *             greater lengths to build it from scratch.
     939              :  *             INDIGNATION means we have corruption, but the file system
     940              :  *             was converted from GFS via gfs2_convert, and its rgrps are
     941              :  *             not on nice boundaries thanks to previous gfs_grow ops. Lovely.
     942              :  */
     943           69 : int rindex_repair(struct fsck_cx *cx, int trust_lvl, int *ok)
     944              : {
     945           69 :         struct lgfs2_sbd *sdp = cx->sdp;
     946           69 :         struct osi_node *n, *next = NULL, *e, *enext;
     947              :         int error, discrepancies, percent;
     948           69 :         int calc_rg_count = 0, rg;
     949              :         struct gfs2_rindex buf;
     950              : 
     951           69 :         if (trust_lvl == BLIND_FAITH)
     952           57 :                 return 0;
     953           12 :         if (trust_lvl == YE_OF_LITTLE_FAITH) { /* if rindex seems sane */
     954              :                 /* Don't free previous incarnations in memory, if any.
     955              :                  * We need them to copy in the next function:
     956              :                  * lgfs2_rgrp_free(&sdp->rglist); */
     957            6 :                 if (!(*ok)) {
     958            2 :                         log_err(_("The rindex file does not meet our "
     959              :                                   "expectations.\n"));
     960            2 :                         return -1;
     961              :                 }
     962            4 :                 error = expect_rindex_sanity(sdp, &calc_rg_count);
     963            4 :                 if (error) {
     964            0 :                         lgfs2_rgrp_free(sdp, &rgcalc);
     965            0 :                         return error;
     966              :                 }
     967            6 :         } else if (trust_lvl == OPEN_MINDED) { /* If we can't trust RG index */
     968              :                 /* Free previous incarnations in memory, if any. */
     969            2 :                 lgfs2_rgrp_free(sdp, &sdp->rgtree);
     970              : 
     971              :                 /* Calculate our own RG index for comparison */
     972            2 :                 error = rindex_calculate(sdp, &calc_rg_count);
     973            2 :                 if (error) { /* If calculated RGs don't match the fs */
     974            0 :                         lgfs2_rgrp_free(sdp, &rgcalc);
     975            0 :                         return -1;
     976              :                 }
     977            4 :         } else if (trust_lvl == DISTRUST) { /* If we can't trust RG index */
     978              :                 /* Free previous incarnations in memory, if any. */
     979            2 :                 lgfs2_rgrp_free(sdp, &sdp->rgtree);
     980              : 
     981            2 :                 error = rindex_rebuild(cx, &calc_rg_count, 0);
     982            2 :                 if (error) {
     983            2 :                         log_crit( _("Error rebuilding rgrp list.\n"));
     984            2 :                         lgfs2_rgrp_free(sdp, &rgcalc);
     985            2 :                         return -1;
     986              :                 }
     987            2 :         } else if (trust_lvl == INDIGNATION) { /* If we can't trust anything */
     988              :                 /* Free previous incarnations in memory, if any. */
     989            2 :                 lgfs2_rgrp_free(sdp, &sdp->rgtree);
     990              : 
     991            2 :                 error = rindex_rebuild(cx, &calc_rg_count, 1);
     992            2 :                 if (error) {
     993            0 :                         log_crit( _("Error rebuilding rgrp list.\n"));
     994            0 :                         lgfs2_rgrp_free(sdp, &rgcalc);
     995            0 :                         return -1;
     996              :                 }
     997              :         }
     998              :         /* Read in the rindex */
     999            8 :         sdp->rgtree.osi_node = NULL; /* Just to be safe */
    1000            8 :         lgfs2_rindex_read(sdp, &nrgrp, ok);
    1001            8 :         if (sdp->md.riinode->i_size % sizeof(struct gfs2_rindex)) {
    1002            0 :                 log_warn( _("WARNING: rindex file has an invalid size.\n"));
    1003            0 :                 if (!query(cx, _("Truncate the rindex size? (y/n)"))) {
    1004            0 :                         log_err(_("The rindex was not repaired.\n"));
    1005            0 :                         lgfs2_rgrp_free(sdp, &rgcalc);
    1006            0 :                         lgfs2_rgrp_free(sdp, &sdp->rgtree);
    1007            0 :                         return -1;
    1008              :                 }
    1009            0 :                 sdp->md.riinode->i_size /= sizeof(struct gfs2_rindex);
    1010            0 :                 sdp->md.riinode->i_size *= sizeof(struct gfs2_rindex);
    1011            0 :                 lgfs2_bmodified(sdp->md.riinode->i_bh);
    1012            0 :                 log_err(_("Changing rindex size to %"PRIu64".\n"), sdp->md.riinode->i_size);
    1013              :         }
    1014            8 :         log_warn(_("L%d: number of rgs expected     = %"PRIu64".\n"), trust_lvl + 1, nrgrp);
    1015            8 :         if (calc_rg_count != nrgrp) {
    1016              :                 int most_that_fit;
    1017              : 
    1018            2 :                 log_warn( _("L%d: They don't match; either (1) the fs was "
    1019              :                             "extended, (2) an odd\n"), trust_lvl + 1);
    1020            2 :                 log_warn( _("L%d: rgrp size was used, or (3) we have a corrupt "
    1021              :                             "rg index.\n"), trust_lvl + 1);
    1022              :                 /* If the trust level is OPEN_MINDED, we would have calculated
    1023              :                    the rindex based on the device size. If it's not the same
    1024              :                    number, don't trust it. Complain about the discrepancy,
    1025              :                    then try again with a little more DISTRUST. */
    1026            3 :                 if ((trust_lvl < DISTRUST) ||
    1027            1 :                     !query(cx, _("Attempt to use what rgrps we can? (y/n)"))) {
    1028            1 :                         lgfs2_rgrp_free(sdp, &rgcalc);
    1029            1 :                         lgfs2_rgrp_free(sdp, &sdp->rgtree);
    1030            1 :                         log_err(_("The rindex was not repaired.\n"));
    1031            1 :                         return -1;
    1032              :                 }
    1033              :                 /* We cannot grow rindex at this point. Since pass1 has not
    1034              :                    yet run, we can't allocate blocks. Therefore we must use
    1035              :                    whatever will fix in the space given. */
    1036            1 :                 most_that_fit = sdp->md.riinode->i_size / sizeof(struct gfs2_rindex);
    1037            1 :                 log_debug(_("The most we can fit is %d rgrps\n"),
    1038              :                           most_that_fit);
    1039            1 :                 if (most_that_fit < calc_rg_count)
    1040            0 :                         calc_rg_count = most_that_fit;
    1041            1 :                 log_err(_("Attempting to fix rindex with %d rgrps.\n"),
    1042              :                         calc_rg_count);
    1043              :         }
    1044              :         /* ------------------------------------------------------------- */
    1045              :         /* Now compare the rindex to what we think it should be.         */
    1046              :         /* See how far off our expected values are.  If too much, abort. */
    1047              :         /* The theory is: if we calculated the index to have 32 RGs and  */
    1048              :         /* we have a large number that are completely wrong, we should   */
    1049              :         /* abandon this method of recovery and try a better one.         */
    1050              :         /* ------------------------------------------------------------- */
    1051            7 :         discrepancies = 0;
    1052            7 :         for (rg = 0, n = osi_first(&sdp->rgtree), e = osi_first(&rgcalc);
    1053          434 :              n && e && !fsck_abort && rg < calc_rg_count; rg++) {
    1054              :                 struct lgfs2_rgrp_tree *expected, *actual;
    1055              : 
    1056          427 :                 next = osi_next(n);
    1057          427 :                 enext = osi_next(e);
    1058              : 
    1059          427 :                 expected = (struct lgfs2_rgrp_tree *)e;
    1060          427 :                 actual = (struct lgfs2_rgrp_tree *)n;
    1061          427 :                 if (actual->rt_addr < expected->rt_addr) {
    1062            5 :                         n = next;
    1063            5 :                         discrepancies++;
    1064            5 :                         log_info(_("%d addr: 0x%"PRIx64" < 0x%"PRIx64" * mismatch\n"),
    1065              :                                  rg + 1, actual->rt_addr, expected->rt_addr);
    1066            5 :                         continue;
    1067          422 :                 } else if (expected->rt_addr < actual->rt_addr) {
    1068           76 :                         e = enext;
    1069           76 :                         discrepancies++;
    1070           76 :                         log_info(_("%d addr: 0x%"PRIx64" > 0x%"PRIx64" * mismatch\n"),
    1071              :                                  rg + 1, actual->rt_addr, expected->rt_addr);
    1072           76 :                         continue;
    1073              :                 }
    1074          346 :                 if (actual->rt_length != expected->rt_length ||
    1075          344 :                     actual->rt_data0 != expected->rt_data0 ||
    1076          344 :                     actual->rt_data != expected->rt_data ||
    1077          344 :                     actual->rt_bitbytes != expected->rt_bitbytes) {
    1078            2 :                         discrepancies++;
    1079            2 :                         log_info(_("%d addr: 0x%"PRIx64" 0x%"PRIx64" * has mismatch\n"),
    1080              :                                  rg + 1, actual->rt_addr, expected->rt_addr);
    1081              :                 }
    1082          346 :                 n = next;
    1083          346 :                 e = enext;
    1084              :         }
    1085            7 :         if (rg) {
    1086              :                 /* Check to see if more than 2% of the rgrps are wrong.  */
    1087            7 :                 percent = (discrepancies * 100) / rg;
    1088            7 :                 if (percent > BAD_RG_PERCENT_TOLERANCE) {
    1089            1 :                         log_warn( _("Level %d didn't work.  Too many "
    1090              :                                     "discrepancies.\n"), trust_lvl + 1);
    1091            1 :                         log_warn( _("%d out of %d rgrps (%d percent) did not "
    1092              :                                     "match what was expected.\n"),
    1093              :                                   discrepancies, rg, percent);
    1094            1 :                         lgfs2_rgrp_free(sdp, &rgcalc);
    1095            1 :                         lgfs2_rgrp_free(sdp, &sdp->rgtree);
    1096            1 :                         return -1;
    1097              :                 }
    1098              :         }
    1099            6 :         log_debug("Calculated %d rgrps: Total: %d Match: %d Mismatch: %d\n",
    1100              :                   calc_rg_count, rg, rg - discrepancies, discrepancies);
    1101              :         /* ------------------------------------------------------------- */
    1102              :         /* Now compare the rindex to what we think it should be.         */
    1103              :         /* Our rindex should be pretty predictable unless we've grown    */
    1104              :         /* so look for index problems first before looking at the rgs.   */
    1105              :         /* ------------------------------------------------------------- */
    1106            6 :         for (rg = 0, n = osi_first(&sdp->rgtree), e = osi_first(&rgcalc);
    1107          352 :              e && !fsck_abort && rg < calc_rg_count; rg++) {
    1108              :                 struct lgfs2_rgrp_tree *expected, *actual;
    1109              : 
    1110          346 :                 if (n)
    1111          346 :                         next = osi_next(n);
    1112          346 :                 enext = osi_next(e);
    1113          346 :                 expected = (struct lgfs2_rgrp_tree *)e;
    1114          346 :                 actual = (struct lgfs2_rgrp_tree *)n;
    1115              : 
    1116              :                 /* If the next "actual" rgrp in memory is too far away,
    1117              :                    fill in a new one with the expected value. -or-
    1118              :                    If we ran out of actual rindex entries due to rindex
    1119              :                    damage, fill in a new one with the expected values. */
    1120          346 :                 if (!n || /* end of actual rindex */
    1121          346 :                     expected->rt_addr < actual->rt_addr) {
    1122            1 :                         log_err(_("Entry missing from rindex: 0x%"PRIx64"\n"),
    1123              :                                 expected->rt_addr);
    1124            1 :                         actual = lgfs2_rgrp_insert(&sdp->rgtree, expected->rt_addr);
    1125            1 :                         if (!actual) {
    1126            0 :                                 log_err(_("Out of memory!\n"));
    1127            0 :                                 break;
    1128              :                         }
    1129            1 :                         rindex_modified = 1;
    1130            1 :                         next = n; /* Ensure that the old actual gets checked
    1131              :                                      against a new expected, since we added */
    1132              :                 } else {
    1133          345 :                         ri_compare(rg, actual, expected, rt_addr, PRIx64);
    1134          345 :                         ri_compare(rg, actual, expected, rt_length, PRIx32);
    1135          345 :                         ri_compare(rg, actual, expected, rt_data0, PRIx64);
    1136          345 :                         ri_compare(rg, actual, expected, rt_data, PRIx32);
    1137          345 :                         ri_compare(rg, actual, expected, rt_bitbytes, PRIx32);
    1138              :                 }
    1139              :                 /* If we modified the index, write it back to disk. */
    1140          346 :                 if (rindex_modified) {
    1141            2 :                         if (query(cx, _("Fix the index? (y/n)"))) {
    1142            2 :                                 lgfs2_rindex_out(expected, (char *)&buf);
    1143            2 :                                 lgfs2_writei(sdp->md.riinode, (char *)&buf,
    1144              :                                             rg * sizeof(struct gfs2_rindex),
    1145              :                                             sizeof(struct gfs2_rindex));
    1146            2 :                                 actual->rt_addr = expected->rt_addr;
    1147            2 :                                 actual->rt_length = expected->rt_length;
    1148            2 :                                 actual->rt_data0 = expected->rt_data0;
    1149            2 :                                 actual->rt_data = expected->rt_data;
    1150            2 :                                 actual->rt_bitbytes = expected->rt_bitbytes;
    1151              :                                 /* If our rindex was hosed, ri_length is bad */
    1152              :                                 /* Therefore, lgfs2_compute_bitstructs might  */
    1153              :                                 /* have malloced the wrong length for bitmap */
    1154              :                                 /* buffers.  So we have to redo it.          */
    1155            2 :                                 if (actual->rt_bits) {
    1156            0 :                                         free(actual->rt_bits);
    1157            0 :                                         actual->rt_bits = NULL;
    1158              :                                 }
    1159              :                         }
    1160              :                         else
    1161            0 :                                 log_err( _("rindex not fixed.\n"));
    1162            2 :                         lgfs2_compute_bitstructs(sdp->sd_bsize, actual);
    1163            2 :                         rindex_modified = 0;
    1164              :                 }
    1165          346 :                 e = enext;
    1166          346 :                 if (n)
    1167          346 :                         n = next;
    1168              :         }
    1169              :         /* ------------------------------------------------------------- */
    1170              :         /* Read the real RGs and check their integrity.                  */
    1171              :         /* Now we can somewhat trust the rindex and the RG addresses,    */
    1172              :         /* so let's read them in, check them and optionally fix them.    */
    1173              :         /* ------------------------------------------------------------- */
    1174          352 :         for (rg = 0, n = osi_first(&sdp->rgtree); n && !fsck_abort &&
    1175          692 :                      rg < calc_rg_count; n = next, rg++) {
    1176              :                 struct lgfs2_rgrp_tree *rgd;
    1177          346 :                 uint64_t prev_err = 0, errblock;
    1178              :                 int i;
    1179              : 
    1180          346 :                 next = osi_next(n);
    1181              :                 /* Now we try repeatedly to read in the rg.  For every block */
    1182              :                 /* we encounter that has errors, repair it and try again.    */
    1183          346 :                 i = 0;
    1184              :                 do {
    1185          350 :                         rgd = (struct lgfs2_rgrp_tree *)n;
    1186          350 :                         errblock = lgfs2_rgrp_read(sdp, rgd);
    1187          350 :                         if (errblock) {
    1188            4 :                                 if (errblock == prev_err)
    1189            0 :                                         break;
    1190            4 :                                 prev_err = errblock;
    1191            4 :                                 rewrite_rg_block(cx, rgd, errblock);
    1192              :                         } else {
    1193          346 :                                 lgfs2_rgrp_relse(sdp, rgd);
    1194          346 :                                 break;
    1195              :                         }
    1196            4 :                         i++;
    1197            4 :                 } while (i < rgd->rt_length);
    1198              :         }
    1199            6 :         lgfs2_rgrp_free(sdp, &rgcalc);
    1200            6 :         lgfs2_rgrp_free(sdp, &sdp->rgtree);
    1201              :         /* We shouldn't need to worry about getting the user's permission to
    1202              :            make changes here. If b_modified is true, they already gave their
    1203              :            permission. */
    1204            6 :         if (sdp->md.riinode->i_bh->b_modified) {
    1205            0 :                 log_debug("Syncing rindex inode changes to disk.\n");
    1206            0 :                 lgfs2_dinode_out(sdp->md.riinode, sdp->md.riinode->i_bh->b_data);
    1207            0 :                 lgfs2_bwrite(sdp->md.riinode->i_bh);
    1208              :         }
    1209            6 :         return 0;
    1210              : }
        

Generated by: LCOV version 2.0-1