X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=lwext4%2Fext4_inode.c;h=8ee76f8b02cdb7d8ba67c68faa277f7801753f93;hb=c7c5aba4d7e3af2e3676051d14ed9512fac76bc2;hp=b996df5cb3ddcf9aa86761809abf9af80258d094;hpb=c897dc5a646527c2b87e4bc0399db59b46edbb1d;p=lwext4.git diff --git a/lwext4/ext4_inode.c b/lwext4/ext4_inode.c index b996df5..8ee76f8 100644 --- a/lwext4/ext4_inode.c +++ b/lwext4/ext4_inode.c @@ -108,6 +108,31 @@ void ext4_inode_set_size(struct ext4_inode *inode, uint64_t size) inode->size_hi = to_le32(size >> 32); } +uint32_t +ext4_inode_get_checksum(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_checksum(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); @@ -246,6 +271,16 @@ 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) { @@ -290,11 +325,15 @@ void ext4_inode_set_indirect_block(struct ext4_inode *inode, uint32_t idx, inode->blocks[idx + EXT4_INODE_INDIRECT_BLOCK] = to_le32(block); } +uint32_t ext4_inode_type(struct ext4_sblock *sb, struct ext4_inode *inode) +{ + return (ext4_inode_get_mode(sb, inode) & EXT4_INODE_MODE_TYPE_MASK); +} + bool ext4_inode_is_type(struct ext4_sblock *sb, struct ext4_inode *inode, uint32_t type) { - return (ext4_inode_get_mode(sb, inode) & EXT4_INODE_MODE_TYPE_MASK) == - type; + return ext4_inode_type(sb, inode) == type; } bool ext4_inode_has_flag(struct ext4_inode *inode, uint32_t f) @@ -323,7 +362,8 @@ bool ext4_inode_can_truncate(struct ext4_sblock *sb, struct ext4_inode *inode) return false; if ((ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_FILE)) || - (ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_DIRECTORY))) + (ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_DIRECTORY)) || + (ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_SOFTLINK))) return true; return false;