From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756589AbcAZHiZ (ORCPT ); Tue, 26 Jan 2016 02:38:25 -0500 Received: from mailout3.samsung.com ([203.254.224.33]:33400 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752063AbcAZHiW (ORCPT ); Tue, 26 Jan 2016 02:38:22 -0500 X-AuditID: cbfee61a-f79266d000003652-33-56a7226c8796 From: Chao Yu To: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] f2fs: simplify f2fs_map_blocks Date: Tue, 26 Jan 2016 15:37:38 +0800 Message-id: <009201d1580c$86b5faa0$9421efe0$@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: AdFYDD4St5Apn22vRVCYdtE7lb+Iig== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNLMWRmVeSWpSXmKPExsVy+t9jAd0cpeVhBm9Walo8WT+L2eLSIneL y7vmsDkwe2xa1cnmsXvBZyaPz5vkApijuGxSUnMyy1KL9O0SuDIO7njPXPBBoWLSjxlMDYx/ JLoYOTkkBEwk/qzpY4KwxSQu3FvP1sXIxSEksJRRoufBRRYI5xWjRPe76cwgVWwCKhLLO/6D dYgA2YcWXWYHsZkFPCQaO76zdjFycAgLmEn8aggGCbMIqEr8+7uWEcTmFbCUuNE+mx3CFpT4 MfkeC0SrlsT6nceZIGx5ic1r3jJDHKQgsePsa0aIVXoSh2duZ4WoEZfYeOQWywRGgVlIRs1C MmoWklGzkLQsYGRZxSiRWpBcUJyUnmuYl1quV5yYW1yal66XnJ+7iREcxM+kdjAe3OV+iFGA g1GJh5ejeFmYEGtiWXFl7iFGCQ5mJRFeJd7lYUK8KYmVValF+fFFpTmpxYcYpTlYlMR5ay9F hgkJpCeWpGanphakFsFkmTg4pRoYZ4jNMf8rse+LzLqMvvM/mZ6pKTxrUjhXcePckashZrmn GFwmTboz+8J6/U2lRRpxO99mCq+It2yr+rsutb9pXtD3w3IiDy/qmeyv9VsyReK/KV9Pd+HK Zxctyhy2TnosVTWfbfWsv723ajnOOlzW6Dzk9L6pr1/QWGtPk3zS6pomVpapG929lFiKMxIN tZiLihMBwZxaNV4CAAA= 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 --- V2: - rebase on last dev-test 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 c85acbc..f570d37 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -632,6 +632,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, goto out; } +next_dnode: if (create) f2fs_lock_op(sbi); @@ -644,47 +645,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); f2fs_put_dnode(&dn); @@ -692,62 +703,14 @@ get_next: if (create) { f2fs_unlock_op(sbi); f2fs_balance_fs(sbi, allocated); - f2fs_lock_op(sbi); } allocated = false; - - 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.7.0.2.g1b0b6dd