diff options
Diffstat (limited to 'include/sqfs')
-rw-r--r-- | include/sqfs/dir_writer.h | 7 | ||||
-rw-r--r-- | include/sqfs/inode.h | 11 |
2 files changed, 17 insertions, 1 deletions
diff --git a/include/sqfs/dir_writer.h b/include/sqfs/dir_writer.h index 9615a41..7b35fe0 100644 --- a/include/sqfs/dir_writer.h +++ b/include/sqfs/dir_writer.h @@ -161,6 +161,11 @@ SQFS_API int sqfs_dir_writer_end(sqfs_dir_writer_t *writer); * size of the directory listing that is required for the directory inodes. * And also to determine which kind of directory inode to create. * + * Note that this size is only what was written to disk. SquashFS directory + * inodes need you to add 3 to this value, to account for "." and ".." entries + * which are not actually stored on disk. The @ref sqfs_dir_writer_create_inode + * function takes this into account and adds the 3 internally. + * * @param writer A pointer to a directory writer object. * * @return The size of the entire, uncompressed listing in bytes. @@ -226,6 +231,8 @@ SQFS_API size_t sqfs_dir_writer_get_index_size(const sqfs_dir_writer_t *writer); * convenience function called @ref sqfs_dir_writer_write_index to write the * index meta data after writing the inode itself. * + * @note The size is already adjusted for the required off-by-3 value. + * * @param writer A pointer to a directory writer object. * @param hlinks The number of hard links pointing to the directory. * @param xattr If set to something other than 0xFFFFFFFF, an extended diff --git a/include/sqfs/inode.h b/include/sqfs/inode.h index 0bc33db..8df7158 100644 --- a/include/sqfs/inode.h +++ b/include/sqfs/inode.h @@ -400,6 +400,15 @@ struct sqfs_inode_dir_t { /** * @brief Combined size of all directory entries and headers in bytes. + * + * The value stored here is off by 3 bytes, i.e. 3 bytes larger than + * the actual listing on disk. The Linux implementation of SquashFS + * uses readdir() offsets 0 and 1 to synthesize "." and ".." entries, + * and after that looks into the actual directory. + * + * Why store an off-by-3 value on disk instead of faking it in the + * kernel and have something consistent here? Beats me, but that's + * how it is implemented. */ sqfs_u16 size; @@ -428,7 +437,7 @@ struct sqfs_inode_dir_ext_t { sqfs_u32 nlink; /** - * @brief Combined size of all directory entries and headers in bytes. + * @brief Size of all directory entries and headers in bytes plus 3. */ sqfs_u32 size; |