f2fs: support file defragment
PATCH v2 1/1 f2fs: support file defragment
This patch introduces a new ioctl F2FS_IOC_DEFRAGMENT to support file defragment in a specified range of regular file.
This ioctl can be used in very limited workload: if user expects high sequential read performance in randomly written file, this interface can be used for defragmentation, after that file can be written as continuous as possible in the device.
Meanwhile, it has side-effect, it will make holes in segments where blocks located originally, so it's better to trigger GC to eliminate fragment in segments.
Signed-off-by Chao Yu <[email protected]>
---
v2:
- check IPU policy in advance.
- use get_lock_data_page suggested by Jaegeuk.
fs/f2fs/data.c | 6 +- fs/f2fs/f2fs.h | 8 +++ fs/f2fs/file.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 1 deletion(-)
fs/f2fs/data.c +5 -1
@@ -566,7 +566,7 @@ out:* b. do not use extent cache for better performance * c. give the block addresses to blockdev */ -static int f2fs_map_blocks (struct inode *inode,struct f2fs_map_blocks *map, +int f2fs_map_blocks (struct inode *inode,struct f2fs_map_blocks *map,int create,int flag) {unsigned int maxblocks = map->m_len;
@@ -1354,6 +1354,10 @@ static int f2fs_write_data_pages(struct address_space *mapping, available_free_memory(sbi, DIRTY_DENTS)) goto skip_write; +/* skip writing during file defragment */ +if (is_inode_flag_set (F2FS_I (inode),FI_DO_DEFRAG )) + goto skip_write; +/* during POR, we don't need to trigger writepage at all. */ if (unlikely (is_sbi_flag_set (sbi,SBI_POR_DOING ))) goto skip_write;
fs/f2fs/f2fs.h +8 -0
@@ -234,6 +234,7 @@ static inline bool __has_cursum_space(struct f2fs_summary_block *sum, int size,#define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5)#define F2FS_IOC_GARBAGE_COLLECT _IO(F2FS_IOCTL_MAGIC, 6)#define F2FS_IOC_WRITE_CHECKPOINT _IO(F2FS_IOCTL_MAGIC, 7) +#define F2FS_IOC_DEFRAGMENT _IO(F2FS_IOCTL_MAGIC, 8)#define F2FS_IOC_SET_ENCRYPTION_POLICY \ _IOR('f', 19, struct f2fs_encryption_policy)
@@ -260,6 +261,11 @@ static inline bool __has_cursum_space(struct f2fs_summary_block *sum, int size,#define F2FS_IOC32_SETFLAGS FS_IOC32_SETFLAGS#endif +struct f2fs_defragment { +u64 start; +u64 len; +}; +/* * For INODE and NODE manager */
@@ -1416,6 +1422,7 @@ enum {FI_DROP_CACHE ,/* drop dirty page cache */ FI_DATA_EXIST ,/* indicate data exists */ FI_INLINE_DOTS ,/* indicate inline dot dentries */ + FI_DO_DEFRAG, /* indicate defragment is running */ };static inline void set_inode_flag (struct f2fs_inode_info *fi,int flag)
@@ -1847,6 +1854,7 @@ struct page *find_data_page(struct inode *, pgoff_t);struct page *get_lock_data_page (struct inode *,pgoff_t ,bool );struct page *get_new_data_page (struct inode *,struct page *,pgoff_t ,bool );int do_write_data_page (struct f2fs_io_info *); +int f2fs_map_blocks (struct inode *,struct f2fs_map_blocks *,int ,int );int f2fs_fiemap (struct inode *inode,struct fiemap_extent_info *,u64 ,u64 );void f2fs_invalidate_page (struct page *,unsigned int ,unsigned int );int f2fs_release_page (struct page *,gfp_t );
fs/f2fs/file.c +195 -0
207 lines not on this page · raw message
Signature · 1 line
2.6.1