[Cluster-devel] [PATCH 4/8] mkfs.gfs2: Set the rg_skip field in new rgrps
Andrew Price
anprice at redhat.com
Thu Dec 7 11:53:35 UTC 2017
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 <anprice at redhat.com>
---
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
More information about the Cluster-devel
mailing list