From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932950AbcASKyL (ORCPT ); Tue, 19 Jan 2016 05:54:11 -0500 Received: from mailout4.samsung.com ([203.254.224.34]:55133 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932515AbcASKyI (ORCPT ); Tue, 19 Jan 2016 05:54:08 -0500 X-AuditID: cbfee61b-f793c6d00000236c-f5-569e15cd6baf From: Chao Yu To: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 1/3] f2fs: simplify f2fs_map_blocks Date: Tue, 19 Jan 2016 18:53:25 +0800 Message-id: <001701d152a7$b73efe70$25bcfb50$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdFSphVLBG9Mtm/gTkelHQRf+IGnkg== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFLMWRmVeSWpSXmKPExsVy+t9jAd2zovPCDF5csrF4sn4Ws8WlRe4W l3fNYXNg9ti0qpPNY/eCz0wenzfJBTBHcdmkpOZklqUW6dslcGVs7pvKXLBGoeLaiS1sDYyn JboYOTkkBEwk/t1qZoWwxSQu3FvP1sXIxSEksJRRou/fUiYI5xWjRMflN4wgVWwCKhLLO/4z gdgiQPahRZfZQWxmAQ+Jxo7vYJOEBYwlVq/oYOli5OBgEVCVWHY8FcTkFbCUeDOrBqSCV0BQ 4sfkeywQnVoSm7c1sULY8hKb17xlhrhHQWLH2deMEJv0JFacWcUGUSMusfHILZYJjAKzkIya hWTULCSjZiFpWcDIsopRIrUguaA4KT3XKC+1XK84Mbe4NC9dLzk/dxMjOISfSe9gPLzL/RCj AAejEg/vBPu5YUKsiWXFlbmHGCU4mJVEeK9yzwsT4k1JrKxKLcqPLyrNSS0+xCjNwaIkzrvv UmSYkEB6YklqdmpqQWoRTJaJg1OqgXH7uhiHI0ZbFj3TfzsvaQXfxb66tyqXYoR+3Fq2cc1e jhbOQq0vH3Zznrbdou55ZEOsMdfmaLnJ9+rPuT2elfiwUGLmrNnMYsyT50a+myim9/XmNW/v Og8/l+wqh+pzzw42L8zc0pWn+eGnftcei/fN/9z4J7xK52l94PddZjmjjEb+/0199+OUWIoz Eg21mIuKEwETodOtXQIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In f2fs_map_blocks, we use duplicated codes to handle first block mapping and the following blocks mapping, it's unnecessary. This patch simplifies f2fs_map_blocks to avoid using copied codes. Signed-off-by: Chao Yu --- fs/f2fs/data.c | 101 ++++++++++++++++++--------------------------------------- 1 file changed, 32 insertions(+), 69 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index ac9e7c6..3564e8e 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -595,6 +595,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, goto out; } +next_dnode: if (create) f2fs_lock_op(sbi); @@ -607,47 +608,57 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, goto unlock_out; } - if (dn.data_blkaddr == NEW_ADDR || dn.data_blkaddr == NULL_ADDR) { + end_offset = ADDRS_PER_PAGE(dn.node_page, F2FS_I(inode)); + +next_block: + blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node); + + if (blkaddr == NEW_ADDR || blkaddr == NULL_ADDR) { if (create) { if (unlikely(f2fs_cp_error(sbi))) { err = -EIO; - goto put_out; + goto sync_out; } err = __allocate_data_block(&dn); if (err) - goto put_out; + goto sync_out; allocated = true; map->m_flags = F2FS_MAP_NEW; + blkaddr = dn.data_blkaddr; } else { if (flag != F2FS_GET_BLOCK_FIEMAP || - dn.data_blkaddr != NEW_ADDR) { + blkaddr != NEW_ADDR) { if (flag == F2FS_GET_BLOCK_BMAP) err = -ENOENT; - goto put_out; + goto sync_out; } - - /* - * preallocated unwritten block should be mapped - * for fiemap. - */ - if (dn.data_blkaddr == NEW_ADDR) - map->m_flags = F2FS_MAP_UNWRITTEN; } } - map->m_flags |= F2FS_MAP_MAPPED; - map->m_pblk = dn.data_blkaddr; - map->m_len = 1; + if (map->m_len == 0) { + /* preallocated unwritten block should be mapped for fiemap. */ + if (blkaddr == NEW_ADDR) + map->m_flags |= F2FS_MAP_UNWRITTEN; + map->m_flags |= F2FS_MAP_MAPPED; + + map->m_pblk = blkaddr; + map->m_len = 1; + } else if ((map->m_pblk != NEW_ADDR && + blkaddr == (map->m_pblk + ofs)) || + (map->m_pblk == NEW_ADDR && blkaddr == NEW_ADDR)) { + ofs++; + map->m_len++; + } else { + goto sync_out; + } - end_offset = ADDRS_PER_PAGE(dn.node_page, F2FS_I(inode)); dn.ofs_in_node++; pgofs++; -get_next: - if (map->m_len >= maxblocks) - goto sync_out; + if (map->m_len < maxblocks) { + if (dn.ofs_in_node < end_offset) + goto next_block; - if (dn.ofs_in_node >= end_offset) { if (allocated) sync_inode_page(&dn); allocated = false; @@ -656,61 +667,13 @@ get_next: if (create) { f2fs_unlock_op(sbi); f2fs_balance_fs(sbi, dn.node_changed); - f2fs_lock_op(sbi); - } - - set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, pgofs, mode); - if (err) { - if (err == -ENOENT) - err = 0; - goto unlock_out; - } - - end_offset = ADDRS_PER_PAGE(dn.node_page, F2FS_I(inode)); - } - - blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node); - - if (blkaddr == NEW_ADDR || blkaddr == NULL_ADDR) { - if (create) { - if (unlikely(f2fs_cp_error(sbi))) { - err = -EIO; - goto sync_out; - } - err = __allocate_data_block(&dn); - if (err) - goto sync_out; - allocated = true; - map->m_flags |= F2FS_MAP_NEW; - blkaddr = dn.data_blkaddr; - } else { - /* - * we only merge preallocated unwritten blocks - * for fiemap. - */ - if (flag != F2FS_GET_BLOCK_FIEMAP || - blkaddr != NEW_ADDR) - goto sync_out; } - } - - /* Give more consecutive addresses for the readahead */ - if ((map->m_pblk != NEW_ADDR && - blkaddr == (map->m_pblk + ofs)) || - (map->m_pblk == NEW_ADDR && - blkaddr == NEW_ADDR)) { - ofs++; - dn.ofs_in_node++; - pgofs++; - map->m_len++; - goto get_next; + goto next_dnode; } sync_out: if (allocated) sync_inode_page(&dn); -put_out: f2fs_put_dnode(&dn); unlock_out: if (create) { -- 2.6.3