aboutsummaryrefslogtreecommitdiff
path: root/fs/f2fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2016-06-30 19:09:37 -0700
committerMister Oyster <oysterized@gmail.com>2017-04-13 12:33:52 +0200
commit1dbd56cebb8ff16659cd19151210fea5037bf5fc (patch)
tree95e1fee9f00886e93a5dcfcbd44327f0d08c0d83 /fs/f2fs
parent1946c4e654b8150c56d73d13a23e0172d30942ff (diff)
f2fs: avoid mark_inode_dirty
Let's check inode's dirtiness before calling mark_inode_dirty. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/acl.c4
-rw-r--r--fs/f2fs/dir.c6
-rw-r--r--fs/f2fs/extent_cache.c2
-rw-r--r--fs/f2fs/f2fs.h24
-rw-r--r--fs/f2fs/file.c8
-rw-r--r--fs/f2fs/inline.c2
-rw-r--r--fs/f2fs/inode.c9
-rw-r--r--fs/f2fs/namei.c2
-rw-r--r--fs/f2fs/super.c37
-rw-r--r--fs/f2fs/xattr.c4
10 files changed, 58 insertions, 40 deletions
diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
index ee05dbd69..57439fd40 100644
--- a/fs/f2fs/acl.c
+++ b/fs/f2fs/acl.c
@@ -246,7 +246,7 @@ static int f2fs_set_acl(struct inode *inode, int type,
return -EINVAL;
}
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
if (acl) {
value = f2fs_acl_to_disk(acl, &size);
@@ -297,7 +297,7 @@ int f2fs_init_acl(struct inode *inode, struct inode *dir, struct page *ipage,
if (error > 0)
error = f2fs_set_acl(inode, ACL_TYPE_ACCESS, acl, ipage);
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
cleanup:
posix_acl_release(acl);
return error;
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 556a59b52..b9b0bd96f 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -301,7 +301,7 @@ void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
set_page_dirty(page);
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
- mark_inode_dirty_sync(dir);
+ f2fs_mark_inode_dirty_sync(dir);
f2fs_put_page(page, 1);
}
@@ -453,7 +453,7 @@ void update_parent_metadata(struct inode *dir, struct inode *inode,
clear_inode_flag(inode, FI_NEW_INODE);
}
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
- mark_inode_dirty_sync(dir);
+ f2fs_mark_inode_dirty_sync(dir);
if (F2FS_I(dir)->i_current_depth != current_depth)
f2fs_i_depth_write(dir, current_depth);
@@ -705,7 +705,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
set_page_dirty(page);
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
- mark_inode_dirty_sync(dir);
+ f2fs_mark_inode_dirty_sync(dir);
if (inode)
f2fs_drop_nlink(dir, inode);
diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c
index e858869d7..5b4b6d426 100644
--- a/fs/f2fs/extent_cache.c
+++ b/fs/f2fs/extent_cache.c
@@ -172,7 +172,7 @@ static void __drop_largest_extent(struct inode *inode,
if (fofs < largest->fofs + largest->len && fofs + len > largest->fofs) {
largest->len = 0;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
}
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 12afbd991..00fb0e8e4 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -537,12 +537,13 @@ static inline bool __is_front_mergeable(struct extent_info *cur,
return __is_extent_mergeable(cur, front);
}
+extern void f2fs_mark_inode_dirty_sync(struct inode *);
static inline void __try_update_largest_extent(struct inode *inode,
struct extent_tree *et, struct extent_node *en)
{
if (en->ei.len > et->largest.len) {
et->largest = en->ei;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
}
@@ -1587,7 +1588,7 @@ static inline void __mark_inode_dirty_flag(struct inode *inode,
return;
case FI_DATA_EXIST:
case FI_INLINE_DOTS:
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
}
@@ -1614,7 +1615,7 @@ static inline void set_acl_inode(struct inode *inode, umode_t mode)
{
F2FS_I(inode)->i_acl_mode = mode;
set_inode_flag(inode, FI_ACL_MODE);
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static inline void f2fs_i_links_write(struct inode *inode, bool inc)
@@ -1623,7 +1624,7 @@ static inline void f2fs_i_links_write(struct inode *inode, bool inc)
inc_nlink(inode);
else
drop_nlink(inode);
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static inline void f2fs_i_blocks_write(struct inode *inode,
@@ -1634,7 +1635,7 @@ static inline void f2fs_i_blocks_write(struct inode *inode,
inode->i_blocks = add ? inode->i_blocks + diff :
inode->i_blocks - diff;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
if (clean || recover)
set_inode_flag(inode, FI_AUTO_RECOVER);
}
@@ -1648,7 +1649,7 @@ static inline void f2fs_i_size_write(struct inode *inode, loff_t i_size)
return;
i_size_write(inode, i_size);
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
if (clean || recover)
set_inode_flag(inode, FI_AUTO_RECOVER);
}
@@ -1663,19 +1664,19 @@ static inline bool f2fs_skip_inode_update(struct inode *inode)
static inline void f2fs_i_depth_write(struct inode *inode, unsigned int depth)
{
F2FS_I(inode)->i_current_depth = depth;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static inline void f2fs_i_xnid_write(struct inode *inode, nid_t xnid)
{
F2FS_I(inode)->i_xattr_nid = xnid;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static inline void f2fs_i_pino_write(struct inode *inode, nid_t pino)
{
F2FS_I(inode)->i_pino = pino;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri)
@@ -1803,13 +1804,13 @@ static inline int is_file(struct inode *inode, int type)
static inline void set_file(struct inode *inode, int type)
{
F2FS_I(inode)->i_advise |= type;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static inline void clear_file(struct inode *inode, int type)
{
F2FS_I(inode)->i_advise &= ~type;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static inline int f2fs_readonly(struct super_block *sb)
@@ -1967,6 +1968,7 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
/*
* super.c
*/
+int f2fs_inode_dirtied(struct inode *);
void f2fs_inode_synced(struct inode *);
int f2fs_commit_super(struct f2fs_sb_info *, bool);
int f2fs_sync_fs(struct super_block *, int);
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 34a1b16c3..0d35fb267 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -263,7 +263,7 @@ sync_nodes:
}
if (need_inode_block_update(sbi, ino)) {
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
f2fs_write_inode(inode, NULL);
goto sync_nodes;
}
@@ -650,7 +650,7 @@ int f2fs_truncate(struct inode *inode)
return err;
inode->i_mtime = inode->i_ctime = CURRENT_TIME;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
return 0;
}
@@ -740,7 +740,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
}
}
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
return err;
}
@@ -1304,7 +1304,7 @@ static long f2fs_fallocate(struct file *file, int mode,
if (!ret) {
inode->i_mtime = inode->i_ctime = CURRENT_TIME;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
}
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
index e4797c170..c698bd16b 100644
--- a/fs/f2fs/inline.c
+++ b/fs/f2fs/inline.c
@@ -569,7 +569,7 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
f2fs_put_page(page, 1);
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
- mark_inode_dirty_sync(dir);
+ f2fs_mark_inode_dirty_sync(dir);
if (inode)
f2fs_drop_nlink(dir, inode);
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index 0928a836d..e9c98acfd 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -18,6 +18,13 @@
#include <trace/events/f2fs.h>
+void f2fs_mark_inode_dirty_sync(struct inode *inode)
+{
+ if (f2fs_inode_dirtied(inode))
+ return;
+ mark_inode_dirty_sync(inode);
+}
+
void f2fs_set_inode_flags(struct inode *inode)
{
unsigned int flags = F2FS_I(inode)->i_flags;
@@ -35,7 +42,7 @@ void f2fs_set_inode_flags(struct inode *inode)
new_fl |= S_DIRSYNC;
set_mask_bits(&inode->i_flags,
S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC, new_fl);
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
}
static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index dfc476e5e..b702217b1 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -688,7 +688,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
up_write(&F2FS_I(old_inode)->i_sem);
old_inode->i_ctime = CURRENT_TIME;
- mark_inode_dirty_sync(old_inode);
+ f2fs_mark_inode_dirty_sync(old_inode);
f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 838531904..c63782ec3 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -614,26 +614,14 @@ static int f2fs_drop_inode(struct inode *inode)
return generic_drop_inode(inode);
}
-/*
- * f2fs_dirty_inode() is called from __mark_inode_dirty()
- *
- * We should call set_dirty_inode to write the dirty inode through write_inode.
- */
-static void f2fs_dirty_inode(struct inode *inode, int flags)
+int f2fs_inode_dirtied(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
- if (inode->i_ino == F2FS_NODE_INO(sbi) ||
- inode->i_ino == F2FS_META_INO(sbi))
- return;
-
- if (is_inode_flag_set(inode, FI_AUTO_RECOVER))
- clear_inode_flag(inode, FI_AUTO_RECOVER);
-
spin_lock(&sbi->inode_lock[DIRTY_META]);
if (is_inode_flag_set(inode, FI_DIRTY_INODE)) {
spin_unlock(&sbi->inode_lock[DIRTY_META]);
- return;
+ return 1;
}
set_inode_flag(inode, FI_DIRTY_INODE);
@@ -642,6 +630,8 @@ static void f2fs_dirty_inode(struct inode *inode, int flags)
inc_page_count(sbi, F2FS_DIRTY_IMETA);
stat_inc_dirty_inode(sbi, DIRTY_META);
spin_unlock(&sbi->inode_lock[DIRTY_META]);
+
+ return 0;
}
void f2fs_inode_synced(struct inode *inode)
@@ -661,6 +651,25 @@ void f2fs_inode_synced(struct inode *inode)
spin_unlock(&sbi->inode_lock[DIRTY_META]);
}
+/*
+ * f2fs_dirty_inode() is called from __mark_inode_dirty()
+ *
+ * We should call set_dirty_inode to write the dirty inode through write_inode.
+ */
+static void f2fs_dirty_inode(struct inode *inode, int flags)
+{
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+
+ if (inode->i_ino == F2FS_NODE_INO(sbi) ||
+ inode->i_ino == F2FS_META_INO(sbi))
+ return;
+
+ if (is_inode_flag_set(inode, FI_AUTO_RECOVER))
+ clear_inode_flag(inode, FI_AUTO_RECOVER);
+
+ f2fs_inode_dirtied(inode);
+}
+
static void f2fs_i_callback(struct rcu_head *head)
{
struct inode *inode = container_of(head, struct inode, i_rcu);
diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c
index a7419dc1e..f3da0feb0 100644
--- a/fs/f2fs/xattr.c
+++ b/fs/f2fs/xattr.c
@@ -152,7 +152,7 @@ static int f2fs_xattr_advise_set(struct dentry *dentry, const char *name,
return -EINVAL;
F2FS_I(inode)->i_advise |= *(char *)value;
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
return 0;
}
@@ -588,7 +588,7 @@ static int __f2fs_setxattr(struct inode *inode, int index,
if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
!strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
f2fs_set_encrypted_inode(inode);
- mark_inode_dirty_sync(inode);
+ f2fs_mark_inode_dirty_sync(inode);
exit:
kzfree(base_addr);
return error;