f2fs: enhance on-disk inode structure scalability
[sfrench/cifs-2.6.git] / fs / f2fs / inode.c
index 32ec6b23fe01048f968d7bd7c76d36efe48cd08c..0a6699a23dfb5de1e738a823741ffad7938c950a 100644 (file)
@@ -49,20 +49,22 @@ void f2fs_set_inode_flags(struct inode *inode)
 
 static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
 {
+       int extra_size = get_extra_isize(inode);
+
        if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
                        S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
-               if (ri->i_addr[0])
-                       inode->i_rdev =
-                               old_decode_dev(le32_to_cpu(ri->i_addr[0]));
+               if (ri->i_addr[extra_size])
+                       inode->i_rdev = old_decode_dev(
+                               le32_to_cpu(ri->i_addr[extra_size]));
                else
-                       inode->i_rdev =
-                               new_decode_dev(le32_to_cpu(ri->i_addr[1]));
+                       inode->i_rdev = new_decode_dev(
+                               le32_to_cpu(ri->i_addr[extra_size + 1]));
        }
 }
 
 static bool __written_first_block(struct f2fs_inode *ri)
 {
-       block_t addr = le32_to_cpu(ri->i_addr[0]);
+       block_t addr = le32_to_cpu(ri->i_addr[offset_in_addr(ri)]);
 
        if (addr != NEW_ADDR && addr != NULL_ADDR)
                return true;
@@ -71,16 +73,18 @@ static bool __written_first_block(struct f2fs_inode *ri)
 
 static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
 {
+       int extra_size = get_extra_isize(inode);
+
        if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
                if (old_valid_dev(inode->i_rdev)) {
-                       ri->i_addr[0] =
+                       ri->i_addr[extra_size] =
                                cpu_to_le32(old_encode_dev(inode->i_rdev));
-                       ri->i_addr[1] = 0;
+                       ri->i_addr[extra_size + 1] = 0;
                } else {
-                       ri->i_addr[0] = 0;
-                       ri->i_addr[1] =
+                       ri->i_addr[extra_size] = 0;
+                       ri->i_addr[extra_size + 1] =
                                cpu_to_le32(new_encode_dev(inode->i_rdev));
-                       ri->i_addr[2] = 0;
+                       ri->i_addr[extra_size + 2] = 0;
                }
        }
 }
@@ -153,6 +157,9 @@ static int do_read_inode(struct inode *inode)
 
        get_inline_info(inode, ri);
 
+       fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
+                                       le16_to_cpu(ri->i_extra_isize) : 0;
+
        /* check data exist */
        if (f2fs_has_inline_data(inode) && !f2fs_exist_data(inode))
                __recover_inline_status(inode, node_page);
@@ -292,6 +299,9 @@ int update_inode(struct inode *inode, struct page *node_page)
        ri->i_generation = cpu_to_le32(inode->i_generation);
        ri->i_dir_level = F2FS_I(inode)->i_dir_level;
 
+       if (f2fs_has_extra_attr(inode))
+               ri->i_extra_isize = cpu_to_le16(F2FS_I(inode)->i_extra_isize);
+
        __set_inode_rdev(inode, ri);
        set_cold_node(inode, node_page);