Commit 69c9bb01 authored by Piotr Pelplinski's avatar Piotr Pelplinski Committed by Ben Walker
Browse files

blobstore: move xattr serialization to separate function

parent c287b5b4
Loading
Loading
Loading
Loading
+56 −37
Original line number Diff line number Diff line
@@ -591,42 +591,21 @@ _spdk_blob_serialize_flags(const struct spdk_blob_data *blob,
}

static int
_spdk_blob_serialize(const struct spdk_blob_data *blob, struct spdk_blob_md_page **pages,
		     uint32_t *page_count)
_spdk_blob_serialize_xattrs(const struct spdk_blob_data *blob,
			    const struct spdk_xattr_tailq *xattrs,
			    struct spdk_blob_md_page **pages,
			    struct spdk_blob_md_page *cur_page,
			    uint32_t *page_count, uint8_t **buf,
			    size_t *remaining_sz)
{
	struct spdk_blob_md_page		*cur_page;
	const struct spdk_xattr	*xattr;
	int	rc;
	uint8_t					*buf;
	size_t					remaining_sz;
	uint64_t				last_cluster;

	assert(pages != NULL);
	assert(page_count != NULL);
	assert(blob != NULL);
	assert(blob->state == SPDK_BLOB_STATE_SYNCING);

	*pages = NULL;
	*page_count = 0;

	/* A blob always has at least 1 page, even if it has no descriptors */
	rc = _spdk_blob_serialize_add_page(blob, pages, page_count, &cur_page);
	if (rc < 0) {
		return rc;
	}

	buf = (uint8_t *)cur_page->descriptors;
	remaining_sz = sizeof(cur_page->descriptors);

	/* Serialize flags */
	_spdk_blob_serialize_flags(blob, buf, &remaining_sz);
	buf += sizeof(struct spdk_blob_md_descriptor_flags);

	/* Serialize xattrs */
	TAILQ_FOREACH(xattr, &blob->xattrs, link) {
	TAILQ_FOREACH(xattr, xattrs, link) {
		size_t required_sz = 0;

		rc = _spdk_blob_serialize_xattr(xattr,
						buf, remaining_sz,
						*buf, *remaining_sz,
						&required_sz);
		if (rc < 0) {
			/* Need to add a new page to the chain */
@@ -639,13 +618,13 @@ _spdk_blob_serialize(const struct spdk_blob_data *blob, struct spdk_blob_md_page
				return rc;
			}

			buf = (uint8_t *)cur_page->descriptors;
			remaining_sz = sizeof(cur_page->descriptors);
			*buf = (uint8_t *)cur_page->descriptors;
			*remaining_sz = sizeof(cur_page->descriptors);

			/* Try again */
			required_sz = 0;
			rc = _spdk_blob_serialize_xattr(xattr,
							buf, remaining_sz,
							*buf, *remaining_sz,
							&required_sz);

			if (rc < 0) {
@@ -656,10 +635,50 @@ _spdk_blob_serialize(const struct spdk_blob_data *blob, struct spdk_blob_md_page
			}
		}

		remaining_sz -= required_sz;
		buf += required_sz;
		*remaining_sz -= required_sz;
		*buf += required_sz;
	}

	return 0;
}

static int
_spdk_blob_serialize(const struct spdk_blob_data *blob, struct spdk_blob_md_page **pages,
		     uint32_t *page_count)
{
	struct spdk_blob_md_page		*cur_page;
	int 					rc;
	uint8_t					*buf;
	size_t					remaining_sz;
	uint64_t				last_cluster;

	assert(pages != NULL);
	assert(page_count != NULL);
	assert(blob != NULL);
	assert(blob->state == SPDK_BLOB_STATE_SYNCING);

	*pages = NULL;
	*page_count = 0;

	/* A blob always has at least 1 page, even if it has no descriptors */
	rc = _spdk_blob_serialize_add_page(blob, pages, page_count, &cur_page);
	if (rc < 0) {
		return rc;
	}

	buf = (uint8_t *)cur_page->descriptors;
	remaining_sz = sizeof(cur_page->descriptors);

	/* Serialize flags */
	_spdk_blob_serialize_flags(blob, buf, &remaining_sz);
	buf += sizeof(struct spdk_blob_md_descriptor_flags);

	/* Serialize xattrs */
	rc = _spdk_blob_serialize_xattrs(blob, &blob->xattrs,
					 pages, cur_page, page_count, &buf, &remaining_sz);
	if (rc < 0) {
		return rc;
	}
	/* Serialize extents */
	last_cluster = 0;
	while (last_cluster < blob->active.num_clusters) {
+1 −1
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ struct spdk_blob_data {
	/* TODO: The xattrs are mutable, but we don't want to be
	 * copying them unecessarily. Figure this out.
	 */
	TAILQ_HEAD(, spdk_xattr) xattrs;
	TAILQ_HEAD(spdk_xattr_tailq, spdk_xattr) xattrs;

	TAILQ_ENTRY(spdk_blob_data) link;
};