Merge tag 'f2fs-for-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
Pull f2fs updates from Jaegeuk Kim: "We've continued mainly to fix bugs in this round, as f2fs has been shipped in more devices. Especially, we've focused on stabilizing checkpoint=disable feature, and provided some interfaces for QA. Enhancements: - expose FS_NOCOW_FL for pin_file - run discard jobs at unmount time with timeout - tune discarding thread to avoid idling which consumes power - some checking codes to address vulnerabilities - give random value to i_generation - shutdown with more flags for QA Bug fixes: - clean up stale objects when mount is failed along with checkpoint=disable - fix system being stuck due to wrong count by atomic writes - handle some corrupted disk cases - fix a deadlock in f2fs_read_inline_dir We've also added some minor build error fixes and clean-up patches" * tag 'f2fs-for-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (53 commits) f2fs: set pin_file under CAP_SYS_ADMIN f2fs: fix to avoid deadlock in f2fs_read_inline_dir() f2fs: fix to adapt small inline xattr space in __find_inline_xattr() f2fs: fix to do sanity check with inode.i_inline_xattr_size f2fs: give some messages for inline_xattr_size f2fs: don't trigger read IO for beyond EOF page f2fs: fix to add refcount once page is tagged PG_private f2fs: remove wrong comment in f2fs_invalidate_page() f2fs: fix to use kvfree instead of kzfree f2fs: print more parameters in trace_f2fs_map_blocks f2fs: trace f2fs_ioc_shutdown f2fs: fix to avoid deadlock of atomic file operations f2fs: fix to dirty inode for i_mode recovery f2fs: give random value to i_generation f2fs: no need to take page lock in readdir f2fs: fix to update iostat correctly in IPU path f2fs: fix encrypted page memory leak f2fs: make fault injection covering __submit_flush_wait() f2fs: fix to retry fill_super only if recovery failed f2fs: silence VM_WARN_ON_ONCE in mempool_alloc ...
This commit is contained in:
@@ -190,6 +190,8 @@ enum {
|
||||
#define DEF_CP_INTERVAL 60 /* 60 secs */
|
||||
#define DEF_IDLE_INTERVAL 5 /* 5 secs */
|
||||
#define DEF_DISABLE_INTERVAL 5 /* 5 secs */
|
||||
#define DEF_DISABLE_QUICK_INTERVAL 1 /* 1 secs */
|
||||
#define DEF_UMOUNT_DISCARD_TIMEOUT 5 /* 5 secs */
|
||||
|
||||
struct cp_control {
|
||||
int reason;
|
||||
@@ -253,7 +255,7 @@ struct discard_entry {
|
||||
/* max discard pend list number */
|
||||
#define MAX_PLIST_NUM 512
|
||||
#define plist_idx(blk_num) ((blk_num) >= MAX_PLIST_NUM ? \
|
||||
(MAX_PLIST_NUM - 1) : (blk_num - 1))
|
||||
(MAX_PLIST_NUM - 1) : ((blk_num) - 1))
|
||||
|
||||
enum {
|
||||
D_PREP, /* initial */
|
||||
@@ -309,6 +311,7 @@ struct discard_policy {
|
||||
bool sync; /* submit discard with REQ_SYNC flag */
|
||||
bool ordered; /* issue discard by lba order */
|
||||
unsigned int granularity; /* discard granularity */
|
||||
int timeout; /* discard timeout for put_super */
|
||||
};
|
||||
|
||||
struct discard_cmd_control {
|
||||
@@ -455,7 +458,6 @@ struct f2fs_flush_device {
|
||||
|
||||
/* for inline stuff */
|
||||
#define DEF_INLINE_RESERVED_SIZE 1
|
||||
#define DEF_MIN_INLINE_SIZE 1
|
||||
static inline int get_extra_isize(struct inode *inode);
|
||||
static inline int get_inline_xattr_addrs(struct inode *inode);
|
||||
#define MAX_INLINE_DATA(inode) (sizeof(__le32) * \
|
||||
@@ -1098,6 +1100,7 @@ enum {
|
||||
SBI_IS_SHUTDOWN, /* shutdown by ioctl */
|
||||
SBI_IS_RECOVERED, /* recovered orphan/data */
|
||||
SBI_CP_DISABLED, /* CP was disabled last mount */
|
||||
SBI_CP_DISABLED_QUICK, /* CP was disabled quickly */
|
||||
SBI_QUOTA_NEED_FLUSH, /* need to flush quota info in CP */
|
||||
SBI_QUOTA_SKIP_FLUSH, /* skip flushing quota in current CP */
|
||||
SBI_QUOTA_NEED_REPAIR, /* quota file may be corrupted */
|
||||
@@ -1109,6 +1112,7 @@ enum {
|
||||
DISCARD_TIME,
|
||||
GC_TIME,
|
||||
DISABLE_TIME,
|
||||
UMOUNT_DISCARD_TIMEOUT,
|
||||
MAX_TIME,
|
||||
};
|
||||
|
||||
@@ -1237,8 +1241,6 @@ struct f2fs_sb_info {
|
||||
|
||||
unsigned int nquota_files; /* # of quota sysfile */
|
||||
|
||||
u32 s_next_generation; /* for NFS support */
|
||||
|
||||
/* # of pages, see count_type */
|
||||
atomic_t nr_pages[NR_COUNT_TYPE];
|
||||
/* # of allocated blocks */
|
||||
@@ -1798,13 +1800,12 @@ static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type)
|
||||
{
|
||||
atomic_inc(&sbi->nr_pages[count_type]);
|
||||
|
||||
if (count_type == F2FS_DIRTY_DATA || count_type == F2FS_INMEM_PAGES ||
|
||||
count_type == F2FS_WB_CP_DATA || count_type == F2FS_WB_DATA ||
|
||||
count_type == F2FS_RD_DATA || count_type == F2FS_RD_NODE ||
|
||||
count_type == F2FS_RD_META)
|
||||
return;
|
||||
|
||||
set_sbi_flag(sbi, SBI_IS_DIRTY);
|
||||
if (count_type == F2FS_DIRTY_DENTS ||
|
||||
count_type == F2FS_DIRTY_NODES ||
|
||||
count_type == F2FS_DIRTY_META ||
|
||||
count_type == F2FS_DIRTY_QDATA ||
|
||||
count_type == F2FS_DIRTY_IMETA)
|
||||
set_sbi_flag(sbi, SBI_IS_DIRTY);
|
||||
}
|
||||
|
||||
static inline void inode_inc_dirty_pages(struct inode *inode)
|
||||
@@ -2156,10 +2157,17 @@ static inline bool is_idle(struct f2fs_sb_info *sbi, int type)
|
||||
get_pages(sbi, F2FS_RD_META) || get_pages(sbi, F2FS_WB_DATA) ||
|
||||
get_pages(sbi, F2FS_WB_CP_DATA) ||
|
||||
get_pages(sbi, F2FS_DIO_READ) ||
|
||||
get_pages(sbi, F2FS_DIO_WRITE) ||
|
||||
atomic_read(&SM_I(sbi)->dcc_info->queued_discard) ||
|
||||
atomic_read(&SM_I(sbi)->fcc_info->queued_flush))
|
||||
get_pages(sbi, F2FS_DIO_WRITE))
|
||||
return false;
|
||||
|
||||
if (SM_I(sbi) && SM_I(sbi)->dcc_info &&
|
||||
atomic_read(&SM_I(sbi)->dcc_info->queued_discard))
|
||||
return false;
|
||||
|
||||
if (SM_I(sbi) && SM_I(sbi)->fcc_info &&
|
||||
atomic_read(&SM_I(sbi)->fcc_info->queued_flush))
|
||||
return false;
|
||||
|
||||
return f2fs_time_over(sbi, type);
|
||||
}
|
||||
|
||||
@@ -2300,11 +2308,12 @@ static inline void f2fs_change_bit(unsigned int nr, char *addr)
|
||||
#define F2FS_EXTENTS_FL 0x00080000 /* Inode uses extents */
|
||||
#define F2FS_EA_INODE_FL 0x00200000 /* Inode used for large EA */
|
||||
#define F2FS_EOFBLOCKS_FL 0x00400000 /* Blocks allocated beyond EOF */
|
||||
#define F2FS_NOCOW_FL 0x00800000 /* Do not cow file */
|
||||
#define F2FS_INLINE_DATA_FL 0x10000000 /* Inode has inline data. */
|
||||
#define F2FS_PROJINHERIT_FL 0x20000000 /* Create with parents projid */
|
||||
#define F2FS_RESERVED_FL 0x80000000 /* reserved for ext4 lib */
|
||||
|
||||
#define F2FS_FL_USER_VISIBLE 0x304BDFFF /* User visible flags */
|
||||
#define F2FS_FL_USER_VISIBLE 0x30CBDFFF /* User visible flags */
|
||||
#define F2FS_FL_USER_MODIFIABLE 0x204BC0FF /* User modifiable flags */
|
||||
|
||||
/* Flags we can manipulate with through F2FS_IOC_FSSETXATTR */
|
||||
@@ -2761,9 +2770,9 @@ static inline int get_inline_xattr_addrs(struct inode *inode)
|
||||
|
||||
#define F2FS_OLD_ATTRIBUTE_SIZE (offsetof(struct f2fs_inode, i_addr))
|
||||
#define F2FS_FITS_IN_INODE(f2fs_inode, extra_isize, field) \
|
||||
((offsetof(typeof(*f2fs_inode), field) + \
|
||||
((offsetof(typeof(*(f2fs_inode)), field) + \
|
||||
sizeof((f2fs_inode)->field)) \
|
||||
<= (F2FS_OLD_ATTRIBUTE_SIZE + extra_isize)) \
|
||||
<= (F2FS_OLD_ATTRIBUTE_SIZE + (extra_isize))) \
|
||||
|
||||
static inline void f2fs_reset_iostat(struct f2fs_sb_info *sbi)
|
||||
{
|
||||
@@ -2792,8 +2801,8 @@ static inline void f2fs_update_iostat(struct f2fs_sb_info *sbi,
|
||||
|
||||
#define __is_large_section(sbi) ((sbi)->segs_per_sec > 1)
|
||||
|
||||
#define __is_meta_io(fio) (PAGE_TYPE_OF_BIO(fio->type) == META && \
|
||||
(!is_read_io(fio->op) || fio->is_meta))
|
||||
#define __is_meta_io(fio) (PAGE_TYPE_OF_BIO((fio)->type) == META && \
|
||||
(!is_read_io((fio)->op) || (fio)->is_meta))
|
||||
|
||||
bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi,
|
||||
block_t blkaddr, int type);
|
||||
@@ -2825,13 +2834,33 @@ static inline bool is_valid_data_blkaddr(struct f2fs_sb_info *sbi,
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline void f2fs_set_page_private(struct page *page,
|
||||
unsigned long data)
|
||||
{
|
||||
if (PagePrivate(page))
|
||||
return;
|
||||
|
||||
get_page(page);
|
||||
SetPagePrivate(page);
|
||||
set_page_private(page, data);
|
||||
}
|
||||
|
||||
static inline void f2fs_clear_page_private(struct page *page)
|
||||
{
|
||||
if (!PagePrivate(page))
|
||||
return;
|
||||
|
||||
set_page_private(page, 0);
|
||||
ClearPagePrivate(page);
|
||||
f2fs_put_page(page, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* file.c
|
||||
*/
|
||||
int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync);
|
||||
void f2fs_truncate_data_blocks(struct dnode_of_data *dn);
|
||||
int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock,
|
||||
bool buf_write);
|
||||
int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock);
|
||||
int f2fs_truncate(struct inode *inode);
|
||||
int f2fs_getattr(const struct path *path, struct kstat *stat,
|
||||
u32 request_mask, unsigned int flags);
|
||||
@@ -3005,7 +3034,7 @@ void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr);
|
||||
bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr);
|
||||
void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi);
|
||||
void f2fs_stop_discard_thread(struct f2fs_sb_info *sbi);
|
||||
bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi);
|
||||
bool f2fs_issue_discard_timeout(struct f2fs_sb_info *sbi);
|
||||
void f2fs_clear_prefree_segments(struct f2fs_sb_info *sbi,
|
||||
struct cp_control *cpc);
|
||||
void f2fs_dirty_to_prefree(struct f2fs_sb_info *sbi);
|
||||
@@ -3610,8 +3639,6 @@ extern void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
|
||||
#define f2fs_build_fault_attr(sbi, rate, type) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
static inline bool is_journalled_quota(struct f2fs_sb_info *sbi)
|
||||
{
|
||||
#ifdef CONFIG_QUOTA
|
||||
@@ -3624,3 +3651,5 @@ static inline bool is_journalled_quota(struct f2fs_sb_info *sbi)
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user