Refine extra_isize field handling
authorngkaho1234 <ngkaho1234@gmail.com>
Thu, 12 May 2016 13:59:44 +0000 (13:59 +0000)
committerKaho Ng <ngkaho1234@gmail.com>
Fri, 13 May 2016 13:20:03 +0000 (21:20 +0800)
include/ext4_inode.h
src/ext4_fs.c
src/ext4_inode.c
src/ext4_xattr.c

index 9c1f3f042ed7c93ae6d75c53ee52d02ba6a95e2d..9498f0a866e435677d69180b81f2f2014f2a0d90 100644 (file)
@@ -205,16 +205,21 @@ uint32_t ext4_inode_get_generation(struct ext4_inode *inode);
 void ext4_inode_set_generation(struct ext4_inode *inode, uint32_t gen);
 
 /**@brief Get extra I-node size field.
+ * @param sb         Superblock
  * @param inode      I-node
  * @return extra I-node size
  */
-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);
 
 /**@brief Set extra I-node size field.
+ * @param sb         Superblock
  * @param inode      I-node
  * @param size       extra I-node size
  */
-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);
 
 /**@brief Get address of block, where are extended attributes located.
  * @param inode I-node
index db3a2ca745b7773fa7d2b930a6a01e6d96144492..e8a2777fbbcee5190f95d59ecdbf31d1fe7232bd 100644 (file)
@@ -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
index 2c088cdf48c11d3645352c3f71c5e14119501487..c64ddbc765688cc0b2b2208fbd917e02cdb9756c 100644 (file)
@@ -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,
index d0b745753203312aa961009fcc0efeb7c1f5337b..f177eaaa5aa081b6d20d6c6f84c4bea340fb3ce5 100644 (file)
@@ -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;
 }