Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1412770 > unrolled thread
| Started by | Jaegeuk Kim <jaegeuk@kernel.org> |
|---|---|
| First post | 2016-06-03 06:00 +0200 |
| Last post | 2016-06-03 06:00 +0200 |
| Articles | 4 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200
[PATCH 2/8] f2fs: remove deprecated parameter Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200
[PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200
[PATCH 3/8] f2fs: avoid wrong count on dirty inodes Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200
| From | Jaegeuk Kim <jaegeuk@kernel.org> |
|---|---|
| Date | 2016-06-03 06:00 +0200 |
| Subject | [PATCH 1/8] f2fs: reuse nid if it was cached only |
| Message-ID | <rFOr7-6ts-3@gated-at.bofh.it> |
If nid's block address is assigned as:
NULL_ADDR -> NEW_ADDR -> NULL_ADDR, we can reset this nid, since its node page
has never written back.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/node.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 16532b3..15f55ae 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -317,10 +317,16 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
}
/* change address */
- nat_set_blkaddr(e, new_blkaddr);
- if (new_blkaddr == NEW_ADDR || new_blkaddr == NULL_ADDR)
- set_nat_flag(e, IS_CHECKPOINTED, false);
- __set_nat_cache_dirty(nm_i, e);
+ if (nat_get_blkaddr(e) == NEW_ADDR && new_blkaddr == NULL_ADDR) {
+ nat_set_blkaddr(e, new_blkaddr);
+ nat_reset_flag(e);
+ __clear_nat_cache_dirty(nm_i, e);
+ } else {
+ nat_set_blkaddr(e, new_blkaddr);
+ if (new_blkaddr == NEW_ADDR || new_blkaddr == NULL_ADDR)
+ set_nat_flag(e, IS_CHECKPOINTED, false);
+ __set_nat_cache_dirty(nm_i, e);
+ }
/* update fsync_mark if its inode nat entry is still alive */
if (ni->nid != ni->ino)
--
2.6.3
[toc] | [next] | [standalone]
| From | Jaegeuk Kim <jaegeuk@kernel.org> |
|---|---|
| Date | 2016-06-03 06:00 +0200 |
| Subject | [PATCH 2/8] f2fs: remove deprecated parameter |
| Message-ID | <rFOr7-6ts-15@gated-at.bofh.it> |
| In reply to | #1412770 |
Remove deprecated paramter.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/dir.c | 4 ++--
fs/f2fs/f2fs.h | 2 +-
fs/f2fs/inline.c | 5 ++---
3 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 6fbb1ed..f6ab3c2 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -664,7 +664,7 @@ fail:
return err;
}
-void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
+void f2fs_drop_nlink(struct inode *dir, struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
@@ -723,7 +723,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
mark_inode_dirty_sync(dir);
if (inode)
- f2fs_drop_nlink(dir, inode, NULL);
+ f2fs_drop_nlink(dir, inode);
if (bit_pos == NR_DENTRY_IN_BLOCK &&
!truncate_hole(dir, page->index, page->index + 1)) {
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index c4697b7..498c736 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1915,7 +1915,7 @@ struct page *init_inode_metadata(struct inode *, struct inode *,
const struct qstr *, struct page *);
void update_parent_metadata(struct inode *, struct inode *, unsigned int);
int room_for_filename(const void *, int, int);
-void f2fs_drop_nlink(struct inode *, struct inode *, struct page *);
+void f2fs_drop_nlink(struct inode *, struct inode *);
struct f2fs_dir_entry *f2fs_find_entry(struct inode *, struct qstr *,
struct page **);
struct f2fs_dir_entry *f2fs_parent_dir(struct inode *, struct page **);
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
index 1eb3043..669f92f 100644
--- a/fs/f2fs/inline.c
+++ b/fs/f2fs/inline.c
@@ -582,14 +582,13 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
&inline_dentry->dentry_bitmap);
set_page_dirty(page);
+ f2fs_put_page(page, 1);
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
mark_inode_dirty_sync(dir);
if (inode)
- f2fs_drop_nlink(dir, inode, page);
-
- f2fs_put_page(page, 1);
+ f2fs_drop_nlink(dir, inode);
}
bool f2fs_empty_inline_dir(struct inode *dir)
--
2.6.3
[toc] | [prev] | [next] | [standalone]
| From | Jaegeuk Kim <jaegeuk@kernel.org> |
|---|---|
| Date | 2016-06-03 06:00 +0200 |
| Subject | [PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode |
| Message-ID | <rFOr8-6ts-27@gated-at.bofh.it> |
| In reply to | #1412770 |
FI_DIRTY_INODE flag is not covered by inode page lock, so it can be unset
at any time like below.
Thread #1 Thread #2
- lock_page(ipage)
- update i_fields
- update i_size/i_blocks/and so on
- set FI_DIRTY_INODE
- reset FI_DIRTY_INODE
- set_page_dirty(ipage)
In this case, we can lose the latest i_field information.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/inode.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index fb3d9bd..63c4326 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -231,6 +231,8 @@ int update_inode(struct inode *inode, struct page *node_page)
{
struct f2fs_inode *ri;
+ f2fs_inode_synced(inode);
+
f2fs_wait_on_page_writeback(node_page, NODE, true);
ri = F2FS_INODE(node_page);
@@ -265,7 +267,6 @@ int update_inode(struct inode *inode, struct page *node_page)
__set_inode_rdev(inode, ri);
set_cold_node(inode, node_page);
- f2fs_inode_synced(inode);
/* deleted inode */
if (inode->i_nlink == 0)
--
2.6.3
[toc] | [prev] | [next] | [standalone]
| From | Jaegeuk Kim <jaegeuk@kernel.org> |
|---|---|
| Date | 2016-06-03 06:00 +0200 |
| Subject | [PATCH 3/8] f2fs: avoid wrong count on dirty inodes |
| Message-ID | <rFOr7-6ts-17@gated-at.bofh.it> |
| In reply to | #1412770 |
The number should be covered by spin_lock. Otherwise we can see wrong count in f2fs_stat. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fs/f2fs/super.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 27f76819e..9e75433 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -645,8 +645,8 @@ static void f2fs_dirty_inode(struct inode *inode, int flags) list_add_tail(&F2FS_I(inode)->gdirty_list, &sbi->inode_list[DIRTY_META]); inc_page_count(sbi, F2FS_DIRTY_IMETA); - spin_unlock(&sbi->inode_lock[DIRTY_META]); stat_inc_dirty_inode(sbi, DIRTY_META); + spin_unlock(&sbi->inode_lock[DIRTY_META]); } void f2fs_inode_synced(struct inode *inode) @@ -662,8 +662,8 @@ void f2fs_inode_synced(struct inode *inode) clear_inode_flag(inode, FI_DIRTY_INODE); clear_inode_flag(inode, FI_AUTO_RECOVER); dec_page_count(sbi, F2FS_DIRTY_IMETA); - spin_unlock(&sbi->inode_lock[DIRTY_META]); stat_dec_dirty_inode(F2FS_I_SB(inode), DIRTY_META); + spin_unlock(&sbi->inode_lock[DIRTY_META]); } static void f2fs_i_callback(struct rcu_head *head) -- 2.6.3
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web