diff options
| author | ngkaho1234 <ngkaho1234@gmail.com> | 2016-05-12 13:59:44 +0000 |
|---|---|---|
| committer | Kaho Ng <ngkaho1234@gmail.com> | 2016-05-13 21:20:03 +0800 |
| commit | 5cdc17dc795e0a21486c97b5a34c8dff4bd60444 (patch) | |
| tree | 2a7a07c1eadddc66e4a0d5db35bb5276f20c8168 /src | |
| parent | 8eff9f9971a1056ade031e646acb9b07a972fd65 (diff) | |
Refine extra_isize field handling
Diffstat (limited to 'src')
| -rw-r--r-- | src/ext4_fs.c | 2 | ||||
| -rw-r--r-- | src/ext4_inode.c | 15 | ||||
| -rw-r--r-- | src/ext4_xattr.c | 8 |
3 files changed, 18 insertions, 7 deletions
diff --git a/src/ext4_fs.c b/src/ext4_fs.c index db3a2ca..e8a2777 100644 --- a/src/ext4_fs.c +++ b/src/ext4_fs.c @@ -899,7 +899,7 @@ int ext4_fs_alloc_inode(struct ext4_fs *fs, struct ext4_inode_ref *inode_ref, if (inode_size > EXT4_GOOD_OLD_INODE_SIZE) { uint16_t off = offsetof(struct ext4_inode, extra_isize); uint16_t size = sizeof(struct ext4_inode) - off; - ext4_inode_set_extra_isize(inode, size); + ext4_inode_set_extra_isize(&fs->sb, inode, size); } /* Reset blocks array. For symbolic link inode, just diff --git a/src/ext4_inode.c b/src/ext4_inode.c index 2c088cd..c64ddbc 100644 --- a/src/ext4_inode.c +++ b/src/ext4_inode.c @@ -270,14 +270,21 @@ 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) +uint16_t ext4_inode_get_extra_isize(struct ext4_sblock *sb, + struct ext4_inode *inode) { - return to_le16(inode->extra_isize); + if (ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_EXTRA_ISIZE)) + return to_le16(inode->extra_isize); + else + return 0; } -void ext4_inode_set_extra_isize(struct ext4_inode *inode, uint16_t size) +void ext4_inode_set_extra_isize(struct ext4_sblock *sb, + struct ext4_inode *inode, + uint16_t size) { - inode->extra_isize = to_le16(size); + if (ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_EXTRA_ISIZE)) + inode->extra_isize = to_le16(size); } uint64_t ext4_inode_get_file_acl(struct ext4_inode *inode, diff --git a/src/ext4_xattr.c b/src/ext4_xattr.c index d0b7457..f177eaa 100644 --- a/src/ext4_xattr.c +++ b/src/ext4_xattr.c @@ -343,12 +343,14 @@ static int ext4_xattr_inode_fetch(struct ext4_xattr_ref *xattr_ref) struct ext4_xattr_ibody_header *header = NULL; struct ext4_xattr_entry *entry = NULL; uint16_t inode_size = ext4_get16(&xattr_ref->fs->sb, inode_size); + uint16_t extra_isize = ext4_inode_get_extra_isize(&xattr_ref->fs->sb, + xattr_ref->inode_ref->inode); header = EXT4_XATTR_IHDR(xattr_ref->inode_ref->inode); entry = EXT4_XATTR_IFIRST(header); size_rem = inode_size - EXT4_GOOD_OLD_INODE_SIZE - - xattr_ref->inode_ref->inode->extra_isize; + extra_isize; for (; size_rem > 0 && !EXT4_XATTR_IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry), size_rem -= EXT4_XATTR_LEN(entry->e_name_len)) { @@ -385,8 +387,10 @@ Finish: static size_t ext4_xattr_inode_space(struct ext4_xattr_ref *xattr_ref) { uint16_t inode_size = ext4_get16(&xattr_ref->fs->sb, inode_size); + uint16_t extra_isize = ext4_inode_get_extra_isize(&xattr_ref->fs->sb, + xattr_ref->inode_ref->inode); uint16_t size_rem = inode_size - EXT4_GOOD_OLD_INODE_SIZE - - xattr_ref->inode_ref->inode->extra_isize; + extra_isize; return size_rem; } |
