diff options
-rw-r--r-- | include/sqfs/inode.h | 7 | ||||
-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 |
4 files changed, 12 insertions, 9 deletions
diff --git a/include/sqfs/inode.h b/include/sqfs/inode.h index 8df7158..7f4e7b5 100644 --- a/include/sqfs/inode.h +++ b/include/sqfs/inode.h @@ -576,9 +576,10 @@ SQFS_API int sqfs_inode_get_xattr_index(const sqfs_inode_generic_t *inode, * * @memberof sqfs_inode_generic_t * - * For basic inodes, this function promes the inodes to extended inodes if the - * index is not 0xFFFFFFFF. If the index is 0xFFFFFFFF, the function tries to - * demote extended inode to a basic inode after setting the index. + * For basic inodes, this function promotes the inodes to extended inodes if + * the index is not 0xFFFFFFFF. The function does not try to demote extended + * inodes if the index is 0xFFFFFFFF, because that would cause additional + * information like a directory index to be lost. * * @param inode A pointer to an inode. * @param index The extended attribute index. 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; } |