aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorHuajun Li <huajun.li@intel.com>2013-11-10 10:13:16 -0500
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-12-22 20:18:03 -0500
commit1001b3479ce96e37aed5e4fcdc3c60126e034d08 (patch)
treefacc6b2f5412ebdefd227d96dac8523ac42c5764 /fs
parent03232305ff3cf44761f7ea271f7c9af5105392b9 (diff)
f2fs: add flags and helpers to support inline data
Add new inode flags F2FS_INLINE_DATA and FI_INLINE_DATA to indicate whether the inode has inline data. Inline data makes use of inode block's data indices region to save small file. Currently there are 923 data indices in an inode block. Since inline xattr has made use of the last 50 indices to save its data, there are 873 indices left which can be used for inline data. When FI_INLINE_DATA is set, the layout of inode block's indices region is like below: +-----------------+ | | Reserved. reserve_new_block() will make use of | i_addr[0] | i_addr[0] when we need to reserve a new data block | | to convert inline data into regular one's. |-----------------| | | Used by inline data. A file whose size is less than | i_addr[1~872] | 3488 bytes(~3.4k) and doesn't reserve extra | | blocks by fallocate() can be saved here. |-----------------| | | | i_addr[873~922] | Reserved for inline xattr | | +-----------------+ Signed-off-by: Haicheng Li <haicheng.li@linux.intel.com> Signed-off-by: Huajun Li <huajun.li@intel.com> Signed-off-by: Weihong Xu <weihong.xu@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/f2fs/f2fs.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index c8eb37e3b015..72456ec3a3e2 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -39,6 +39,7 @@
39#define F2FS_MOUNT_POSIX_ACL 0x00000020 39#define F2FS_MOUNT_POSIX_ACL 0x00000020
40#define F2FS_MOUNT_DISABLE_EXT_IDENTIFY 0x00000040 40#define F2FS_MOUNT_DISABLE_EXT_IDENTIFY 0x00000040
41#define F2FS_MOUNT_INLINE_XATTR 0x00000080 41#define F2FS_MOUNT_INLINE_XATTR 0x00000080
42#define F2FS_MOUNT_INLINE_DATA 0x00000100
42 43
43#define clear_opt(sbi, option) (sbi->mount_opt.opt &= ~F2FS_MOUNT_##option) 44#define clear_opt(sbi, option) (sbi->mount_opt.opt &= ~F2FS_MOUNT_##option)
44#define set_opt(sbi, option) (sbi->mount_opt.opt |= F2FS_MOUNT_##option) 45#define set_opt(sbi, option) (sbi->mount_opt.opt |= F2FS_MOUNT_##option)
@@ -899,6 +900,7 @@ enum {
899 FI_DELAY_IPUT, /* used for the recovery */ 900 FI_DELAY_IPUT, /* used for the recovery */
900 FI_NO_EXTENT, /* not to use the extent cache */ 901 FI_NO_EXTENT, /* not to use the extent cache */
901 FI_INLINE_XATTR, /* used for inline xattr */ 902 FI_INLINE_XATTR, /* used for inline xattr */
903 FI_INLINE_DATA, /* used for inline data*/
902}; 904};
903 905
904static inline void set_inode_flag(struct f2fs_inode_info *fi, int flag) 906static inline void set_inode_flag(struct f2fs_inode_info *fi, int flag)
@@ -936,6 +938,8 @@ static inline void get_inline_info(struct f2fs_inode_info *fi,
936{ 938{
937 if (ri->i_inline & F2FS_INLINE_XATTR) 939 if (ri->i_inline & F2FS_INLINE_XATTR)
938 set_inode_flag(fi, FI_INLINE_XATTR); 940 set_inode_flag(fi, FI_INLINE_XATTR);
941 if (ri->i_inline & F2FS_INLINE_DATA)
942 set_inode_flag(fi, FI_INLINE_DATA);
939} 943}
940 944
941static inline void set_raw_inline(struct f2fs_inode_info *fi, 945static inline void set_raw_inline(struct f2fs_inode_info *fi,
@@ -945,6 +949,8 @@ static inline void set_raw_inline(struct f2fs_inode_info *fi,
945 949
946 if (is_inode_flag_set(fi, FI_INLINE_XATTR)) 950 if (is_inode_flag_set(fi, FI_INLINE_XATTR))
947 ri->i_inline |= F2FS_INLINE_XATTR; 951 ri->i_inline |= F2FS_INLINE_XATTR;
952 if (is_inode_flag_set(fi, FI_INLINE_DATA))
953 ri->i_inline |= F2FS_INLINE_DATA;
948} 954}
949 955
950static inline unsigned int addrs_per_inode(struct f2fs_inode_info *fi) 956static inline unsigned int addrs_per_inode(struct f2fs_inode_info *fi)
@@ -970,6 +976,13 @@ static inline int inline_xattr_size(struct inode *inode)
970 return 0; 976 return 0;
971} 977}
972 978
979static inline void *inline_data_addr(struct page *page)
980{
981 struct f2fs_inode *ri;
982 ri = (struct f2fs_inode *)page_address(page);
983 return (void *)&(ri->i_addr[1]);
984}
985
973static inline int f2fs_readonly(struct super_block *sb) 986static inline int f2fs_readonly(struct super_block *sb)
974{ 987{
975 return sb->s_flags & MS_RDONLY; 988 return sb->s_flags & MS_RDONLY;
@@ -1265,4 +1278,5 @@ extern const struct address_space_operations f2fs_meta_aops;
1265extern const struct inode_operations f2fs_dir_inode_operations; 1278extern const struct inode_operations f2fs_dir_inode_operations;
1266extern const struct inode_operations f2fs_symlink_inode_operations; 1279extern const struct inode_operations f2fs_symlink_inode_operations;
1267extern const struct inode_operations f2fs_special_inode_operations; 1280extern const struct inode_operations f2fs_special_inode_operations;
1281
1268#endif 1282#endif