Commit 79457c51 authored by Piotr Pelplinski's avatar Piotr Pelplinski Committed by Ben Walker
Browse files

blobstore: separate deserializing xattrs to common function

parent 1dab20c2
Loading
Loading
Loading
Loading
+45 −34
Original line number Diff line number Diff line
@@ -232,6 +232,47 @@ _spdk_blob_mark_clean(struct spdk_blob_data *blob)
	return 0;
}

static int
_spdk_blob_deserialize_xattr(struct spdk_blob_data *blob,
			     struct spdk_blob_md_descriptor_xattr *desc_xattr)
{
	struct spdk_xattr                       *xattr;

	if (desc_xattr->length != sizeof(desc_xattr->name_length) +
	    sizeof(desc_xattr->value_length) +
	    desc_xattr->name_length + desc_xattr->value_length) {
		return -EINVAL;
	}

	xattr = calloc(1, sizeof(*xattr));
	if (xattr == NULL) {
		return -ENOMEM;
	}

	xattr->name = malloc(desc_xattr->name_length + 1);
	if (xattr->name == NULL) {
		free(xattr);
		return -ENOMEM;
	}
	strncpy(xattr->name, desc_xattr->name, desc_xattr->name_length);
	xattr->name[desc_xattr->name_length] = '\0';

	xattr->value = malloc(desc_xattr->value_length);
	if (xattr->value == NULL) {
		free(xattr->name);
		free(xattr);
		return -ENOMEM;
	}
	xattr->value_len = desc_xattr->value_length;
	memcpy(xattr->value,
	       (void *)((uintptr_t)desc_xattr->name + desc_xattr->name_length),
	       desc_xattr->value_length);

	TAILQ_INSERT_TAIL(&blob->xattrs, xattr, link);
	return 0;
}


static int
_spdk_blob_parse_page(const struct spdk_blob_md_page *page, struct spdk_blob_data *blob)
{
@@ -326,42 +367,12 @@ _spdk_blob_parse_page(const struct spdk_blob_md_page *page, struct spdk_blob_dat
			}

		} else if (desc->type == SPDK_MD_DESCRIPTOR_TYPE_XATTR) {
			struct spdk_blob_md_descriptor_xattr	*desc_xattr;
			struct spdk_xattr 			*xattr;

			desc_xattr = (struct spdk_blob_md_descriptor_xattr *)desc;

			if (desc_xattr->length != sizeof(desc_xattr->name_length) +
			    sizeof(desc_xattr->value_length) +
			    desc_xattr->name_length + desc_xattr->value_length) {
				return -EINVAL;
			}

			xattr = calloc(1, sizeof(*xattr));
			if (xattr == NULL) {
				return -ENOMEM;
			}

			xattr->name = malloc(desc_xattr->name_length + 1);
			if (xattr->name == NULL) {
				free(xattr);
				return -ENOMEM;
			}
			strncpy(xattr->name, desc_xattr->name, desc_xattr->name_length);
			xattr->name[desc_xattr->name_length] = '\0';
			int rc;

			xattr->value = malloc(desc_xattr->value_length);
			if (xattr->value == NULL) {
				free(xattr->name);
				free(xattr);
				return -ENOMEM;
			rc = _spdk_blob_deserialize_xattr(blob, (struct spdk_blob_md_descriptor_xattr *) desc);
			if (rc != 0) {
				return rc;
			}
			xattr->value_len = desc_xattr->value_length;
			memcpy(xattr->value,
			       (void *)((uintptr_t)desc_xattr->name + desc_xattr->name_length),
			       desc_xattr->value_length);

			TAILQ_INSERT_TAIL(&blob->xattrs, xattr, link);
		} else {
			/* Unrecognized descriptor type.  Do not fail - just continue to the
			 *  next descriptor.  If this descriptor is associated with some feature