diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-07-21 15:24:38 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-07-21 15:44:02 +0200 |
commit | 73db760b3fd2d3f2ff9186deb86589fdc36f2542 (patch) | |
tree | f0f75f2f9953a9028e4f8b77c65cb8a657c794d9 | |
parent | 53bb1720f0603b185d71cc3db1194d9bf16fdbe2 (diff) |
Cleanup xattr handling
- Store them in a struct instead of a hacky uint64_t with magic shifts
- Split up key/value pair write function to write_key and write_value
- Move the size accounting into those functions respectively
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | include/fstree.h | 8 | ||||
-rw-r--r-- | lib/fstree/xattr.c | 20 | ||||
-rw-r--r-- | lib/sqfs/write_xattr.c | 24 |
3 files changed, 31 insertions, 21 deletions
diff --git a/include/fstree.h b/include/fstree.h index ea7cf88..4efa9d5 100644 --- a/include/fstree.h +++ b/include/fstree.h @@ -46,9 +46,11 @@ struct tree_xattr_t { /* linked list pointer of list of attributes in @ref fstree_t */ tree_xattr_t *next; - /* Array with pairs of key-value tupples. - Each key-value tupple is encoded as (key << 32) | value. */ - uint64_t ref[]; + /* Array with pairs of key-value tupples */ + struct { + uint32_t key_index; + uint32_t value_index; + } attr[]; }; /* Additional meta data stored in a tree_node_t for regular files. */ diff --git a/lib/fstree/xattr.c b/lib/fstree/xattr.c index 4597d9d..2ce39f4 100644 --- a/lib/fstree/xattr.c +++ b/lib/fstree/xattr.c @@ -87,17 +87,15 @@ int fstree_add_xattr(fstree_t *fs, tree_node_t *node, fs->xattr = xattr; } - xattr->ref[xattr->num_attr] = (uint64_t)key_idx << 32; - xattr->ref[xattr->num_attr] |= (uint64_t)value_idx; + xattr->attr[xattr->num_attr].key_index = key_idx; + xattr->attr[xattr->num_attr].value_index = value_idx; xattr->num_attr += 1; return 0; } -static int cmp_u64(const void *lhs, const void *rhs) +static int cmp_attr(const void *lhs, const void *rhs) { - uint64_t l = *((uint64_t *)lhs), r = *((uint64_t *)rhs); - - return l < r ? -1 : (l > r ? 1 : 0); + return memcmp(lhs, rhs, sizeof(((tree_xattr_t *)0)->attr[0])); } void fstree_xattr_reindex(fstree_t *fs) @@ -113,8 +111,8 @@ void fstree_xattr_reindex(fstree_t *fs) it->index = index++; for (i = 0; i < it->num_attr; ++i) { - key_idx = (it->ref[i] >> 32) & 0x00000000FFFFFFFF; - value_idx = it->ref[i] & 0x00000000FFFFFFFF; + key_idx = it->attr[i].key_index; + value_idx = it->attr[i].value_index; str_table_add_ref(&fs->xattr_keys, key_idx); str_table_add_ref(&fs->xattr_values, value_idx); @@ -128,7 +126,7 @@ void fstree_xattr_deduplicate(fstree_t *fs) int diff; for (it = fs->xattr; it != NULL; it = it->next) - qsort(it->ref, it->num_attr, sizeof(it->ref[0]), cmp_u64); + qsort(it->attr, it->num_attr, sizeof(it->attr[0]), cmp_attr); prev = NULL; it = fs->xattr; @@ -138,8 +136,8 @@ void fstree_xattr_deduplicate(fstree_t *fs) if (it1->num_attr != it->num_attr) continue; - diff = memcmp(it1->ref, it->ref, - it->num_attr * sizeof(it->ref[0])); + diff = memcmp(it1->attr, it->attr, + it->num_attr * sizeof(it->attr[0])); if (diff == 0) break; } diff --git a/lib/sqfs/write_xattr.c b/lib/sqfs/write_xattr.c index 31fdf50..89c65db 100644 --- a/lib/sqfs/write_xattr.c +++ b/lib/sqfs/write_xattr.c @@ -38,10 +38,10 @@ bool sqfs_has_xattr(const char *key) return get_prefix(key) >= 0; } -static int write_pair(meta_writer_t *mw, const char *key, const char *value) +static int write_key(meta_writer_t *mw, const char *key, tree_xattr_t *xattr) { + const char *orig_key = key; sqfs_xattr_entry_t kent; - sqfs_xattr_value_t vent; int type; type = get_prefix(key); @@ -62,6 +62,15 @@ static int write_pair(meta_writer_t *mw, const char *key, const char *value) if (meta_writer_append(mw, key, strlen(key))) return -1; + xattr->size += sizeof(sqfs_xattr_entry_t) + strlen(orig_key); + return 0; +} + +static int write_value(meta_writer_t *mw, const char *value, + tree_xattr_t *xattr) +{ + sqfs_xattr_value_t vent; + vent.size = htole32(strlen(value)); if (meta_writer_append(mw, &vent, sizeof(vent))) @@ -69,6 +78,7 @@ static int write_pair(meta_writer_t *mw, const char *key, const char *value) if (meta_writer_append(mw, value, strlen(value))) return -1; + xattr->size += sizeof(vent) + strlen(value); return 0; } @@ -79,17 +89,17 @@ static int write_kv_pairs(fstree_t *fs, meta_writer_t *mw, tree_xattr_t *xattr) size_t i; for (i = 0; i < xattr->num_attr; ++i) { - key_idx = (xattr->ref[i] >> 32) & 0xFFFFFFFF; - val_idx = xattr->ref[i] & 0xFFFFFFFF; + key_idx = xattr->attr[i].key_index; + val_idx = xattr->attr[i].value_index; key = str_table_get_string(&fs->xattr_keys, key_idx); value = str_table_get_string(&fs->xattr_values, val_idx); - if (write_pair(mw, key, value)) + if (write_key(mw, key, xattr)) return -1; - xattr->size += sizeof(sqfs_xattr_entry_t) + strlen(key); - xattr->size += sizeof(sqfs_xattr_value_t) + strlen(value); + if (write_value(mw, value, xattr)) + return -1; } return 0; |