diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2023-01-19 15:18:43 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2024-01-24 09:56:10 +0100 |
commit | d81b85ba4db12c2052a8fdd3b4e77343740d6fba (patch) | |
tree | 7d3bc26ffb041ce601d6c894687b8cb65683155a /lib | |
parent | 78a6f0b30e648c8ba3a3fb28f1f818548a81978b (diff) |
libsqfs: add a threshold for extended directory inodes with index
mksquashfs generates extended inodes if a directory contains 256
entries. libsquashfs so far only generated extended inodes if there
is no other way to encode it. Mimic the behaviour of mksquashfs by
adding a threshold.
For this to work, the "sqfs_inode_set_xattr_index" function has to
be changed to not immediately try to demote inodes to basic types.
The fstree serialization is modified to do that itself if the index
is 0xFFFFFFFF and the target is not a directory inode.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/common/writer/serialize_fstree.c | 3 | ||||
-rw-r--r-- | lib/sqfs/dir_writer.c | 5 | ||||
-rw-r--r-- | lib/sqfs/inode.c | 6 |
3 files changed, 8 insertions, 6 deletions
diff --git a/lib/common/writer/serialize_fstree.c b/lib/common/writer/serialize_fstree.c index b15f30d..9776874 100644 --- a/lib/common/writer/serialize_fstree.c +++ b/lib/common/writer/serialize_fstree.c @@ -144,6 +144,9 @@ static int serialize_tree_node(const char *filename, sqfs_writer_t *wr, sqfs_inode_set_xattr_index(inode, n->xattr_idx); + if (n->xattr_idx == 0xFFFFFFFF && !S_ISDIR(n->mode)) + sqfs_inode_make_basic(inode); + ret = sqfs_id_table_id_to_index(wr->idtbl, n->uid, &inode->base.uid_idx); if (ret) diff --git a/lib/sqfs/dir_writer.c b/lib/sqfs/dir_writer.c index a02faa7..ce63a1e 100644 --- a/lib/sqfs/dir_writer.c +++ b/lib/sqfs/dir_writer.c @@ -21,6 +21,8 @@ #include <stdlib.h> #include <string.h> +#define DIR_INDEX_THRESHOLD (256) + typedef struct dir_entry_t { struct dir_entry_t *next; sqfs_u64 inode_ref; @@ -385,6 +387,9 @@ sqfs_inode_generic_t inode->base.type = SQFS_INODE_DIR; } + if (writer->ent_count >= DIR_INDEX_THRESHOLD) + inode->base.type = SQFS_INODE_EXT_DIR; + if (inode->base.type == SQFS_INODE_DIR) { inode->data.dir.start_block = start_block; inode->data.dir.nlink = writer->ent_count + hlinks + 2; diff --git a/lib/sqfs/inode.c b/lib/sqfs/inode.c index 0fb4809..ce51cf5 100644 --- a/lib/sqfs/inode.c +++ b/lib/sqfs/inode.c @@ -110,12 +110,6 @@ int sqfs_inode_set_xattr_index(sqfs_inode_generic_t *inode, sqfs_u32 index) return SQFS_ERROR_CORRUPTED; } - if (index == 0xFFFFFFFF) { - err = sqfs_inode_make_basic(inode); - if (err) - return err; - } - return 0; } |