static struct ext4_xattr_item *
ext4_xattr_insert_item(struct ext4_xattr_ref *xattr_ref, uint8_t name_index,
const char *name, size_t name_len, const void *data,
- size_t data_size)
+ size_t data_size,
+ int *err)
{
struct ext4_xattr_item *item;
item = ext4_xattr_item_alloc(name_index, name, name_len);
- if (!item)
+ if (!item) {
+ if (err)
+ *err = ENOMEM;
+
return NULL;
+ }
if ((xattr_ref->ea_size + EXT4_XATTR_SIZE(data_size) +
EXT4_XATTR_LEN(item->name_len)
sizeof(struct ext4_xattr_header))) {
ext4_xattr_item_free(item);
+ if (err)
+ *err = ENOSPC;
+
return NULL;
}
item->in_inode = true;
(int32_t)EXT4_XATTR_LEN(item->name_len) < 0) {
if (xattr_ref->block_size_rem -
(int32_t)EXT4_XATTR_SIZE(data_size) -
- (int32_t)EXT4_XATTR_LEN(item->name_len) < 0)
+ (int32_t)EXT4_XATTR_LEN(item->name_len) < 0) {
+ if (err)
+ *err = ENOSPC;
+
return NULL;
+ }
item->in_inode = false;
}
if (ext4_xattr_item_alloc_data(item, data, data_size) != EOK) {
ext4_xattr_item_free(item);
+ if (err)
+ *err = ENOMEM;
+
return NULL;
}
RB_INSERT(ext4_xattr_tree, &xattr_ref->root, item);
EXT4_XATTR_LEN(item->name_len);
}
xattr_ref->dirty = true;
+ if (err)
+ *err = EOK;
+
return item;
}
goto Finish;
}
item = ext4_xattr_insert_item(ref, name_index, name, name_len,
- data, data_size);
- if (!item)
- ret = ENOMEM;
+ data, data_size, &ret);
}
Finish:
return ret;