When get_dnode_of_data() in get_data_block() returns a successful dnode, we should put the dnode. But, previously, if its data block address is equal to NEW_ADDR, we didn't do that, resulting in a deadlock condition. So, this patch splits original error conditions with this case, and then calls f2fs_put_dnode before finishing the function.
Signed-off-by: Jaegeuk Kim <jaegeuk....@samsung.com> --- fs/f2fs/data.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 0879d2a..991e368 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -626,11 +626,13 @@ static int get_data_block(struct inode *inode, sector_t iblock, /* When reading holes, we need its node page */ set_new_dnode(&dn, inode, NULL, NULL, 0); err = get_dnode_of_data(&dn, pgofs, mode); - if (err || dn.data_blkaddr == NEW_ADDR) { + if (err) { if (err == -ENOENT) err = 0; goto unlock_out; } + if (dn.data_blkaddr == NEW_ADDR) + goto put_out; if (dn.data_blkaddr != NULL_ADDR) { map_bh(bh_result, inode->i_sb, dn.data_blkaddr); @@ -659,11 +661,14 @@ get_next: set_new_dnode(&dn, inode, NULL, NULL, 0); err = get_dnode_of_data(&dn, pgofs, mode); - if (err || dn.data_blkaddr == NEW_ADDR) { + if (err) { if (err == -ENOENT) err = 0; goto unlock_out; } + if (dn.data_blkaddr == NEW_ADDR) + goto put_out; + end_offset = IS_INODE(dn.node_page) ? ADDRS_PER_INODE(F2FS_I(inode)) : ADDRS_PER_BLOCK; } -- 1.8.4.474.g128a96c ------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel