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

Reply via email to