X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=lwext4%2Fext4_inode.c;h=696a8d782f0004f16fb78b68de5057b2e1c98fd4;hb=e6634c060580c04c0b1dd4bbf90a175e5e43f835;hp=114c5ad668f3213c7a5f7a3ef9fd1f3409de89c4;hpb=f4d662d77b4a0376d6a58475839f5a2a89b2c966;p=lwext4.git diff --git a/lwext4/ext4_inode.c b/lwext4/ext4_inode.c index 114c5ad..696a8d7 100644 --- a/lwext4/ext4_inode.c +++ b/lwext4/ext4_inode.c @@ -108,6 +108,29 @@ void ext4_inode_set_size(struct ext4_inode *inode, uint64_t size) inode->size_hi = to_le32(size >> 32); } +uint32_t ext4_inode_get_csum(struct ext4_sblock *sb, struct ext4_inode *inode) +{ + uint16_t inode_size = ext4_get16(sb, inode_size); + uint32_t v = to_le16(inode->osd2.linux2.checksum_lo); + + if (inode_size > EXT4_GOOD_OLD_INODE_SIZE) + v |= ((uint32_t)to_le16(inode->checksum_hi)) << 16; + + return v; +} + +void ext4_inode_set_csum(struct ext4_sblock *sb, struct ext4_inode *inode, + uint32_t checksum) +{ + uint16_t inode_size = ext4_get16(sb, inode_size); + inode->osd2.linux2.checksum_lo = + to_le16((checksum << 16) >> 16); + + if (inode_size > EXT4_GOOD_OLD_INODE_SIZE) + inode->checksum_hi = to_le16(checksum >> 16); + +} + uint32_t ext4_inode_get_access_time(struct ext4_inode *inode) { return to_le32(inode->access_time); @@ -126,22 +149,22 @@ void ext4_inode_set_change_inode_time(struct ext4_inode *inode, uint32_t time) inode->change_inode_time = to_le32(time); } -uint32_t ext4_inode_get_modification_time(struct ext4_inode *inode) +uint32_t ext4_inode_get_modif_time(struct ext4_inode *inode) { return to_le32(inode->modification_time); } -void ext4_inode_set_modification_time(struct ext4_inode *inode, uint32_t time) +void ext4_inode_set_modif_time(struct ext4_inode *inode, uint32_t time) { inode->modification_time = to_le32(time); } -uint32_t ext4_inode_get_deletion_time(struct ext4_inode *inode) +uint32_t ext4_inode_get_del_time(struct ext4_inode *inode) { return to_le32(inode->deletion_time); } -void ext4_inode_set_deletion_time(struct ext4_inode *inode, uint32_t time) +void ext4_inode_set_del_time(struct ext4_inode *inode, uint32_t time) { inode->deletion_time = to_le32(time); } @@ -155,11 +178,11 @@ void ext4_inode_set_gid(struct ext4_inode *inode, uint32_t gid) inode->gid = to_le32(gid); } -uint16_t ext4_inode_get_links_count(struct ext4_inode *inode) +uint16_t ext4_inode_get_links_cnt(struct ext4_inode *inode) { return to_le16(inode->links_count); } -void ext4_inode_set_links_count(struct ext4_inode *inode, uint16_t cnt) +void ext4_inode_set_links_cnt(struct ext4_inode *inode, uint16_t cnt) { inode->links_count = to_le16(cnt); } @@ -167,24 +190,22 @@ void ext4_inode_set_links_count(struct ext4_inode *inode, uint16_t cnt) uint64_t ext4_inode_get_blocks_count(struct ext4_sblock *sb, struct ext4_inode *inode) { - uint64_t count = to_le32(inode->blocks_count_lo); + uint64_t cnt = to_le32(inode->blocks_count_lo); - if (ext4_sb_has_feature_read_only(sb, - EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) { + if (ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_HUGE_FILE)) { /* 48-bit field */ - count |= ((uint64_t)to_le16(inode->osd2.linux2.blocks_high)) - << 32; + cnt |= (uint64_t)to_le16(inode->osd2.linux2.blocks_high) << 32; if (ext4_inode_has_flag(inode, EXT4_INODE_FLAG_HUGE_FILE)) { - uint32_t block_bits = ext4_inode_block_bits_count( - ext4_sb_get_block_size(sb)); - return count << (block_bits - 9); + uint32_t block_count = ext4_sb_get_block_size(sb); + uint32_t b = ext4_inode_block_bits_count(block_count); + return cnt << (b - 9); } } - return count; + return cnt; } int ext4_inode_set_blocks_count(struct ext4_sblock *sb, @@ -203,8 +224,7 @@ int ext4_inode_set_blocks_count(struct ext4_sblock *sb, } /* Check if there can be used huge files (many blocks) */ - if (!ext4_sb_has_feature_read_only(sb, - EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) + if (!ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_HUGE_FILE)) return EINVAL; /* 48-bit maximum */ @@ -216,8 +236,8 @@ int ext4_inode_set_blocks_count(struct ext4_sblock *sb, inode->osd2.linux2.blocks_high = to_le16(count >> 32); ext4_inode_clear_flag(inode, EXT4_INODE_FLAG_HUGE_FILE); } else { - uint32_t block_bits = - ext4_inode_block_bits_count(ext4_sb_get_block_size(sb)); + uint32_t block_count = ext4_sb_get_block_size(sb); + uint32_t block_bits =ext4_inode_block_bits_count(block_count); ext4_inode_set_flag(inode, EXT4_INODE_FLAG_HUGE_FILE); count = count >> (block_bits - 9); @@ -246,15 +266,23 @@ void ext4_inode_set_generation(struct ext4_inode *inode, uint32_t gen) inode->generation = to_le32(gen); } +uint16_t ext4_inode_get_extra_isize(struct ext4_inode *inode) +{ + return to_le16(inode->extra_isize); +} + +void ext4_inode_set_extra_isize(struct ext4_inode *inode, uint16_t size) +{ + inode->extra_isize = to_le16(size); +} + uint64_t ext4_inode_get_file_acl(struct ext4_inode *inode, struct ext4_sblock *sb) { - /*TODO: Verify it*/ uint64_t v = to_le32(inode->file_acl_lo); if (ext4_get32(sb, creator_os) == EXT4_SUPERBLOCK_OS_LINUX) - v |= ((uint32_t)to_le16(inode->osd2.linux2.file_acl_high)) - << 16; + v |= (uint32_t)to_le16(inode->osd2.linux2.file_acl_high) << 16; return v; } @@ -262,7 +290,6 @@ uint64_t ext4_inode_get_file_acl(struct ext4_inode *inode, void ext4_inode_set_file_acl(struct ext4_inode *inode, struct ext4_sblock *sb, uint64_t acl) { - /*TODO: Verify it*/ inode->file_acl_lo = to_le32((acl << 32) >> 32); if (ext4_get32(sb, creator_os) == EXT4_SUPERBLOCK_OS_LINUX)