From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753519AbdKNHVw (ORCPT ); Tue, 14 Nov 2017 02:21:52 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:16124 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752907AbdKNHVo (ORCPT ); Tue, 14 Nov 2017 02:21:44 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20171114072143epoutp02c534dd60f0e1a7ee53725cdebfdaa046~24s7lzwyL3206732067epoutp02O X-AuditID: b6c32a49-32bff70000001169-bc-5a0a99860093 From: "LiFan" To: "'Chao Yu'" , "'Chao Yu'" , "'Jaegeuk Kim'" Cc: , , Subject: [f2fs-dev] [PATCH RESEND v2] f2fs: validate before set/clear free nat bitmap Date: Tue, 14 Nov 2017 15:20:32 +0800 Message-ID: <002201d35d19$3837e870$a8a7b950$@samsung.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Content-Language: zh-cn Thread-Index: AdNdGOoimUGv6lv5S9CIf3xu7rtWUg== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrCKsWRmVeSWpSXmKPExsWy7bCmhm7bTK4og2WfbCxOTz3LZPF5ayO7 xZP1s5gtLi1yt7i8aw6bxdTHa1kd2Dxajrxl9di0qpPNY/eCz0wefVtWMXp83iQXwBrFZZOS mpNZllqkb5fAlbH87lmWgkfcFTcO/2dpYHzG2cXIySEhYCLx59cDti5GLg4hgd2MElMPvGCH cD4xSsx61sgGUiUk8I1RYvoeFZiOiQdvQ3XsZZQ4cXYXC4TzlFHiwqSJjF2MHBxsAhoSUzfL gJgiAtkSB/vkQHqZBbIkbn94DTZTWCBcYs2upWDVLAKqEkdWsoKEeQUsJXY9vM0MYQtKnJz5 hAWiVV5i+9s5zBAnKEjsOPuaESIuLnGntRWsV0RAT+LTiwlg10gInGCTuHRmChNEg4vEm8b7 ULawxKvjW9ghbCmJz+/2skHY6xglPp+xgGjezigx7+NHqAZric1rfrGDHMosoCmxfpc+RNhW Ys7OVmaII/gken8/YQIpkRDglehoE4IoUZN4uXoWC4TtIdHY/BJqoqPEtc7zrBMYFWcheXMW kjdnIXltFsLiBYwsqxglUwuKc9NTi00LDPNSy/WKE3OLS/PS9ZLzczcxgtOOlucOxlnnfA4x CnAwKvHwvrjIGSXEmlhWXJl7iFGCg1lJhDckmCtKiDclsbIqtSg/vqg0J7X4EKM0B4uSOO+x naWRQgLpiSWp2ampBalFMFkmDk6pBsbq4JqJmZe8XsledWf4cmdz647WywwzLi+znOb64OO2 dZzT3Vmy3y2TuHY25a/ngmS9SVL3V1cpdQjO+/pjdZEN7/dprGZcs4XW3Co3aj9+MezsjZDZ ze5BRoICr26VbVv+qU3YQGL5GpbIxR0ekWevBbHO+PHP99f/F/b37l6QUHO+G8Q7jSVGiaU4 I9FQi7moOBEAYlAwvDcDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHLMWRmVeSWpSXmKPExsWy7bCSvG7bTK4ogzO3xSxOTz3LZPF5ayO7 xZP1s5gtLi1yt7i8aw6bxdTHa1kd2Dxajrxl9di0qpPNY/eCz0wefVtWMXp83iQXwBrFZZOS mpNZllqkb5fAlbH87lmWgkfcFTcO/2dpYHzG2cXIySEhYCIx8eBtti5GLg4hgd2MEhc3bmOE SMhILDj8hR3CFpZY+e85O0TRY0aJWx2vWbsYOTjYBDQkpm6WAakREciVOL3oMVg9s0COxIqZ rcwgtrBAqMT050eYQMpZBFQljqxkBQnzClhK7Hp4mxnCFpQ4OfMJC0gJs4CeRNtGRogp8hLb 385hhrhAQWLH2ddQcXGJO62trBBb9SQ+vZjAMoFRcBaSSbMQJs1CMmkWku4FjCyrGCVTC4pz 03OLDQuM8lLL9YoTc4tL89L1kvNzNzGCY0FLawfjiRPxhxgFOBiVeHgdrnBGCbEmlhVX5h5i lOBgVhLhDQnmihLiTUmsrEotyo8vKs1JLT7EKM3BoiTOK59/LFJIID2xJDU7NbUgtQgmy8TB KdXAmLyuOMLfdnN3rHjWn++C2sutCsQNDv6uD2v5uT/mWDQrPx+XR3Tnn5MJguc/z1G7Ffzx m+Q9nalHwhY93nqt4MSvlLzYv5LiNbtMLpSltJi59L/KKOp6Vdb15P5BGYuarTk/m51/PVCb kL+u3vv1pYdF7+K77s5q/j7PVPVkFXOMZ92NNfvDlViKMxINtZiLihMBMv3hioECAAA= X-CMS-MailID: 20171114072142epcas5p1e7543c4f118db48ff8ad417894f964d2 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-MTR: 20171114072142epcas5p1e7543c4f118db48ff8ad417894f964d2 CMS-TYPE: 105P X-CMS-RootMailID: 20171114072142epcas5p1e7543c4f118db48ff8ad417894f964d2 X-RootMTR: 20171114072142epcas5p1e7543c4f118db48ff8ad417894f964d2 References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In flush_nat_entries, all dirty nats will be flushed and if their new address isn't NULL_ADDR, their bitmaps will be updated, the free_nid_count of the bitmaps will be increased regardless of whether the nats have already been occupied before. This could lead to wrong free_nid_count. So this patch checks the status of the bits before actually set/clear them. Fixes: 586d1492f301 ("f2fs: skip scanning free nid bitmap of full NAT blocks") Signed-off-by: Fan li --- fs/f2fs/node.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index d234c6e..b965a53 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1906,15 +1906,18 @@ static void update_free_nid_bitmap(struct f2fs_sb_info *sbi, nid_t nid, if (!test_bit_le(nat_ofs, nm_i->nat_block_bitmap)) return; - if (set) + if (set) { + if (test_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs])) + return; __set_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]); - else - __clear_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]); - - if (set) nm_i->free_nid_count[nat_ofs]++; - else if (!build) - nm_i->free_nid_count[nat_ofs]--; + } else { + if (!test_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs])) + return; + __clear_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]); + if (!build) + nm_i->free_nid_count[nat_ofs]--; + } } static void scan_nat_page(struct f2fs_sb_info *sbi, -- 2.7.4