if (c.feature & cpu_to_le32(F2FS_FEATURE_EXTRA_ATTR)) {
node_blk->i.i_inline |= F2FS_EXTRA_ATTR;
- node_blk->i.i_extra_isize =
- cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE);
+ node_blk->i.i_extra_isize = cpu_to_le16(calc_extra_isize());
}
node_blk->footer.ino = cpu_to_le32(de->ino);
if (node_blk->i.i_extra_isize >
cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE)) {
FIX_MSG("ino[0x%x] recover i_extra_isize "
- "from %u to %lu",
+ "from %u to %u",
nid,
le16_to_cpu(node_blk->i.i_extra_isize),
- F2FS_TOTAL_EXTRA_ATTR_SIZE);
+ calc_extra_isize());
node_blk->i.i_extra_isize =
- cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE);
+ cpu_to_le16(calc_extra_isize());
need_fix = 1;
}
} else {
if (c.feature & cpu_to_le32(F2FS_FEATURE_EXTRA_ATTR)) {
node_blk->i.i_inline |= F2FS_EXTRA_ATTR;
node_blk->i.i_extra_isize =
- cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE);
+ cpu_to_le16(calc_extra_isize());
}
n = read(fd, buffer, BLOCK_SZ);
ASSERT((unsigned long)n == de->size);
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
+#define F2FS_EXTRA_ISIZE_OFFSET \
+ offsetof(struct f2fs_inode, i_extra_isize)
#define F2FS_TOTAL_EXTRA_ATTR_SIZE \
- (offsetof(struct f2fs_inode, i_extra_end) - \
- offsetof(struct f2fs_inode, i_extra_isize)) \
+ (offsetof(struct f2fs_inode, i_extra_end) - F2FS_EXTRA_ISIZE_OFFSET)
#define F2FS_DEF_PROJID 0 /* default project ID */
extern int f2fs_dev_is_writable(void);
extern int f2fs_dev_is_umounted(char *);
extern int f2fs_get_device_info(void);
+extern unsigned int calc_extra_isize(void);
extern int get_device_info(int);
extern int f2fs_init_sparse_file(void);
extern int f2fs_finalize_device(void);
(c.sector_size >> 9)) >> 11);
return 0;
}
+
+unsigned int calc_extra_isize(void)
+{
+ unsigned int size = offsetof(struct f2fs_inode, i_projid);
+
+ if (c.feature & cpu_to_le32(F2FS_FEATURE_FLEXIBLE_INLINE_XATTR))
+ size = offsetof(struct f2fs_inode, i_projid);
+ if (c.feature & cpu_to_le32(F2FS_FEATURE_PRJQUOTA))
+ size = offsetof(struct f2fs_inode, i_inode_checksum);
+ if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM))
+ size = offsetof(struct f2fs_inode, i_crtime);
+ if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME))
+ size = offsetof(struct f2fs_inode, i_extra_end);
+
+ return size - F2FS_EXTRA_ISIZE_OFFSET;
+}
if (c.feature & cpu_to_le32(F2FS_FEATURE_EXTRA_ATTR)) {
raw_node->i.i_inline = F2FS_EXTRA_ATTR;
- raw_node->i.i_extra_isize =
- cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE);
+ raw_node->i.i_extra_isize = cpu_to_le16(calc_extra_isize());
}
if (c.feature & cpu_to_le32(F2FS_FEATURE_PRJQUOTA))
if (c.feature & cpu_to_le32(F2FS_FEATURE_EXTRA_ATTR)) {
raw_node->i.i_inline = F2FS_EXTRA_ATTR;
- raw_node->i.i_extra_isize =
- cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE);
+ raw_node->i.i_extra_isize = cpu_to_le16(calc_extra_isize());
}
if (c.feature & cpu_to_le32(F2FS_FEATURE_PRJQUOTA))
if (c.feature & cpu_to_le32(F2FS_FEATURE_EXTRA_ATTR)) {
raw_node->i.i_inline = F2FS_EXTRA_ATTR;
- raw_node->i.i_extra_isize =
- cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE);
+ raw_node->i.i_extra_isize = cpu_to_le16(calc_extra_isize());
}
if (c.feature & cpu_to_le32(F2FS_FEATURE_PRJQUOTA))