This field is the difference between the block address of a rgrp and the next one. Includes a test to check the rg_skip field against the rindex.
Signed-off-by: Andrew Price <[email protected]> --- gfs2/libgfs2/libgfs2.h | 2 +- gfs2/libgfs2/rgrp.c | 10 +++++++--- gfs2/mkfs/main_grow.c | 9 ++++++--- gfs2/mkfs/main_mkfs.c | 9 +++++---- tests/check_rgrp.c | 2 +- tests/mkfs.at | 16 ++++++++++++++++ tests/rgskipcheck.sh | 19 +++++++++++++++++++ 7 files changed, 55 insertions(+), 12 deletions(-) create mode 100755 tests/rgskipcheck.sh diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h index 2e29d332..50dc3f56 100644 --- a/gfs2/libgfs2/libgfs2.h +++ b/gfs2/libgfs2/libgfs2.h @@ -202,7 +202,7 @@ extern uint64_t lgfs2_rgrp_align_addr(const lgfs2_rgrps_t rgs, uint64_t addr); extern uint32_t lgfs2_rgrp_align_len(const lgfs2_rgrps_t rgs, uint32_t len); extern unsigned lgfs2_rgsize_for_data(uint64_t blksreq, unsigned bsize); extern uint32_t lgfs2_rgrps_plan(const lgfs2_rgrps_t rgs, uint64_t space, uint32_t tgtsize); -extern lgfs2_rgrp_t lgfs2_rgrps_append(lgfs2_rgrps_t rgs, struct gfs2_rindex *entry); +extern lgfs2_rgrp_t lgfs2_rgrps_append(lgfs2_rgrps_t rgs, struct gfs2_rindex *entry, uint32_t rg_skip); extern int lgfs2_rgrp_bitbuf_alloc(lgfs2_rgrp_t rg); extern void lgfs2_rgrp_bitbuf_free(lgfs2_rgrp_t rg); extern int lgfs2_rgrp_write(int fd, lgfs2_rgrp_t rg); diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c index bb0776aa..4a2b1973 100644 --- a/gfs2/libgfs2/rgrp.c +++ b/gfs2/libgfs2/rgrp.c @@ -430,7 +430,7 @@ unsigned lgfs2_rindex_read_fd(int fd, lgfs2_rgrps_t rgs) return 0; gfs2_rindex_in(&ri, buf); - rg = lgfs2_rgrps_append(rgs, &ri); + rg = lgfs2_rgrps_append(rgs, &ri, 0); if (rg == NULL) return 0; count++; @@ -463,7 +463,7 @@ const struct gfs2_rindex *lgfs2_rindex_read_one(struct gfs2_inode *rip, lgfs2_rg return NULL; gfs2_rindex_in(&ri, buf); - rg = lgfs2_rgrps_append(rgs, &ri); + rg = lgfs2_rgrps_append(rgs, &ri, 0); if (rg == NULL) return NULL; @@ -582,9 +582,10 @@ struct osi_node *lgfs2_rgrps_root(lgfs2_rgrps_t rgs) * Insert a new resource group after the last resource group in a set. * rgs: The set of resource groups * entry: The entry to be added + * rg_skip: The value to be used for this resource group's rg_skip field * Returns the new resource group on success or NULL on failure with errno set. */ -lgfs2_rgrp_t lgfs2_rgrps_append(lgfs2_rgrps_t rgs, struct gfs2_rindex *entry) +lgfs2_rgrp_t lgfs2_rgrps_append(lgfs2_rgrps_t rgs, struct gfs2_rindex *entry, uint32_t rg_skip) { lgfs2_rgrp_t rg; struct osi_node **link = &rgs->root.osi_node; @@ -615,6 +616,9 @@ lgfs2_rgrp_t lgfs2_rgrps_append(lgfs2_rgrps_t rgs, struct gfs2_rindex *entry) rg->rg.rg_header.mh_type = GFS2_METATYPE_RG; rg->rg.rg_header.mh_format = GFS2_FORMAT_RG; rg->rg.rg_free = rg->ri.ri_data; +#ifdef GFS2_HAS_RG_SKIP + rg->rg.rg_skip = rg_skip; +#endif compute_bitmaps(rg, rgs->sdp->bsize); rg->rgrps = rgs; diff --git a/gfs2/mkfs/main_grow.c b/gfs2/mkfs/main_grow.c index dbee4bc6..ad80a8d9 100644 --- a/gfs2/mkfs/main_grow.c +++ b/gfs2/mkfs/main_grow.c @@ -213,14 +213,17 @@ static unsigned initialize_new_portion(struct gfs2_sbd *sdp, lgfs2_rgrps_t rgs) int err = 0; lgfs2_rgrp_t rg; struct gfs2_rindex ri; - rgaddr = lgfs2_rindex_entry_new(rgs, &ri, rgaddr, 0); - if (rgaddr == 0) + uint64_t nextaddr; + + nextaddr = lgfs2_rindex_entry_new(rgs, &ri, rgaddr, 0); + if (nextaddr == 0) break; - rg = lgfs2_rgrps_append(rgs, &ri); + rg = lgfs2_rgrps_append(rgs, &ri, nextaddr - rgaddr); if (rg == NULL) { perror(_("Failed to create resource group")); return 0; } + rgaddr = nextaddr; if (metafs_interrupted) return 0; if (!test) diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c index 3b774115..54ff2db6 100644 --- a/gfs2/mkfs/main_mkfs.c +++ b/gfs2/mkfs/main_mkfs.c @@ -685,11 +685,12 @@ static int place_rgrp(struct gfs2_sbd *sdp, lgfs2_rgrp_t rg, int debug) static int add_rgrp(lgfs2_rgrps_t rgs, uint64_t *addr, uint32_t len, lgfs2_rgrp_t *rg) { struct gfs2_rindex ri; + uint64_t nextaddr; /* When we get to the end of the device, it's only an error if we have more structures left to write, i.e. when len is != 0. */ - *addr = lgfs2_rindex_entry_new(rgs, &ri, *addr, len); - if (*addr == 0) { + nextaddr = lgfs2_rindex_entry_new(rgs, &ri, *addr, len); + if (nextaddr == 0) { if (len != 0) { perror(_("Failed to create resource group index entry")); return -1; @@ -697,12 +698,12 @@ static int add_rgrp(lgfs2_rgrps_t rgs, uint64_t *addr, uint32_t len, lgfs2_rgrp_ return 1; } } - - *rg = lgfs2_rgrps_append(rgs, &ri); + *rg = lgfs2_rgrps_append(rgs, &ri, nextaddr - *addr); if (*rg == NULL) { perror(_("Failed to create resource group")); return -1; } + *addr = nextaddr; return 0; } diff --git a/tests/check_rgrp.c b/tests/check_rgrp.c index ce22c387..0360d3c8 100644 --- a/tests/check_rgrp.c +++ b/tests/check_rgrp.c @@ -31,7 +31,7 @@ static lgfs2_rgrps_t mockup_rgrp(void) addr = lgfs2_rindex_entry_new(rgs, &ri, 16, rgsize); ck_assert(addr != 0); - rg = lgfs2_rgrps_append(rgs, &ri); + rg = lgfs2_rgrps_append(rgs, &ri, 0); fail_unless(rg != NULL); for (i = 0; i < rg->ri.ri_length; i++) { diff --git a/tests/mkfs.at b/tests/mkfs.at index 274a81db..b90d55e2 100644 --- a/tests/mkfs.at +++ b/tests/mkfs.at @@ -123,3 +123,19 @@ AT_CHECK([$GFS_MKFS -p lock_nolock -o test_topology=0:512:65536:393216:512 $GFS_ # Check rgrp alignment to minimum_io_size: 65536 / 4096 == 16 AT_CHECK([gfs2_edit -p rindex $GFS_TGT | grep ri_addr | awk '{print $2, $2 % 16; if ($2 % 16 != 0) { exit 1 }}'], 0, [ignore], [ignore]) AT_CLEANUP + +AT_SETUP([Values of rg_skip]) +AT_KEYWORDS(mkfs.gfs2 mkfs) +AT_CHECK([$GFS_MKFS -p lock_nolock -r 2048 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([rgskipcheck.sh $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -r 1024 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([rgskipcheck.sh $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -r 512 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([rgskipcheck.sh $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -r 219 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([rgskipcheck.sh $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -r 32 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([rgskipcheck.sh $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -o test_topology=0:512:65536:393216:512 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([rgskipcheck.sh $GFS_TGT], 0, [ignore], [ignore]) +AT_CLEANUP diff --git a/tests/rgskipcheck.sh b/tests/rgskipcheck.sh new file mode 100755 index 00000000..4a8f93fe --- /dev/null +++ b/tests/rgskipcheck.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +dev=$1 +rgcount=$(gfs2_edit -p rgcount $dev | cut -f1 -d' ') +prevaddr=$(gfs2_edit -p rg 0 $dev | grep ^RG | awk '{print $5}') +prevskip=0 +for i in `seq 0 $(($rgcount - 1))`; do + addr=$(gfs2_edit -p rg $i $dev | grep ^RG | awk '{print $5}') + expected=$(($addr - $prevaddr)) + + if test $prevskip != $expected; then + echo "Bad rg_skip in rg $(($i - 1)): $prevskip (expected: $expected)" >&2 + exit 1 + fi + + prevskip=$(gfs2_edit -p rg $i $dev | grep rg_skip | awk '{print $2}') + prevaddr=$addr +done + -- 2.13.6
