diff options
Diffstat (limited to 'fs/f2fs/f2fs.h')
-rw-r--r-- | fs/f2fs/f2fs.h | 120 |
1 files changed, 91 insertions, 29 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index ec58bb2373fc..7fa3313ab0e2 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -28,7 +28,7 @@ | |||
28 | do { \ | 28 | do { \ |
29 | if (unlikely(condition)) { \ | 29 | if (unlikely(condition)) { \ |
30 | WARN_ON(1); \ | 30 | WARN_ON(1); \ |
31 | sbi->need_fsck = true; \ | 31 | set_sbi_flag(sbi, SBI_NEED_FSCK); \ |
32 | } \ | 32 | } \ |
33 | } while (0) | 33 | } while (0) |
34 | #define f2fs_down_write(x, y) down_write(x) | 34 | #define f2fs_down_write(x, y) down_write(x) |
@@ -100,10 +100,15 @@ enum { | |||
100 | 100 | ||
101 | enum { | 101 | enum { |
102 | CP_UMOUNT, | 102 | CP_UMOUNT, |
103 | CP_FASTBOOT, | ||
103 | CP_SYNC, | 104 | CP_SYNC, |
104 | CP_DISCARD, | 105 | CP_DISCARD, |
105 | }; | 106 | }; |
106 | 107 | ||
108 | #define DEF_BATCHED_TRIM_SECTIONS 32 | ||
109 | #define BATCHED_TRIM_SEGMENTS(sbi) \ | ||
110 | (SM_I(sbi)->trim_sections * (sbi)->segs_per_sec) | ||
111 | |||
107 | struct cp_control { | 112 | struct cp_control { |
108 | int reason; | 113 | int reason; |
109 | __u64 trim_start; | 114 | __u64 trim_start; |
@@ -136,8 +141,14 @@ struct ino_entry { | |||
136 | nid_t ino; /* inode number */ | 141 | nid_t ino; /* inode number */ |
137 | }; | 142 | }; |
138 | 143 | ||
139 | /* for the list of directory inodes */ | 144 | /* |
140 | struct dir_inode_entry { | 145 | * for the list of directory inodes or gc inodes. |
146 | * NOTE: there are two slab users for this structure, if we add/modify/delete | ||
147 | * fields in structure for one of slab users, it may affect fields or size of | ||
148 | * other one, in this condition, it's better to split both of slab and related | ||
149 | * data structure. | ||
150 | */ | ||
151 | struct inode_entry { | ||
141 | struct list_head list; /* list head */ | 152 | struct list_head list; /* list head */ |
142 | struct inode *inode; /* vfs inode pointer */ | 153 | struct inode *inode; /* vfs inode pointer */ |
143 | }; | 154 | }; |
@@ -196,11 +207,14 @@ static inline bool __has_cursum_space(struct f2fs_summary_block *sum, int size, | |||
196 | */ | 207 | */ |
197 | #define F2FS_IOC_GETFLAGS FS_IOC_GETFLAGS | 208 | #define F2FS_IOC_GETFLAGS FS_IOC_GETFLAGS |
198 | #define F2FS_IOC_SETFLAGS FS_IOC_SETFLAGS | 209 | #define F2FS_IOC_SETFLAGS FS_IOC_SETFLAGS |
210 | #define F2FS_IOC_GETVERSION FS_IOC_GETVERSION | ||
199 | 211 | ||
200 | #define F2FS_IOCTL_MAGIC 0xf5 | 212 | #define F2FS_IOCTL_MAGIC 0xf5 |
201 | #define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1) | 213 | #define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1) |
202 | #define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2) | 214 | #define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2) |
203 | #define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3) | 215 | #define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3) |
216 | #define F2FS_IOC_RELEASE_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 4) | ||
217 | #define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5) | ||
204 | 218 | ||
205 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | 219 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) |
206 | /* | 220 | /* |
@@ -295,7 +309,7 @@ struct f2fs_inode_info { | |||
295 | nid_t i_xattr_nid; /* node id that contains xattrs */ | 309 | nid_t i_xattr_nid; /* node id that contains xattrs */ |
296 | unsigned long long xattr_ver; /* cp version of xattr modification */ | 310 | unsigned long long xattr_ver; /* cp version of xattr modification */ |
297 | struct extent_info ext; /* in-memory extent cache entry */ | 311 | struct extent_info ext; /* in-memory extent cache entry */ |
298 | struct dir_inode_entry *dirty_dir; /* the pointer of dirty dir */ | 312 | struct inode_entry *dirty_dir; /* the pointer of dirty dir */ |
299 | 313 | ||
300 | struct radix_tree_root inmem_root; /* radix tree for inmem pages */ | 314 | struct radix_tree_root inmem_root; /* radix tree for inmem pages */ |
301 | struct list_head inmem_pages; /* inmemory pages managed by f2fs */ | 315 | struct list_head inmem_pages; /* inmemory pages managed by f2fs */ |
@@ -398,7 +412,8 @@ enum { | |||
398 | CURSEG_HOT_NODE, /* direct node blocks of directory files */ | 412 | CURSEG_HOT_NODE, /* direct node blocks of directory files */ |
399 | CURSEG_WARM_NODE, /* direct node blocks of normal files */ | 413 | CURSEG_WARM_NODE, /* direct node blocks of normal files */ |
400 | CURSEG_COLD_NODE, /* indirect node blocks */ | 414 | CURSEG_COLD_NODE, /* indirect node blocks */ |
401 | NO_CHECK_TYPE | 415 | NO_CHECK_TYPE, |
416 | CURSEG_DIRECT_IO, /* to use for the direct IO path */ | ||
402 | }; | 417 | }; |
403 | 418 | ||
404 | struct flush_cmd { | 419 | struct flush_cmd { |
@@ -437,6 +452,9 @@ struct f2fs_sm_info { | |||
437 | int nr_discards; /* # of discards in the list */ | 452 | int nr_discards; /* # of discards in the list */ |
438 | int max_discards; /* max. discards to be issued */ | 453 | int max_discards; /* max. discards to be issued */ |
439 | 454 | ||
455 | /* for batched trimming */ | ||
456 | unsigned int trim_sections; /* # of sections to trim */ | ||
457 | |||
440 | struct list_head sit_entry_set; /* sit entry set list */ | 458 | struct list_head sit_entry_set; /* sit entry set list */ |
441 | 459 | ||
442 | unsigned int ipu_policy; /* in-place-update policy */ | 460 | unsigned int ipu_policy; /* in-place-update policy */ |
@@ -489,6 +507,7 @@ enum page_type { | |||
489 | struct f2fs_io_info { | 507 | struct f2fs_io_info { |
490 | enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ | 508 | enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ |
491 | int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ | 509 | int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ |
510 | block_t blk_addr; /* block address to be written */ | ||
492 | }; | 511 | }; |
493 | 512 | ||
494 | #define is_read_io(rw) (((rw) & 1) == READ) | 513 | #define is_read_io(rw) (((rw) & 1) == READ) |
@@ -508,13 +527,20 @@ struct inode_management { | |||
508 | unsigned long ino_num; /* number of entries */ | 527 | unsigned long ino_num; /* number of entries */ |
509 | }; | 528 | }; |
510 | 529 | ||
530 | /* For s_flag in struct f2fs_sb_info */ | ||
531 | enum { | ||
532 | SBI_IS_DIRTY, /* dirty flag for checkpoint */ | ||
533 | SBI_IS_CLOSE, /* specify unmounting */ | ||
534 | SBI_NEED_FSCK, /* need fsck.f2fs to fix */ | ||
535 | SBI_POR_DOING, /* recovery is doing or not */ | ||
536 | }; | ||
537 | |||
511 | struct f2fs_sb_info { | 538 | struct f2fs_sb_info { |
512 | struct super_block *sb; /* pointer to VFS super block */ | 539 | struct super_block *sb; /* pointer to VFS super block */ |
513 | struct proc_dir_entry *s_proc; /* proc entry */ | 540 | struct proc_dir_entry *s_proc; /* proc entry */ |
514 | struct buffer_head *raw_super_buf; /* buffer head of raw sb */ | 541 | struct buffer_head *raw_super_buf; /* buffer head of raw sb */ |
515 | struct f2fs_super_block *raw_super; /* raw super block pointer */ | 542 | struct f2fs_super_block *raw_super; /* raw super block pointer */ |
516 | int s_dirty; /* dirty flag for checkpoint */ | 543 | int s_flag; /* flags for sbi */ |
517 | bool need_fsck; /* need fsck.f2fs to fix */ | ||
518 | 544 | ||
519 | /* for node-related operations */ | 545 | /* for node-related operations */ |
520 | struct f2fs_nm_info *nm_info; /* node manager */ | 546 | struct f2fs_nm_info *nm_info; /* node manager */ |
@@ -534,7 +560,6 @@ struct f2fs_sb_info { | |||
534 | struct rw_semaphore cp_rwsem; /* blocking FS operations */ | 560 | struct rw_semaphore cp_rwsem; /* blocking FS operations */ |
535 | struct rw_semaphore node_write; /* locking node writes */ | 561 | struct rw_semaphore node_write; /* locking node writes */ |
536 | struct mutex writepages; /* mutex for writepages() */ | 562 | struct mutex writepages; /* mutex for writepages() */ |
537 | bool por_doing; /* recovery is doing or not */ | ||
538 | wait_queue_head_t cp_wait; | 563 | wait_queue_head_t cp_wait; |
539 | 564 | ||
540 | struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */ | 565 | struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */ |
@@ -589,6 +614,7 @@ struct f2fs_sb_info { | |||
589 | struct f2fs_stat_info *stat_info; /* FS status information */ | 614 | struct f2fs_stat_info *stat_info; /* FS status information */ |
590 | unsigned int segment_count[2]; /* # of allocated segments */ | 615 | unsigned int segment_count[2]; /* # of allocated segments */ |
591 | unsigned int block_count[2]; /* # of allocated blocks */ | 616 | unsigned int block_count[2]; /* # of allocated blocks */ |
617 | atomic_t inplace_count; /* # of inplace update */ | ||
592 | int total_hit_ext, read_hit_ext; /* extent cache hit ratio */ | 618 | int total_hit_ext, read_hit_ext; /* extent cache hit ratio */ |
593 | atomic_t inline_inode; /* # of inline_data inodes */ | 619 | atomic_t inline_inode; /* # of inline_data inodes */ |
594 | atomic_t inline_dir; /* # of inline_dentry inodes */ | 620 | atomic_t inline_dir; /* # of inline_dentry inodes */ |
@@ -686,14 +712,19 @@ static inline struct address_space *NODE_MAPPING(struct f2fs_sb_info *sbi) | |||
686 | return sbi->node_inode->i_mapping; | 712 | return sbi->node_inode->i_mapping; |
687 | } | 713 | } |
688 | 714 | ||
689 | static inline void F2FS_SET_SB_DIRT(struct f2fs_sb_info *sbi) | 715 | static inline bool is_sbi_flag_set(struct f2fs_sb_info *sbi, unsigned int type) |
690 | { | 716 | { |
691 | sbi->s_dirty = 1; | 717 | return sbi->s_flag & (0x01 << type); |
692 | } | 718 | } |
693 | 719 | ||
694 | static inline void F2FS_RESET_SB_DIRT(struct f2fs_sb_info *sbi) | 720 | static inline void set_sbi_flag(struct f2fs_sb_info *sbi, unsigned int type) |
695 | { | 721 | { |
696 | sbi->s_dirty = 0; | 722 | sbi->s_flag |= (0x01 << type); |
723 | } | ||
724 | |||
725 | static inline void clear_sbi_flag(struct f2fs_sb_info *sbi, unsigned int type) | ||
726 | { | ||
727 | sbi->s_flag &= ~(0x01 << type); | ||
697 | } | 728 | } |
698 | 729 | ||
699 | static inline unsigned long long cur_cp_version(struct f2fs_checkpoint *cp) | 730 | static inline unsigned long long cur_cp_version(struct f2fs_checkpoint *cp) |
@@ -741,6 +772,28 @@ static inline void f2fs_unlock_all(struct f2fs_sb_info *sbi) | |||
741 | up_write(&sbi->cp_rwsem); | 772 | up_write(&sbi->cp_rwsem); |
742 | } | 773 | } |
743 | 774 | ||
775 | static inline int __get_cp_reason(struct f2fs_sb_info *sbi) | ||
776 | { | ||
777 | int reason = CP_SYNC; | ||
778 | |||
779 | if (test_opt(sbi, FASTBOOT)) | ||
780 | reason = CP_FASTBOOT; | ||
781 | if (is_sbi_flag_set(sbi, SBI_IS_CLOSE)) | ||
782 | reason = CP_UMOUNT; | ||
783 | return reason; | ||
784 | } | ||
785 | |||
786 | static inline bool __remain_node_summaries(int reason) | ||
787 | { | ||
788 | return (reason == CP_UMOUNT || reason == CP_FASTBOOT); | ||
789 | } | ||
790 | |||
791 | static inline bool __exist_node_summaries(struct f2fs_sb_info *sbi) | ||
792 | { | ||
793 | return (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG) || | ||
794 | is_set_ckpt_flags(F2FS_CKPT(sbi), CP_FASTBOOT_FLAG)); | ||
795 | } | ||
796 | |||
744 | /* | 797 | /* |
745 | * Check whether the given nid is within node id range. | 798 | * Check whether the given nid is within node id range. |
746 | */ | 799 | */ |
@@ -805,7 +858,7 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi, | |||
805 | static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type) | 858 | static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type) |
806 | { | 859 | { |
807 | atomic_inc(&sbi->nr_pages[count_type]); | 860 | atomic_inc(&sbi->nr_pages[count_type]); |
808 | F2FS_SET_SB_DIRT(sbi); | 861 | set_sbi_flag(sbi, SBI_IS_DIRTY); |
809 | } | 862 | } |
810 | 863 | ||
811 | static inline void inode_inc_dirty_pages(struct inode *inode) | 864 | static inline void inode_inc_dirty_pages(struct inode *inode) |
@@ -1113,6 +1166,7 @@ enum { | |||
1113 | FI_NEED_IPU, /* used for ipu per file */ | 1166 | FI_NEED_IPU, /* used for ipu per file */ |
1114 | FI_ATOMIC_FILE, /* indicate atomic file */ | 1167 | FI_ATOMIC_FILE, /* indicate atomic file */ |
1115 | FI_VOLATILE_FILE, /* indicate volatile file */ | 1168 | FI_VOLATILE_FILE, /* indicate volatile file */ |
1169 | FI_DROP_CACHE, /* drop dirty page cache */ | ||
1116 | FI_DATA_EXIST, /* indicate data exists */ | 1170 | FI_DATA_EXIST, /* indicate data exists */ |
1117 | }; | 1171 | }; |
1118 | 1172 | ||
@@ -1220,6 +1274,11 @@ static inline bool f2fs_is_volatile_file(struct inode *inode) | |||
1220 | return is_inode_flag_set(F2FS_I(inode), FI_VOLATILE_FILE); | 1274 | return is_inode_flag_set(F2FS_I(inode), FI_VOLATILE_FILE); |
1221 | } | 1275 | } |
1222 | 1276 | ||
1277 | static inline bool f2fs_is_drop_cache(struct inode *inode) | ||
1278 | { | ||
1279 | return is_inode_flag_set(F2FS_I(inode), FI_DROP_CACHE); | ||
1280 | } | ||
1281 | |||
1223 | static inline void *inline_data_addr(struct page *page) | 1282 | static inline void *inline_data_addr(struct page *page) |
1224 | { | 1283 | { |
1225 | struct f2fs_inode *ri = F2FS_INODE(page); | 1284 | struct f2fs_inode *ri = F2FS_INODE(page); |
@@ -1389,7 +1448,6 @@ void destroy_node_manager_caches(void); | |||
1389 | * segment.c | 1448 | * segment.c |
1390 | */ | 1449 | */ |
1391 | void register_inmem_page(struct inode *, struct page *); | 1450 | void register_inmem_page(struct inode *, struct page *); |
1392 | void invalidate_inmem_page(struct inode *, struct page *); | ||
1393 | void commit_inmem_pages(struct inode *, bool); | 1451 | void commit_inmem_pages(struct inode *, bool); |
1394 | void f2fs_balance_fs(struct f2fs_sb_info *); | 1452 | void f2fs_balance_fs(struct f2fs_sb_info *); |
1395 | void f2fs_balance_fs_bg(struct f2fs_sb_info *); | 1453 | void f2fs_balance_fs_bg(struct f2fs_sb_info *); |
@@ -1401,16 +1459,16 @@ void refresh_sit_entry(struct f2fs_sb_info *, block_t, block_t); | |||
1401 | void clear_prefree_segments(struct f2fs_sb_info *); | 1459 | void clear_prefree_segments(struct f2fs_sb_info *); |
1402 | void release_discard_addrs(struct f2fs_sb_info *); | 1460 | void release_discard_addrs(struct f2fs_sb_info *); |
1403 | void discard_next_dnode(struct f2fs_sb_info *, block_t); | 1461 | void discard_next_dnode(struct f2fs_sb_info *, block_t); |
1404 | int npages_for_summary_flush(struct f2fs_sb_info *); | 1462 | int npages_for_summary_flush(struct f2fs_sb_info *, bool); |
1405 | void allocate_new_segments(struct f2fs_sb_info *); | 1463 | void allocate_new_segments(struct f2fs_sb_info *); |
1406 | int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *); | 1464 | int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *); |
1407 | struct page *get_sum_page(struct f2fs_sb_info *, unsigned int); | 1465 | struct page *get_sum_page(struct f2fs_sb_info *, unsigned int); |
1408 | void write_meta_page(struct f2fs_sb_info *, struct page *); | 1466 | void write_meta_page(struct f2fs_sb_info *, struct page *); |
1409 | void write_node_page(struct f2fs_sb_info *, struct page *, | 1467 | void write_node_page(struct f2fs_sb_info *, struct page *, |
1410 | struct f2fs_io_info *, unsigned int, block_t, block_t *); | 1468 | unsigned int, struct f2fs_io_info *); |
1411 | void write_data_page(struct page *, struct dnode_of_data *, block_t *, | 1469 | void write_data_page(struct page *, struct dnode_of_data *, |
1412 | struct f2fs_io_info *); | 1470 | struct f2fs_io_info *); |
1413 | void rewrite_data_page(struct page *, block_t, struct f2fs_io_info *); | 1471 | void rewrite_data_page(struct page *, struct f2fs_io_info *); |
1414 | void recover_data_page(struct f2fs_sb_info *, struct page *, | 1472 | void recover_data_page(struct f2fs_sb_info *, struct page *, |
1415 | struct f2fs_summary *, block_t, block_t); | 1473 | struct f2fs_summary *, block_t, block_t); |
1416 | void allocate_data_block(struct f2fs_sb_info *, struct page *, | 1474 | void allocate_data_block(struct f2fs_sb_info *, struct page *, |
@@ -1457,17 +1515,20 @@ void destroy_checkpoint_caches(void); | |||
1457 | * data.c | 1515 | * data.c |
1458 | */ | 1516 | */ |
1459 | void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int); | 1517 | void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int); |
1460 | int f2fs_submit_page_bio(struct f2fs_sb_info *, struct page *, block_t, int); | 1518 | int f2fs_submit_page_bio(struct f2fs_sb_info *, struct page *, |
1461 | void f2fs_submit_page_mbio(struct f2fs_sb_info *, struct page *, block_t, | 1519 | struct f2fs_io_info *); |
1520 | void f2fs_submit_page_mbio(struct f2fs_sb_info *, struct page *, | ||
1462 | struct f2fs_io_info *); | 1521 | struct f2fs_io_info *); |
1463 | int reserve_new_block(struct dnode_of_data *); | 1522 | int reserve_new_block(struct dnode_of_data *); |
1464 | int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); | 1523 | int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); |
1465 | void update_extent_cache(block_t, struct dnode_of_data *); | 1524 | void update_extent_cache(struct dnode_of_data *); |
1466 | struct page *find_data_page(struct inode *, pgoff_t, bool); | 1525 | struct page *find_data_page(struct inode *, pgoff_t, bool); |
1467 | struct page *get_lock_data_page(struct inode *, pgoff_t); | 1526 | struct page *get_lock_data_page(struct inode *, pgoff_t); |
1468 | struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool); | 1527 | struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool); |
1469 | int do_write_data_page(struct page *, struct f2fs_io_info *); | 1528 | int do_write_data_page(struct page *, struct f2fs_io_info *); |
1470 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); | 1529 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); |
1530 | void f2fs_invalidate_page(struct page *, unsigned int, unsigned int); | ||
1531 | int f2fs_release_page(struct page *, gfp_t); | ||
1471 | 1532 | ||
1472 | /* | 1533 | /* |
1473 | * gc.c | 1534 | * gc.c |
@@ -1477,8 +1538,6 @@ void stop_gc_thread(struct f2fs_sb_info *); | |||
1477 | block_t start_bidx_of_node(unsigned int, struct f2fs_inode_info *); | 1538 | block_t start_bidx_of_node(unsigned int, struct f2fs_inode_info *); |
1478 | int f2fs_gc(struct f2fs_sb_info *); | 1539 | int f2fs_gc(struct f2fs_sb_info *); |
1479 | void build_gc_manager(struct f2fs_sb_info *); | 1540 | void build_gc_manager(struct f2fs_sb_info *); |
1480 | int __init create_gc_caches(void); | ||
1481 | void destroy_gc_caches(void); | ||
1482 | 1541 | ||
1483 | /* | 1542 | /* |
1484 | * recovery.c | 1543 | * recovery.c |
@@ -1497,9 +1556,9 @@ struct f2fs_stat_info { | |||
1497 | int main_area_segs, main_area_sections, main_area_zones; | 1556 | int main_area_segs, main_area_sections, main_area_zones; |
1498 | int hit_ext, total_ext; | 1557 | int hit_ext, total_ext; |
1499 | int ndirty_node, ndirty_dent, ndirty_dirs, ndirty_meta; | 1558 | int ndirty_node, ndirty_dent, ndirty_dirs, ndirty_meta; |
1500 | int nats, sits, fnids; | 1559 | int nats, dirty_nats, sits, dirty_sits, fnids; |
1501 | int total_count, utilization; | 1560 | int total_count, utilization; |
1502 | int bg_gc, inline_inode, inline_dir, inmem_pages; | 1561 | int bg_gc, inline_inode, inline_dir, inmem_pages, wb_pages; |
1503 | unsigned int valid_count, valid_node_count, valid_inode_count; | 1562 | unsigned int valid_count, valid_node_count, valid_inode_count; |
1504 | unsigned int bimodal, avg_vblocks; | 1563 | unsigned int bimodal, avg_vblocks; |
1505 | int util_free, util_valid, util_invalid; | 1564 | int util_free, util_valid, util_invalid; |
@@ -1514,7 +1573,8 @@ struct f2fs_stat_info { | |||
1514 | 1573 | ||
1515 | unsigned int segment_count[2]; | 1574 | unsigned int segment_count[2]; |
1516 | unsigned int block_count[2]; | 1575 | unsigned int block_count[2]; |
1517 | unsigned base_mem, cache_mem; | 1576 | unsigned int inplace_count; |
1577 | unsigned base_mem, cache_mem, page_mem; | ||
1518 | }; | 1578 | }; |
1519 | 1579 | ||
1520 | static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi) | 1580 | static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi) |
@@ -1553,7 +1613,8 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi) | |||
1553 | ((sbi)->segment_count[(curseg)->alloc_type]++) | 1613 | ((sbi)->segment_count[(curseg)->alloc_type]++) |
1554 | #define stat_inc_block_count(sbi, curseg) \ | 1614 | #define stat_inc_block_count(sbi, curseg) \ |
1555 | ((sbi)->block_count[(curseg)->alloc_type]++) | 1615 | ((sbi)->block_count[(curseg)->alloc_type]++) |
1556 | 1616 | #define stat_inc_inplace_blocks(sbi) \ | |
1617 | (atomic_inc(&(sbi)->inplace_count)) | ||
1557 | #define stat_inc_seg_count(sbi, type) \ | 1618 | #define stat_inc_seg_count(sbi, type) \ |
1558 | do { \ | 1619 | do { \ |
1559 | struct f2fs_stat_info *si = F2FS_STAT(sbi); \ | 1620 | struct f2fs_stat_info *si = F2FS_STAT(sbi); \ |
@@ -1599,6 +1660,7 @@ void f2fs_destroy_root_stats(void); | |||
1599 | #define stat_dec_inline_dir(inode) | 1660 | #define stat_dec_inline_dir(inode) |
1600 | #define stat_inc_seg_type(sbi, curseg) | 1661 | #define stat_inc_seg_type(sbi, curseg) |
1601 | #define stat_inc_block_count(sbi, curseg) | 1662 | #define stat_inc_block_count(sbi, curseg) |
1663 | #define stat_inc_inplace_blocks(sbi) | ||
1602 | #define stat_inc_seg_count(si, type) | 1664 | #define stat_inc_seg_count(si, type) |
1603 | #define stat_inc_tot_blk_count(si, blks) | 1665 | #define stat_inc_tot_blk_count(si, blks) |
1604 | #define stat_inc_data_blk_count(si, blks) | 1666 | #define stat_inc_data_blk_count(si, blks) |
@@ -1619,6 +1681,7 @@ extern const struct address_space_operations f2fs_meta_aops; | |||
1619 | extern const struct inode_operations f2fs_dir_inode_operations; | 1681 | extern const struct inode_operations f2fs_dir_inode_operations; |
1620 | extern const struct inode_operations f2fs_symlink_inode_operations; | 1682 | extern const struct inode_operations f2fs_symlink_inode_operations; |
1621 | extern const struct inode_operations f2fs_special_inode_operations; | 1683 | extern const struct inode_operations f2fs_special_inode_operations; |
1684 | extern struct kmem_cache *inode_entry_slab; | ||
1622 | 1685 | ||
1623 | /* | 1686 | /* |
1624 | * inline.c | 1687 | * inline.c |
@@ -1629,7 +1692,6 @@ int f2fs_read_inline_data(struct inode *, struct page *); | |||
1629 | int f2fs_convert_inline_page(struct dnode_of_data *, struct page *); | 1692 | int f2fs_convert_inline_page(struct dnode_of_data *, struct page *); |
1630 | int f2fs_convert_inline_inode(struct inode *); | 1693 | int f2fs_convert_inline_inode(struct inode *); |
1631 | int f2fs_write_inline_data(struct inode *, struct page *); | 1694 | int f2fs_write_inline_data(struct inode *, struct page *); |
1632 | void truncate_inline_data(struct page *, u64); | ||
1633 | bool recover_inline_data(struct inode *, struct page *); | 1695 | bool recover_inline_data(struct inode *, struct page *); |
1634 | struct f2fs_dir_entry *find_in_inline_dir(struct inode *, struct qstr *, | 1696 | struct f2fs_dir_entry *find_in_inline_dir(struct inode *, struct qstr *, |
1635 | struct page **); | 1697 | struct page **); |