* [PATCH 1/4] f2fs: update_inode_page should be done all the time
@ 2014-01-28 5:54 Jaegeuk Kim
2014-01-28 5:54 ` [PATCH 2/4] f2fs: handle dirty segments inside refresh_sit_entry Jaegeuk Kim
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Jaegeuk Kim @ 2014-01-28 5:54 UTC (permalink / raw)
Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel
In order to make fs consistency, update_inode_page should not be failed all
the time. Otherwise, it is possible to lose some metadata in the inode like
a link count.
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
---
fs/f2fs/data.c | 3 +--
fs/f2fs/f2fs.h | 8 +++++++-
fs/f2fs/inode.c | 20 ++++++++++++--------
3 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 0ae5587..6827359 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -62,8 +62,7 @@ static void f2fs_write_end_io(struct bio *bio, int err)
if (unlikely(!uptodate)) {
SetPageError(page);
set_bit(AS_EIO, &page->mapping->flags);
- set_ckpt_flags(sbi->ckpt, CP_ERROR_FLAG);
- sbi->sb->s_flags |= MS_RDONLY;
+ f2fs_stop_checkpoint(sbi);
}
end_page_writeback(page);
dec_page_count(sbi, F2FS_WRITEBACK);
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index af51a0b..42903c3 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1023,6 +1023,12 @@ static inline int f2fs_readonly(struct super_block *sb)
return sb->s_flags & MS_RDONLY;
}
+static inline void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi)
+{
+ set_ckpt_flags(sbi->ckpt, CP_ERROR_FLAG);
+ sbi->sb->s_flags |= MS_RDONLY;
+}
+
/*
* file.c
*/
@@ -1044,7 +1050,7 @@ void f2fs_set_inode_flags(struct inode *);
struct inode *f2fs_iget(struct super_block *, unsigned long);
int try_to_free_nats(struct f2fs_sb_info *, int);
void update_inode(struct inode *, struct page *);
-int update_inode_page(struct inode *);
+void update_inode_page(struct inode *);
int f2fs_write_inode(struct inode *, struct writeback_control *);
void f2fs_evict_inode(struct inode *);
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index 4d67ed7..1a4ba27 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -212,24 +212,28 @@ void update_inode(struct inode *inode, struct page *node_page)
clear_inode_flag(F2FS_I(inode), FI_DIRTY_INODE);
}
-int update_inode_page(struct inode *inode)
+void update_inode_page(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
struct page *node_page;
-
+retry:
node_page = get_node_page(sbi, inode->i_ino);
- if (IS_ERR(node_page))
- return PTR_ERR(node_page);
+ if (IS_ERR(node_page)) {
+ if (PTR_ERR(node_page) == -ENOMEM) {
+ cond_resched();
+ goto retry;
+ } else {
+ f2fs_stop_checkpoint(sbi);
+ }
+ }
update_inode(inode, node_page);
f2fs_put_page(node_page, 1);
- return 0;
}
int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)
{
struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
- int ret;
if (inode->i_ino == F2FS_NODE_INO(sbi) ||
inode->i_ino == F2FS_META_INO(sbi))
@@ -243,13 +247,13 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)
* during the urgent cleaning time when runing out of free sections.
*/
f2fs_lock_op(sbi);
- ret = update_inode_page(inode);
+ update_inode_page(inode);
f2fs_unlock_op(sbi);
if (wbc)
f2fs_balance_fs(sbi);
- return ret;
+ return 0;
}
/*
--
1.8.4.474.g128a96c
------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable
security intelligence. It gives you real-time visual feedback on key
security issues and trends. Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/4] f2fs: handle dirty segments inside refresh_sit_entry 2014-01-28 5:54 [PATCH 1/4] f2fs: update_inode_page should be done all the time Jaegeuk Kim @ 2014-01-28 5:54 ` Jaegeuk Kim 2014-02-05 9:49 ` Changman Lee 2014-01-28 5:54 ` [PATCH 3/4] f2fs: fix to recover xattr node block Jaegeuk Kim 2014-01-28 5:54 ` [PATCH 4/4] f2fs: fix a build warning Jaegeuk Kim 2 siblings, 1 reply; 5+ messages in thread From: Jaegeuk Kim @ 2014-01-28 5:54 UTC (permalink / raw) Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel This patch cleans up the refresh_sit_entry to handle locate_dirty_segments. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> --- fs/f2fs/f2fs.h | 1 + fs/f2fs/segment.c | 19 ++++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 42903c3..6e9515d 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1132,6 +1132,7 @@ void destroy_node_manager_caches(void); void f2fs_balance_fs(struct f2fs_sb_info *); void f2fs_balance_fs_bg(struct f2fs_sb_info *); void invalidate_blocks(struct f2fs_sb_info *, block_t); +void refresh_sit_entry(struct f2fs_sb_info *, block_t, block_t); void clear_prefree_segments(struct f2fs_sb_info *); int npages_for_summary_flush(struct f2fs_sb_info *); void allocate_new_segments(struct f2fs_sb_info *); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 7caac5f..89aa503 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -434,12 +434,14 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) get_sec_entry(sbi, segno)->valid_blocks += del; } -static void refresh_sit_entry(struct f2fs_sb_info *sbi, - block_t old_blkaddr, block_t new_blkaddr) +void refresh_sit_entry(struct f2fs_sb_info *sbi, block_t old, block_t new) { - update_sit_entry(sbi, new_blkaddr, 1); - if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) - update_sit_entry(sbi, old_blkaddr, -1); + update_sit_entry(sbi, new, 1); + if (GET_SEGNO(sbi, old) != NULL_SEGNO) + update_sit_entry(sbi, old, -1); + + locate_dirty_segment(sbi, GET_SEGNO(sbi, old)); + locate_dirty_segment(sbi, GET_SEGNO(sbi, new)); } void invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr) @@ -886,12 +888,11 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, * since SSR needs latest valid block information. */ refresh_sit_entry(sbi, old_blkaddr, *new_blkaddr); + locate_dirty_segment(sbi, old_cursegno); if (!__has_curseg_space(sbi, type)) sit_i->s_ops->allocate_segment(sbi, type, false); - locate_dirty_segment(sbi, old_cursegno); - locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); mutex_unlock(&sit_i->sentry_lock); if (page && IS_NODESEG(type)) @@ -992,9 +993,7 @@ void recover_data_page(struct f2fs_sb_info *sbi, __add_sum_entry(sbi, type, sum); refresh_sit_entry(sbi, old_blkaddr, new_blkaddr); - locate_dirty_segment(sbi, old_cursegno); - locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); mutex_unlock(&sit_i->sentry_lock); mutex_unlock(&curseg->curseg_mutex); @@ -1045,9 +1044,7 @@ void rewrite_node_page(struct f2fs_sb_info *sbi, f2fs_submit_page_mbio(sbi, page, new_blkaddr, &fio); f2fs_submit_merged_bio(sbi, NODE, WRITE); refresh_sit_entry(sbi, old_blkaddr, new_blkaddr); - locate_dirty_segment(sbi, old_cursegno); - locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); mutex_unlock(&sit_i->sentry_lock); mutex_unlock(&curseg->curseg_mutex); -- 1.8.4.474.g128a96c ------------------------------------------------------------------------------ WatchGuard Dimension instantly turns raw network data into actionable security intelligence. It gives you real-time visual feedback on key security issues and trends. Skip the complicated setup - simply import a virtual appliance and go from zero to informed in seconds. http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/4] f2fs: handle dirty segments inside refresh_sit_entry 2014-01-28 5:54 ` [PATCH 2/4] f2fs: handle dirty segments inside refresh_sit_entry Jaegeuk Kim @ 2014-02-05 9:49 ` Changman Lee 0 siblings, 0 replies; 5+ messages in thread From: Changman Lee @ 2014-02-05 9:49 UTC (permalink / raw) To: Jaegeuk Kim; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel Hi, I found some redundant code in your patch. I think that locate_dirty_segment(sbi, old_cursegno) equals to locate_dirty_segment(sbi, GET_SEGNO(sbi, new)) in refresh_sit_entry. Because *new_blkaddr is a block belonging to old_cursegno. How do you think? On 화, 2014-01-28 at 14:54 +0900, Jaegeuk Kim wrote: > This patch cleans up the refresh_sit_entry to handle locate_dirty_segments. > > Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> > --- > fs/f2fs/f2fs.h | 1 + > fs/f2fs/segment.c | 19 ++++++++----------- > 2 files changed, 9 insertions(+), 11 deletions(-) > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index 42903c3..6e9515d 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -1132,6 +1132,7 @@ void destroy_node_manager_caches(void); > void f2fs_balance_fs(struct f2fs_sb_info *); > void f2fs_balance_fs_bg(struct f2fs_sb_info *); > void invalidate_blocks(struct f2fs_sb_info *, block_t); > +void refresh_sit_entry(struct f2fs_sb_info *, block_t, block_t); > void clear_prefree_segments(struct f2fs_sb_info *); > int npages_for_summary_flush(struct f2fs_sb_info *); > void allocate_new_segments(struct f2fs_sb_info *); > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index 7caac5f..89aa503 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -434,12 +434,14 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) > get_sec_entry(sbi, segno)->valid_blocks += del; > } > > -static void refresh_sit_entry(struct f2fs_sb_info *sbi, > - block_t old_blkaddr, block_t new_blkaddr) > +void refresh_sit_entry(struct f2fs_sb_info *sbi, block_t old, block_t new) > { > - update_sit_entry(sbi, new_blkaddr, 1); > - if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) > - update_sit_entry(sbi, old_blkaddr, -1); > + update_sit_entry(sbi, new, 1); > + if (GET_SEGNO(sbi, old) != NULL_SEGNO) > + update_sit_entry(sbi, old, -1); > + > + locate_dirty_segment(sbi, GET_SEGNO(sbi, old)); > + locate_dirty_segment(sbi, GET_SEGNO(sbi, new)); > } > > void invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr) > @@ -886,12 +888,11 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, > * since SSR needs latest valid block information. > */ > refresh_sit_entry(sbi, old_blkaddr, *new_blkaddr); > + locate_dirty_segment(sbi, old_cursegno); > > if (!__has_curseg_space(sbi, type)) > sit_i->s_ops->allocate_segment(sbi, type, false); > > - locate_dirty_segment(sbi, old_cursegno); > - locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); > mutex_unlock(&sit_i->sentry_lock); > > if (page && IS_NODESEG(type)) > @@ -992,9 +993,7 @@ void recover_data_page(struct f2fs_sb_info *sbi, > __add_sum_entry(sbi, type, sum); > > refresh_sit_entry(sbi, old_blkaddr, new_blkaddr); > - > locate_dirty_segment(sbi, old_cursegno); > - locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); > > mutex_unlock(&sit_i->sentry_lock); > mutex_unlock(&curseg->curseg_mutex); > @@ -1045,9 +1044,7 @@ void rewrite_node_page(struct f2fs_sb_info *sbi, > f2fs_submit_page_mbio(sbi, page, new_blkaddr, &fio); > f2fs_submit_merged_bio(sbi, NODE, WRITE); > refresh_sit_entry(sbi, old_blkaddr, new_blkaddr); > - > locate_dirty_segment(sbi, old_cursegno); > - locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); > > mutex_unlock(&sit_i->sentry_lock); > mutex_unlock(&curseg->curseg_mutex); ------------------------------------------------------------------------------ Managing the Performance of Cloud-Based Applications Take advantage of what the Cloud has to offer - Avoid Common Pitfalls. Read the Whitepaper. http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 3/4] f2fs: fix to recover xattr node block 2014-01-28 5:54 [PATCH 1/4] f2fs: update_inode_page should be done all the time Jaegeuk Kim 2014-01-28 5:54 ` [PATCH 2/4] f2fs: handle dirty segments inside refresh_sit_entry Jaegeuk Kim @ 2014-01-28 5:54 ` Jaegeuk Kim 2014-01-28 5:54 ` [PATCH 4/4] f2fs: fix a build warning Jaegeuk Kim 2 siblings, 0 replies; 5+ messages in thread From: Jaegeuk Kim @ 2014-01-28 5:54 UTC (permalink / raw) Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel If a new xattr node page was allocated and its inode is fsynced, we should recover the xattr node page during the roll-forward process after power-cut. But, previously, f2fs didn't handle that case, resulting in kernel panic as follows reported by Tom Li. BUG: unable to handle kernel paging request at ffffc9001c861a98 IP: [<ffffffffa0295236>] check_index_in_prev_nodes+0x86/0x2d0 [f2fs] Call Trace: [<ffffffff815ece9b>] ? printk+0x48/0x4a [<ffffffffa029626a>] recover_fsync_data+0xdca/0xf50 [f2fs] [<ffffffffa02873ae>] f2fs_fill_super+0x92e/0x970 [f2fs] [<ffffffff8112c9f8>] mount_bdev+0x1b8/0x200 [<ffffffffa0286a80>] ? f2fs_remount+0x130/0x130 [f2fs] [<ffffffffa0285e40>] f2fs_mount+0x10/0x20 [f2fs] [<ffffffff8112d4de>] mount_fs+0x3e/0x1b0 [<ffffffff810ef4eb>] ? __alloc_percpu+0xb/0x10 [<ffffffff8114761f>] vfs_kern_mount+0x6f/0x120 [<ffffffff811497b9>] do_mount+0x259/0xa90 [<ffffffff810ead1d>] ? memdup_user+0x3d/0x80 [<ffffffff810eadb3>] ? strndup_user+0x53/0x70 [<ffffffff8114a2c9>] SyS_mount+0x89/0xd0 [<ffffffff815feae2>] system_call_fastpath+0x16/0x1b This patch adds a recovery function of xattr node pages. Reported-by: Tom Li <biergaizi@members.fsf.org> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> --- fs/f2fs/f2fs.h | 1 + fs/f2fs/node.c | 40 ++++++++++++++++++++++++++++++++++++++++ fs/f2fs/recovery.c | 3 +++ 3 files changed, 44 insertions(+) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 6e9515d..80a64fd 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1117,6 +1117,7 @@ void alloc_nid_done(struct f2fs_sb_info *, nid_t); void alloc_nid_failed(struct f2fs_sb_info *, nid_t); void recover_node_page(struct f2fs_sb_info *, struct page *, struct f2fs_summary *, struct node_info *, block_t); +bool recover_xattr_data(struct inode *, struct page *, block_t); int recover_inode_page(struct f2fs_sb_info *, struct page *); int restore_node_summary(struct f2fs_sb_info *, unsigned int, struct f2fs_summary_block *); diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index b0649b7..82f4753 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1535,6 +1535,46 @@ void recover_node_page(struct f2fs_sb_info *sbi, struct page *page, clear_node_page_dirty(page); } +bool recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr) +{ + struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); + nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid; + nid_t new_xnid = nid_of_node(page); + struct node_info ni; + + if (ofs_of_node(page) != XATTR_NODE_OFFSET) + return false; + + /* 1: invalidate the previous xattr nid */ + if (!prev_xnid) + goto recover_xnid; + + /* Deallocate node address */ + get_node_info(sbi, prev_xnid, &ni); + f2fs_bug_on(ni.blk_addr == NULL_ADDR); + invalidate_blocks(sbi, ni.blk_addr); + dec_valid_node_count(sbi, inode); + set_node_addr(sbi, &ni, NULL_ADDR); + +recover_xnid: + /* 2: allocate new xattr nid */ + if (unlikely(!inc_valid_node_count(sbi, inode))) + f2fs_bug_on(1); + + remove_free_nid(NM_I(sbi), new_xnid); + get_node_info(sbi, new_xnid, &ni); + ni.ino = inode->i_ino; + set_node_addr(sbi, &ni, NEW_ADDR); + F2FS_I(inode)->i_xattr_nid = new_xnid; + + /* 3: update xattr blkaddr */ + refresh_sit_entry(sbi, NEW_ADDR, blkaddr); + set_node_addr(sbi, &ni, blkaddr); + + update_inode_page(inode); + return true; +} + int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) { struct f2fs_inode *src, *dst; diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index 976a7a9..f1b0b89 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -301,6 +301,9 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, if (recover_inline_data(inode, page)) goto out; + if (recover_xattr_data(inode, page, blkaddr)) + goto out; + start = start_bidx_of_node(ofs_of_node(page), fi); if (IS_INODE(page)) end = start + ADDRS_PER_INODE(fi); -- 1.8.4.474.g128a96c ------------------------------------------------------------------------------ WatchGuard Dimension instantly turns raw network data into actionable security intelligence. It gives you real-time visual feedback on key security issues and trends. Skip the complicated setup - simply import a virtual appliance and go from zero to informed in seconds. http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/4] f2fs: fix a build warning 2014-01-28 5:54 [PATCH 1/4] f2fs: update_inode_page should be done all the time Jaegeuk Kim 2014-01-28 5:54 ` [PATCH 2/4] f2fs: handle dirty segments inside refresh_sit_entry Jaegeuk Kim 2014-01-28 5:54 ` [PATCH 3/4] f2fs: fix to recover xattr node block Jaegeuk Kim @ 2014-01-28 5:54 ` Jaegeuk Kim 2 siblings, 0 replies; 5+ messages in thread From: Jaegeuk Kim @ 2014-01-28 5:54 UTC (permalink / raw) Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel This patch modifies flow a little bit to avoid the following build warnings. src/fs/f2fs/recovery.c: In function ‘check_index_in_prev_nodes’: src/fs/f2fs/recovery.c:288:51: warning: ‘sum.<U5390>.<U52f8>.ofs_in_node’ may be used uninitialized in this function [-Wmaybe-uninitialized] src/fs/f2fs/recovery.c:260:23: warning: ‘sum.nid’ may be used uninitialized in this function [-Wmaybe-uninitialized] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> --- fs/f2fs/recovery.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index f1b0b89..cdc4bdd 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -220,11 +220,11 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi, unsigned int segno = GET_SEGNO(sbi, blkaddr); unsigned short blkoff = GET_SEGOFF_FROM_SEG0(sbi, blkaddr) & (sbi->blocks_per_seg - 1); + struct f2fs_summary_block *sum_node; struct f2fs_summary sum; + struct page *sum_page, *node_page; nid_t ino, nid; - void *kaddr; struct inode *inode; - struct page *node_page; unsigned int offset; block_t bidx; int i; @@ -238,18 +238,15 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi, struct curseg_info *curseg = CURSEG_I(sbi, i); if (curseg->segno == segno) { sum = curseg->sum_blk->entries[blkoff]; - break; + goto got_it; } } - if (i > CURSEG_COLD_DATA) { - struct page *sum_page = get_sum_page(sbi, segno); - struct f2fs_summary_block *sum_node; - kaddr = page_address(sum_page); - sum_node = (struct f2fs_summary_block *)kaddr; - sum = sum_node->entries[blkoff]; - f2fs_put_page(sum_page, 1); - } + sum_page = get_sum_page(sbi, segno); + sum_node = (struct f2fs_summary_block *)page_address(sum_page); + sum = sum_node->entries[blkoff]; + f2fs_put_page(sum_page, 1); +got_it: /* Use the locked dnode page and inode */ nid = le32_to_cpu(sum.nid); if (dn->inode->i_ino == nid) { -- 1.8.4.474.g128a96c ------------------------------------------------------------------------------ WatchGuard Dimension instantly turns raw network data into actionable security intelligence. It gives you real-time visual feedback on key security issues and trends. Skip the complicated setup - simply import a virtual appliance and go from zero to informed in seconds. http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-02-05 9:51 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-01-28 5:54 [PATCH 1/4] f2fs: update_inode_page should be done all the time Jaegeuk Kim 2014-01-28 5:54 ` [PATCH 2/4] f2fs: handle dirty segments inside refresh_sit_entry Jaegeuk Kim 2014-02-05 9:49 ` Changman Lee 2014-01-28 5:54 ` [PATCH 3/4] f2fs: fix to recover xattr node block Jaegeuk Kim 2014-01-28 5:54 ` [PATCH 4/4] f2fs: fix a build warning Jaegeuk Kim
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).