|
Packit Service |
360c39 |
#include "clusterautoconfig.h"
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
#include <unistd.h>
|
|
Packit Service |
360c39 |
#include <inttypes.h>
|
|
Packit Service |
360c39 |
#include <stdio.h>
|
|
Packit Service |
360c39 |
#include <stdint.h>
|
|
Packit Service |
360c39 |
#include <stdlib.h>
|
|
Packit Service |
360c39 |
#include <string.h>
|
|
Packit Service |
360c39 |
#include <errno.h>
|
|
Packit Service |
360c39 |
#include <fcntl.h>
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
#include "libgfs2.h"
|
|
Packit Service |
360c39 |
#include "osi_list.h"
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/**
|
|
Packit Service |
360c39 |
* check_sb - Check superblock
|
|
Packit Service |
360c39 |
* @sb: The superblock
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Checks the version code of the FS is one that we understand how to
|
|
Packit Service |
360c39 |
* read and that the sizes of the various on-disk structures have not
|
|
Packit Service |
360c39 |
* changed.
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Returns: -1 on failure, 1 if this is gfs (gfs1), 2 if this is gfs2
|
|
Packit Service |
360c39 |
*/
|
|
Packit Service |
360c39 |
int check_sb(struct gfs2_sb *sb)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
if (sb->sb_header.mh_magic != GFS2_MAGIC ||
|
|
Packit Service |
360c39 |
sb->sb_header.mh_type != GFS2_METATYPE_SB) {
|
|
Packit Service |
360c39 |
errno = EIO;
|
|
Packit Service |
360c39 |
return -1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
if (sb->sb_fs_format == GFS_FORMAT_FS &&
|
|
Packit Service |
360c39 |
sb->sb_header.mh_format == GFS_FORMAT_SB &&
|
|
Packit Service |
360c39 |
sb->sb_multihost_format == GFS_FORMAT_MULTI) {
|
|
Packit Service |
360c39 |
return 1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
return 2;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/*
|
|
Packit Service |
360c39 |
* read_sb: read the super block from disk
|
|
Packit Service |
360c39 |
* sdp: in-core super block
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* This function reads in the super block from disk and
|
|
Packit Service |
360c39 |
* initializes various constants maintained in the super
|
|
Packit Service |
360c39 |
* block
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Returns: 0 on success, -1 on failure
|
|
Packit Service |
360c39 |
* sdp->gfs1 will be set if this is gfs (gfs1)
|
|
Packit Service |
360c39 |
*/
|
|
Packit Service |
360c39 |
int read_sb(struct gfs2_sbd *sdp)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
struct gfs2_buffer_head *bh;
|
|
Packit Service |
360c39 |
uint64_t space = 0;
|
|
Packit Service |
360c39 |
unsigned int x;
|
|
Packit Service |
360c39 |
int ret;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
bh = bread(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift);
|
|
Packit Service |
360c39 |
gfs2_sb_in(&sdp->sd_sb, bh->b_data);
|
|
Packit Service |
360c39 |
brelse(bh);
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
ret = check_sb(&sdp->sd_sb);
|
|
Packit Service |
360c39 |
if (ret < 0)
|
|
Packit Service |
360c39 |
return ret;
|
|
Packit Service |
360c39 |
if (ret == 1)
|
|
Packit Service |
360c39 |
sdp->gfs1 = 1;
|
|
Packit Service |
360c39 |
sdp->sd_fsb2bb_shift = sdp->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT;
|
|
Packit Service |
360c39 |
sdp->bsize = sdp->sd_sb.sb_bsize;
|
|
Packit Service |
360c39 |
if (sdp->bsize < 512 || sdp->bsize != (sdp->bsize & -sdp->bsize)) {
|
|
Packit Service |
360c39 |
return -1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
if (sdp->gfs1) {
|
|
Packit Service |
360c39 |
sdp->sd_diptrs = (sdp->sd_sb.sb_bsize -
|
|
Packit Service |
360c39 |
sizeof(struct gfs_dinode)) /
|
|
Packit Service |
360c39 |
sizeof(uint64_t);
|
|
Packit Service |
360c39 |
sdp->sd_inptrs = (sdp->sd_sb.sb_bsize -
|
|
Packit Service |
360c39 |
sizeof(struct gfs_indirect)) /
|
|
Packit Service |
360c39 |
sizeof(uint64_t);
|
|
Packit Service |
360c39 |
} else {
|
|
Packit Service |
360c39 |
sdp->sd_diptrs = (sdp->sd_sb.sb_bsize -
|
|
Packit Service |
360c39 |
sizeof(struct gfs2_dinode)) /
|
|
Packit Service |
360c39 |
sizeof(uint64_t);
|
|
Packit Service |
360c39 |
sdp->sd_inptrs = (sdp->sd_sb.sb_bsize -
|
|
Packit Service |
360c39 |
sizeof(struct gfs2_meta_header)) /
|
|
Packit Service |
360c39 |
sizeof(uint64_t);
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
sdp->sd_jbsize = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header);
|
|
Packit Service |
360c39 |
sdp->sd_hash_bsize = sdp->bsize / 2;
|
|
Packit Service |
360c39 |
sdp->sd_hash_bsize_shift = sdp->sd_sb.sb_bsize_shift - 1;
|
|
Packit Service |
360c39 |
sdp->sd_hash_ptrs = sdp->sd_hash_bsize / sizeof(uint64_t);
|
|
Packit Service |
360c39 |
sdp->sd_heightsize[0] = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode);
|
|
Packit Service |
360c39 |
sdp->sd_heightsize[1] = sdp->sd_sb.sb_bsize * sdp->sd_diptrs;
|
|
Packit Service |
360c39 |
for (x = 2; x < GFS2_MAX_META_HEIGHT; x++){
|
|
Packit Service |
360c39 |
space = sdp->sd_heightsize[x - 1] * sdp->sd_inptrs;
|
|
Packit Service |
360c39 |
/* FIXME: Do we really need this first check?? */
|
|
Packit Service |
360c39 |
if (space / sdp->sd_inptrs != sdp->sd_heightsize[x - 1] ||
|
|
Packit Service |
360c39 |
space % sdp->sd_inptrs != 0)
|
|
Packit Service |
360c39 |
break;
|
|
Packit Service |
360c39 |
sdp->sd_heightsize[x] = space;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
if (x > GFS2_MAX_META_HEIGHT){
|
|
Packit Service |
360c39 |
errno = E2BIG;
|
|
Packit Service |
360c39 |
return -1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
sdp->sd_jheightsize[0] = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode);
|
|
Packit Service |
360c39 |
sdp->sd_jheightsize[1] = sdp->sd_jbsize * sdp->sd_diptrs;
|
|
Packit Service |
360c39 |
for (x = 2; ; x++){
|
|
Packit Service |
360c39 |
space = sdp->sd_jheightsize[x - 1] * sdp->sd_inptrs;
|
|
Packit Service |
360c39 |
if (space / sdp->sd_inptrs != sdp->sd_jheightsize[x - 1] ||
|
|
Packit Service |
360c39 |
space % sdp->sd_inptrs != 0)
|
|
Packit Service |
360c39 |
break;
|
|
Packit Service |
360c39 |
sdp->sd_jheightsize[x] = space;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
sdp->sd_max_jheight = x;
|
|
Packit Service |
360c39 |
if(sdp->sd_max_jheight > GFS2_MAX_META_HEIGHT) {
|
|
Packit Service |
360c39 |
errno = E2BIG;
|
|
Packit Service |
360c39 |
return -1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
sdp->fssize = lseek(sdp->device_fd, 0, SEEK_END) / sdp->sd_sb.sb_bsize;
|
|
Packit Service |
360c39 |
sdp->sd_blocks_per_bitmap = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header))
|
|
Packit Service |
360c39 |
* GFS2_NBBY;
|
|
Packit Service |
360c39 |
sdp->qcsize = GFS2_DEFAULT_QCSIZE;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/* rgd_seems_sane - check some general things about the rindex entry
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* If rg lengths are not consistent, it's not sane (or it's converted from
|
|
Packit Service |
360c39 |
* gfs1). The first RG will be a different length due to space reserved for
|
|
Packit Service |
360c39 |
* the superblock, so we can't detect this until we check rgrp 3, when we
|
|
Packit Service |
360c39 |
* can compare the distance between rgrp 1 and rgrp 2.
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Returns: 1 if the rgd seems relatively sane
|
|
Packit Service |
360c39 |
*/
|
|
Packit Service |
360c39 |
static int rgd_seems_sane(struct gfs2_sbd *sdp, struct rgrp_tree *rgd)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
uint32_t most_bitmaps_possible;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/* rg length must be at least 1 */
|
|
Packit Service |
360c39 |
if (rgd->ri.ri_length == 0)
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/* A max rgrp, 2GB, divided into blocksize, divided by blocks/byte
|
|
Packit Service |
360c39 |
represented in the bitmap, NBBY. Rough approximation only, due to
|
|
Packit Service |
360c39 |
metadata headers. I'm doing the math this way to avoid overflow. */
|
|
Packit Service |
360c39 |
most_bitmaps_possible = (GFS2_MAX_RGSIZE * 1024 * 256) / sdp->bsize;
|
|
Packit Service |
360c39 |
if (rgd->ri.ri_length > most_bitmaps_possible)
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
if (rgd->ri.ri_data0 != rgd->ri.ri_addr + rgd->ri.ri_length)
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
if (rgd->ri.ri_bitbytes != rgd->ri.ri_data / GFS2_NBBY)
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
return 1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/* good_on_disk - check if the rindex points to what looks like an rgrp on disk
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* This is only called when the rindex pointers aren't spaced evenly, which
|
|
Packit Service |
360c39 |
* isn't often. The rindex is pointing to an unexpected location, so we
|
|
Packit Service |
360c39 |
* check if the block it is pointing to is really an rgrp. If so, we count the
|
|
Packit Service |
360c39 |
* rindex entry as "sane" (after all, it did pass the previous checks above.)
|
|
Packit Service |
360c39 |
* If not, we count it as not sane, and therefore, the whole rindex is not to
|
|
Packit Service |
360c39 |
* be trusted by fsck.gfs2.
|
|
Packit Service |
360c39 |
*/
|
|
Packit Service |
360c39 |
static int good_on_disk(struct gfs2_sbd *sdp, struct rgrp_tree *rgd)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
struct gfs2_buffer_head *bh;
|
|
Packit Service |
360c39 |
int is_rgrp;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
bh = bread(sdp, rgd->ri.ri_addr);
|
|
Packit Service |
360c39 |
is_rgrp = (gfs2_check_meta(bh, GFS2_METATYPE_RG) == 0);
|
|
Packit Service |
360c39 |
brelse(bh);
|
|
Packit Service |
360c39 |
return is_rgrp;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/**
|
|
Packit Service |
360c39 |
* rindex_read - read in the rg index file
|
|
Packit Service |
360c39 |
* @sdp: the incore superblock pointer
|
|
Packit Service |
360c39 |
* fd: optional file handle for rindex file (if meta_fs file system is mounted)
|
|
Packit Service |
360c39 |
* (if fd is <= zero, it will read from raw device)
|
|
Packit Service |
360c39 |
* @count1: return count of the rgs.
|
|
Packit Service |
360c39 |
* @sane: return whether rindex is consistent
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Returns: 0 on success, -1 on failure
|
|
Packit Service |
360c39 |
*/
|
|
Packit Service |
360c39 |
int rindex_read(struct gfs2_sbd *sdp, int fd, uint64_t *count1, int *sane)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
unsigned int rg;
|
|
Packit Service |
360c39 |
int error;
|
|
Packit Service |
360c39 |
union {
|
|
Packit Service |
360c39 |
struct gfs2_rindex bufgfs2;
|
|
Packit Service |
360c39 |
} buf;
|
|
Packit Service |
360c39 |
struct gfs2_rindex ri;
|
|
Packit Service |
360c39 |
struct rgrp_tree *rgd = NULL, *prev_rgd = NULL;
|
|
Packit Service |
360c39 |
uint64_t prev_length = 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
*sane = 1;
|
|
Packit Service |
360c39 |
*count1 = 0;
|
|
Packit Service |
360c39 |
if (!fd && sdp->md.riinode->i_di.di_size % sizeof(struct gfs2_rindex))
|
|
Packit Service |
360c39 |
*sane = 0; /* rindex file size must be a multiple of 96 */
|
|
Packit Service |
360c39 |
for (rg = 0; ; rg++) {
|
|
Packit Service |
360c39 |
if (fd > 0)
|
|
Packit Service |
360c39 |
error = read(fd, &buf, sizeof(struct gfs2_rindex));
|
|
Packit Service |
360c39 |
else
|
|
Packit Service |
360c39 |
error = gfs2_readi(sdp->md.riinode,
|
|
Packit Service |
360c39 |
(char *)&buf.bufgfs2,
|
|
Packit Service |
360c39 |
rg * sizeof(struct gfs2_rindex),
|
|
Packit Service |
360c39 |
sizeof(struct gfs2_rindex));
|
|
Packit Service |
360c39 |
if (!error)
|
|
Packit Service |
360c39 |
break;
|
|
Packit Service |
360c39 |
if (error != sizeof(struct gfs2_rindex))
|
|
Packit Service |
360c39 |
return -1;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
gfs2_rindex_in(&ri, (char *)&buf.bufgfs2);
|
|
Packit Service |
360c39 |
if (gfs2_check_range(sdp, ri.ri_addr) != 0) {
|
|
Packit Service |
360c39 |
*sane = 0;
|
|
Packit Service |
360c39 |
if (prev_rgd == NULL)
|
|
Packit Service |
360c39 |
continue;
|
|
Packit Service |
360c39 |
ri.ri_addr = prev_rgd->ri.ri_addr + prev_rgd->length;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
rgd = rgrp_insert(&sdp->rgtree, ri.ri_addr);
|
|
Packit Service |
360c39 |
memcpy(&rgd->ri, &ri, sizeof(struct gfs2_rindex));
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
rgd->start = rgd->ri.ri_addr;
|
|
Packit Service |
360c39 |
if (prev_rgd) {
|
|
Packit Service |
360c39 |
/* If rg addresses go backwards, it's not sane
|
|
Packit Service |
360c39 |
(or it's converted from gfs1). */
|
|
Packit Service |
360c39 |
if (!sdp->gfs1) {
|
|
Packit Service |
360c39 |
if (prev_rgd->start >= rgd->start)
|
|
Packit Service |
360c39 |
*sane = 0;
|
|
Packit Service |
360c39 |
else if (!rgd_seems_sane(sdp, rgd))
|
|
Packit Service |
360c39 |
*sane = 0;
|
|
Packit Service |
360c39 |
else if (*sane && rg > 2 && prev_length &&
|
|
Packit Service |
360c39 |
prev_length != rgd->start -
|
|
Packit Service |
360c39 |
prev_rgd->start)
|
|
Packit Service |
360c39 |
*sane = good_on_disk(sdp, rgd);
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
prev_length = rgd->start - prev_rgd->start;
|
|
Packit Service |
360c39 |
prev_rgd->length = rgrp_size(prev_rgd);
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
if(gfs2_compute_bitstructs(sdp->sd_sb.sb_bsize, rgd))
|
|
Packit Service |
360c39 |
*sane = 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
(*count1)++;
|
|
Packit Service |
360c39 |
prev_rgd = rgd;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
if (prev_rgd)
|
|
Packit Service |
360c39 |
prev_rgd->length = rgrp_size(prev_rgd);
|
|
Packit Service |
360c39 |
if (*count1 == 0)
|
|
Packit Service |
360c39 |
return -1;
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
#define RA_WINDOW 32
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
static unsigned gfs2_rgrp_reada(struct gfs2_sbd *sdp, unsigned cur_window,
|
|
Packit Service |
360c39 |
struct osi_node *n)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
struct rgrp_tree *rgd;
|
|
Packit Service |
360c39 |
unsigned i;
|
|
Packit Service |
360c39 |
off_t start, len;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
for (i = 0; i < RA_WINDOW; i++, n = osi_next(n)) {
|
|
Packit Service |
360c39 |
if (n == NULL)
|
|
Packit Service |
360c39 |
return i;
|
|
Packit Service |
360c39 |
if (i < cur_window)
|
|
Packit Service |
360c39 |
continue;
|
|
Packit Service |
360c39 |
rgd = (struct rgrp_tree *)n;
|
|
Packit Service |
360c39 |
start = rgd->ri.ri_addr * sdp->bsize;
|
|
Packit Service |
360c39 |
len = rgd->ri.ri_length * sdp->bsize;
|
|
Packit Service |
360c39 |
posix_fadvise(sdp->device_fd, start, len, POSIX_FADV_WILLNEED);
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
return i;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/**
|
|
Packit Service |
360c39 |
* ri_update - attach rgrps to the super block
|
|
Packit Service |
360c39 |
* @sdp: incore superblock data
|
|
Packit Service |
360c39 |
* fd: optional file handle for rindex (through the meta_fs)
|
|
Packit Service |
360c39 |
* @rgcount: returned count of rgs
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Given the rgrp index inode, link in all rgrps into the super block
|
|
Packit Service |
360c39 |
* and be sure that they can be read.
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Returns: 0 on success, -1 on failure.
|
|
Packit Service |
360c39 |
*/
|
|
Packit Service |
360c39 |
static int __ri_update(struct gfs2_sbd *sdp, int fd, int *rgcount, int *sane,
|
|
Packit Service |
360c39 |
int quiet)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
struct rgrp_tree *rgd;
|
|
Packit Service |
360c39 |
struct gfs2_rindex *ri;
|
|
Packit Service |
360c39 |
uint64_t count1 = 0, count2 = 0;
|
|
Packit Service |
360c39 |
uint64_t errblock = 0;
|
|
Packit Service |
360c39 |
uint64_t rmax = 0;
|
|
Packit Service |
360c39 |
struct osi_node *n, *next = NULL;
|
|
Packit Service |
360c39 |
unsigned ra_window = 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/* Turn off generic readhead */
|
|
Packit Service |
360c39 |
posix_fadvise(sdp->device_fd, 0, 0, POSIX_FADV_RANDOM);
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
if (rindex_read(sdp, fd, &count1, sane))
|
|
Packit Service |
360c39 |
goto fail;
|
|
Packit Service |
360c39 |
for (n = osi_first(&sdp->rgtree); n; n = next) {
|
|
Packit Service |
360c39 |
next = osi_next(n);
|
|
Packit Service |
360c39 |
rgd = (struct rgrp_tree *)n;
|
|
Packit Service |
360c39 |
/* Readahead resource group headers */
|
|
Packit Service |
360c39 |
if (ra_window < RA_WINDOW/2)
|
|
Packit Service |
360c39 |
ra_window = gfs2_rgrp_reada(sdp, ra_window, n);
|
|
Packit Service |
360c39 |
/* Read resource group header */
|
|
Packit Service |
360c39 |
errblock = gfs2_rgrp_read(sdp, rgd);
|
|
Packit Service |
360c39 |
if (errblock)
|
|
Packit Service |
360c39 |
return errblock;
|
|
Packit Service |
360c39 |
ra_window--;
|
|
Packit Service |
360c39 |
count2++;
|
|
Packit Service |
360c39 |
if (!quiet && count2 % 100 == 0) {
|
|
Packit Service |
360c39 |
printf(".");
|
|
Packit Service |
360c39 |
fflush(stdout);
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
ri = &rgd->ri;
|
|
Packit Service |
360c39 |
if (ri->ri_data0 + ri->ri_data - 1 > rmax)
|
|
Packit Service |
360c39 |
rmax = ri->ri_data0 + ri->ri_data - 1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
sdp->fssize = rmax;
|
|
Packit Service |
360c39 |
*rgcount = count1;
|
|
Packit Service |
360c39 |
if (count1 != count2)
|
|
Packit Service |
360c39 |
goto fail;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
posix_fadvise(sdp->device_fd, 0, 0, POSIX_FADV_NORMAL);
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
fail:
|
|
Packit Service |
360c39 |
posix_fadvise(sdp->device_fd, 0, 0, POSIX_FADV_NORMAL);
|
|
Packit Service |
360c39 |
gfs2_rgrp_free(&sdp->rgtree);
|
|
Packit Service |
360c39 |
return -1;
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
int ri_update(struct gfs2_sbd *sdp, int fd, int *rgcount, int *sane)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
return __ri_update(sdp, fd, rgcount, sane, 1);
|
|
Packit Service |
360c39 |
}
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
/**
|
|
Packit Service |
360c39 |
* gfs1_ri_update - attach rgrps to the super block
|
|
Packit Service |
360c39 |
* Stolen from libgfs2/super.c, but modified to handle gfs1.
|
|
Packit Service |
360c39 |
* @sdp:
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Given the rgrp index inode, link in all rgrps into the super block
|
|
Packit Service |
360c39 |
* and be sure that they can be read.
|
|
Packit Service |
360c39 |
*
|
|
Packit Service |
360c39 |
* Returns: 0 on success, -1 on failure.
|
|
Packit Service |
360c39 |
*/
|
|
Packit Service |
360c39 |
int gfs1_ri_update(struct gfs2_sbd *sdp, int fd, int *rgcount, int quiet)
|
|
Packit Service |
360c39 |
{
|
|
Packit Service |
360c39 |
int sane;
|
|
Packit Service |
360c39 |
|
|
Packit Service |
360c39 |
return __ri_update(sdp, fd, rgcount, &sane, quiet);
|
|
Packit Service |
360c39 |
}
|