From 8ac60e9b961f12acfe300258700522b02c06a50c Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Fri, 28 Jun 2019 12:24:54 +0200 Subject: Fix inode fragment & sparse counter initialization The sparse attribute should be initialized with 0. It is subtracted from the file size in the kernel to determine the file size on disk to report to stat(2). So it actually didn't matter anyway (just for correctness sake). Second, the fragment index and offset should be set to 0xFFFFFFFF in the rare case that no fragments exist. Signed-off-by: David Oberhollenzer --- lib/sqfs/write_inode.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'lib/sqfs') diff --git a/lib/sqfs/write_inode.c b/lib/sqfs/write_inode.c index ee4ebc6..fd14913 100644 --- a/lib/sqfs/write_inode.c +++ b/lib/sqfs/write_inode.c @@ -185,13 +185,18 @@ int meta_writer_write_inode(fstree_t *fs, id_table_t *idtbl, meta_writer_t *im, sqfs_inode_file_ext_t ext = { .blocks_start = htole64(fi->startblock), .file_size = htole64(fi->size), - .sparse = htole64(0xFFFFFFFFFFFFFFFFUL), + .sparse = htole64(0), .nlink = htole32(hard_link_count(node)), - .fragment_idx = htole32(fi->fragment), - .fragment_offset = htole32(fi->fragment_offset), + .fragment_idx = htole32(0xFFFFFFFF), + .fragment_offset = htole32(0xFFFFFFFF), .xattr_idx = htole32(0xFFFFFFFF), }; + if ((fi->size % fs->block_size) != 0) { + ext.fragment_idx = htole32(fi->fragment); + ext.fragment_offset = htole32(fi->fragment_offset); + } + if (node->xattr != NULL) ext.xattr_idx = htole32(node->xattr->index); @@ -202,11 +207,16 @@ int meta_writer_write_inode(fstree_t *fs, id_table_t *idtbl, meta_writer_t *im, case SQFS_INODE_FILE: { sqfs_inode_file_t reg = { .blocks_start = htole32(fi->startblock), - .fragment_index = htole32(fi->fragment), - .fragment_offset = htole32(fi->fragment_offset), + .fragment_index = htole32(0xFFFFFFFF), + .fragment_offset = htole32(0xFFFFFFFF), .file_size = htole32(fi->size), }; + if ((fi->size % fs->block_size) != 0) { + reg.fragment_index = htole32(fi->fragment); + reg.fragment_offset = htole32(fi->fragment_offset); + } + if (meta_writer_append(im, ®, sizeof(reg))) return -1; goto out_file_blocks; -- cgit v1.2.3