[Cluster-devel] [PATCH 3/3] gfs2l: Switch to lgfs2_field_assign

Andrew Price anprice at redhat.com
Tue Oct 7 12:14:55 UTC 2014


The new lgfs2_field_assign function was based on code in gfs2l, which
can now be converted to use the new libgfs2 functions.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/libgfs2/lang.c | 78 ++++++++++++++++-------------------------------------
 gfs2/libgfs2/meta.c |  6 ++++-
 2 files changed, 28 insertions(+), 56 deletions(-)

diff --git a/gfs2/libgfs2/lang.c b/gfs2/libgfs2/lang.c
index b4a743f..13333a1 100644
--- a/gfs2/libgfs2/lang.c
+++ b/gfs2/libgfs2/lang.c
@@ -471,7 +471,7 @@ invalid:
 static int ast_field_set(struct gfs2_buffer_head *bh, const struct lgfs2_metafield *field,
                                                                         struct ast_node *val)
 {
-	char *fieldp = (char *)bh->iov.iov_base + field->offset;
+	int err = 0;
 
 	if (field->flags & LGFS2_MFF_UUID) {
 		uint8_t uuid[16];
@@ -479,56 +479,21 @@ static int ast_field_set(struct gfs2_buffer_head *bh, const struct lgfs2_metafie
 
 		if (ret != AST_INTERP_SUCCESS)
 			return ret;
-
-		memcpy(fieldp, uuid, 16);
-		bmodified(bh);
-		return AST_INTERP_SUCCESS;
+		err = lgfs2_field_assign(bh->b_data, field, uuid);
+	} else if (field->flags & LGFS2_MFF_STRING) {
+		err = lgfs2_field_assign(bh->b_data, field, val->ast_str);
+	} else {
+		err = lgfs2_field_assign(bh->b_data, field, &val->ast_num);
 	}
 
-	if ((field->flags & LGFS2_MFF_STRING) && strlen(val->ast_str) > field->length) {
-		fprintf(stderr, "String '%s' is too long for field '%s'\n", val->ast_str, field->name);
+	if (err) {
+		fprintf(stderr, "Invalid field assignment: %s (size %d) = %s\n",
+	                field->name, field->length, val->ast_text);
 		return AST_INTERP_INVAL;
 	}
 
-	if (field->flags & (LGFS2_MFF_STRING|LGFS2_MFF_UUID)) {
-		strncpy(fieldp, val->ast_str, field->length - 1);
-		fieldp[field->length - 1] = '\0';
-		bmodified(bh);
-		return AST_INTERP_SUCCESS;
-	} else {
-		// Numeric fields
-		switch(field->length) {
-		case 1:
-			if (val->ast_num > UINT8_MAX)
-				break;
-			*fieldp = (uint8_t)val->ast_num;
-			bmodified(bh);
-			return AST_INTERP_SUCCESS;
-		case 2:
-			if (val->ast_num > UINT16_MAX)
-				break;
-			*(uint16_t *)fieldp = cpu_to_be16((uint16_t)val->ast_num);
-			bmodified(bh);
-			return AST_INTERP_SUCCESS;
-		case 4:
-			if (val->ast_num > UINT32_MAX)
-				break;
-			*(uint32_t *)fieldp = cpu_to_be32((uint32_t)val->ast_num);
-			bmodified(bh);
-			return AST_INTERP_SUCCESS;
-		case 8:
-			*(uint64_t *)fieldp = cpu_to_be64((uint64_t)val->ast_num);
-			bmodified(bh);
-			return AST_INTERP_SUCCESS;
-		default:
-			// This should never happen
-			return AST_INTERP_ERR;
-		}
-	}
-
-	fprintf(stderr, "Invalid field assignment: %s (size %d) = %s\n",
-	                     field->name, field->length, val->ast_text);
-	return AST_INTERP_INVAL;
+	bmodified(bh);
+	return AST_INTERP_SUCCESS;
 }
 
 static const struct lgfs2_metadata *lang_find_mtype(struct ast_node *node, struct gfs2_buffer_head *bh, unsigned ver)
@@ -558,7 +523,6 @@ static struct lgfs2_lang_result *ast_interp_set(struct lgfs2_lang_state *state,
 	struct ast_node *fieldspec;
 	struct ast_node *fieldname;
 	struct ast_node *fieldval;
-	int i = 0;
 	int ret = 0;
 	unsigned ver = sbd->gfs1 ? LGFS2_MD_GFS1 : LGFS2_MD_GFS2;
 
@@ -592,17 +556,21 @@ static struct lgfs2_lang_result *ast_interp_set(struct lgfs2_lang_state *state,
 	for (fieldspec = lookup->ast_right;
 	     fieldspec != NULL && fieldspec->ast_type == AST_EX_FIELDSPEC;
 	     fieldspec = fieldspec->ast_left) {
+		const struct lgfs2_metafield *mfield;
 
 		fieldname = fieldspec->ast_right;
 		fieldval = fieldname->ast_right;
-		for (i = 0; i < result->lr_mtype->nfields; i++) {
-			if (!strcmp(result->lr_mtype->fields[i].name, fieldname->ast_str)) {
-				ret = ast_field_set(result->lr_bh, &result->lr_mtype->fields[i], fieldval);
-				if (ret != AST_INTERP_SUCCESS) {
-					goto out_err;
-				}
-				break;
-			}
+
+		mfield = lgfs2_find_mfield_name(fieldname->ast_str, result->lr_mtype);
+		if (mfield == NULL) {
+			fprintf(stderr, "No field '%s' found in '%s'\n",
+			        fieldname->ast_str, result->lr_mtype->name);
+			goto out_err;
+		}
+
+		ret = ast_field_set(result->lr_bh, mfield, fieldval);
+		if (ret != AST_INTERP_SUCCESS) {
+			goto out_err;
 		}
 	}
 
diff --git a/gfs2/libgfs2/meta.c b/gfs2/libgfs2/meta.c
index f0eed3d..79de64d 100644
--- a/gfs2/libgfs2/meta.c
+++ b/gfs2/libgfs2/meta.c
@@ -901,7 +901,12 @@ int lgfs2_field_assign(char *blk, const struct lgfs2_metafield *field, const voi
 		return 0;
 	}
 
+	errno = EINVAL;
 	if (field->flags & LGFS2_MFF_STRING) {
+		size_t len = strnlen(val, field->length);
+
+		if (len >= field->length)
+			return 1;
 		strncpy(fieldp, val, field->length - 1);
 		fieldp[field->length - 1] = '\0';
 		return 0;
@@ -925,6 +930,5 @@ int lgfs2_field_assign(char *blk, const struct lgfs2_metafield *field, const voi
 		break;
 	}
 
-	errno = EINVAL;
 	return 1;
 }
-- 
1.9.3




More information about the Cluster-devel mailing list