+ memset(hdr->data + len, 0, -len & 7); /* pad to next 8-byte boundary */
+ return hdr->data;
+}
+
+/*
+ * Add a tagged item containing the specified data to the specified inode, first
+ * removing any existing items with the same tag. Returns %true if successful,
+ * %false if failed (out of memory).
+ */
+bool
+inode_set_tagged_data(struct wim_inode *inode, u32 tag,
+ const void *data, u32 len)
+{
+ u8 *p;
+ u32 old_len;
+
+ /* Remove any existing items with the same tag */
+ while ((p = inode_get_tagged_item(inode, tag, 0, &old_len)) != NULL) {
+ p -= sizeof(struct tagged_item_header);
+ old_len += sizeof(struct tagged_item_header);
+ old_len = ALIGN(old_len, 8);
+ memmove(p, p + old_len, (inode->i_extra->data +
+ inode->i_extra->size) - (p + old_len));
+ inode->i_extra->size -= old_len;
+ }
+
+ /* Add the new item */
+ p = inode_add_tagged_item(inode, tag, len);
+ if (!p)
+ return false;
+ memcpy(p, data, len);
+ return true;