gfs2-utils: master - libgfs2: Introduce struct lgfs2_rbm
Andrew Price
andyp at fedoraproject.org
Fri Sep 5 13:39:22 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=9ac311967c3208d1f482628ebfbf38e2c7651229
Commit: 9ac311967c3208d1f482628ebfbf38e2c7651229
Parent: 04aa942a2e4967974869d845be6b12850a210928
Author: Andrew Price <anprice at redhat.com>
AuthorDate: Fri Jun 13 15:45:07 2014 +0100
Committer: Andrew Price <anprice at redhat.com>
CommitterDate: Mon Sep 1 11:26:05 2014 +0100
libgfs2: Introduce struct lgfs2_rbm
Add struct lgfs2_rbm, which is similar to struct gfs2_rbm in the kernel,
in order to support the coming work on extent allocation in libgfs2.
This structure and its supporting functions are added to a new private
header file rather than libgfs2.h until we have reason to export it.
Signed-off-by: Andrew Price <anprice at redhat.com>
---
gfs2/libgfs2/Makefile.am | 2 +-
gfs2/libgfs2/rgrp.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++
gfs2/libgfs2/rgrp.h | 29 ++++++++++++++++++++
3 files changed, 97 insertions(+), 1 deletions(-)
diff --git a/gfs2/libgfs2/Makefile.am b/gfs2/libgfs2/Makefile.am
index 4af27be..1ce8c13 100644
--- a/gfs2/libgfs2/Makefile.am
+++ b/gfs2/libgfs2/Makefile.am
@@ -5,7 +5,7 @@ BUILT_SOURCES = parser.h lexer.h
AM_LFLAGS = --header-file=lexer.h
AM_YFLAGS = -d
-noinst_HEADERS = libgfs2.h lang.h config.h
+noinst_HEADERS = libgfs2.h lang.h config.h rgrp.h
noinst_LTLIBRARIES = libgfs2.la
diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c
index 56b73ae..dd8811b 100644
--- a/gfs2/libgfs2/rgrp.c
+++ b/gfs2/libgfs2/rgrp.c
@@ -1,12 +1,14 @@
#include "clusterautoconfig.h"
#include <inttypes.h>
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "libgfs2.h"
+#include "rgrp.h"
#define RG_SYNC_TOLERANCE 1000
@@ -589,3 +591,68 @@ lgfs2_rgrp_t lgfs2_rgrp_last(lgfs2_rgrps_t rgs)
{
return (lgfs2_rgrp_t)osi_last(&rgs->root);
}
+
+/**
+ * gfs2_rbm_from_block - Set the rbm based upon rgd and block number
+ * @rbm: The rbm with rgd already set correctly
+ * @block: The block number (filesystem relative)
+ *
+ * This sets the bi and offset members of an rbm based on a
+ * resource group and a filesystem relative block number. The
+ * resource group must be set in the rbm on entry, the bi and
+ * offset members will be set by this function.
+ *
+ * Returns: 0 on success, or non-zero with errno set
+ */
+static int lgfs2_rbm_from_block(struct lgfs2_rbm *rbm, uint64_t block)
+{
+ uint64_t rblock = block - rbm->rgd->ri.ri_data0;
+ struct gfs2_sbd *sdp = rbm_bi(rbm)->bi_bh->sdp;
+
+ if (rblock > UINT_MAX) {
+ errno = EINVAL;
+ return 1;
+ }
+ if (block >= rbm->rgd->ri.ri_data0 + rbm->rgd->ri.ri_data) {
+ errno = E2BIG;
+ return 1;
+ }
+
+ rbm->bii = 0;
+ rbm->offset = (uint32_t)(rblock);
+ /* Check if the block is within the first block */
+ if (rbm->offset < (rbm_bi(rbm)->bi_len * GFS2_NBBY))
+ return 0;
+
+ /* Adjust for the size diff between gfs2_meta_header and gfs2_rgrp */
+ rbm->offset += (sizeof(struct gfs2_rgrp) -
+ sizeof(struct gfs2_meta_header)) * GFS2_NBBY;
+ rbm->bii = rbm->offset / sdp->sd_blocks_per_bitmap;
+ rbm->offset -= rbm->bii * sdp->sd_blocks_per_bitmap;
+ return 0;
+}
+
+/**
+ * lgfs2_rbm_incr - increment an rbm structure
+ * @rbm: The rbm with rgd already set correctly
+ *
+ * This function takes an existing rbm structure and increments it to the next
+ * viable block offset.
+ *
+ * Returns: If incrementing the offset would cause the rbm to go past the
+ * end of the rgrp, true is returned, otherwise false.
+ *
+ */
+static int lgfs2_rbm_incr(struct lgfs2_rbm *rbm)
+{
+ if (rbm->offset + 1 < (rbm_bi(rbm)->bi_len * GFS2_NBBY)) { /* in the same bitmap */
+ rbm->offset++;
+ return 0;
+ }
+ if (rbm->bii == rbm->rgd->ri.ri_length - 1) /* at the last bitmap */
+ return 1;
+
+ rbm->offset = 0;
+ rbm->bii++;
+ return 0;
+}
diff --git a/gfs2/libgfs2/rgrp.h b/gfs2/libgfs2/rgrp.h
new file mode 100644
index 0000000..99c52d3
--- /dev/null
+++ b/gfs2/libgfs2/rgrp.h
@@ -0,0 +1,29 @@
+#ifndef __RGRP_DOT_H__
+#define __RGRP_DOT_H__
+
+#include "libgfs2.h"
+
+struct lgfs2_rbm {
+ lgfs2_rgrp_t rgd;
+ uint32_t offset; /* The offset is bitmap relative */
+ unsigned bii; /* Bitmap index */
+};
+
+static inline struct gfs2_bitmap *rbm_bi(const struct lgfs2_rbm *rbm)
+{
+ return rbm->rgd->bits + rbm->bii;
+}
+
+static inline uint64_t lgfs2_rbm_to_block(const struct lgfs2_rbm *rbm)
+{
+ return rbm->rgd->ri.ri_data0 + (rbm_bi(rbm)->bi_start * GFS2_NBBY) +
+ rbm->offset;
+}
+
+static inline int lgfs2_rbm_eq(const struct lgfs2_rbm *rbm1, const struct lgfs2_rbm *rbm2)
+{
+ return (rbm1->rgd == rbm2->rgd) && (rbm1->bii == rbm2->bii) &&
+ (rbm1->offset == rbm2->offset);
+}
+
+#endif /* __RGRP_DOT_H__ */
More information about the cluster-commits
mailing list