From mboxrd@z Thu Jan 1 00:00:00 1970 From: "LiFan" Subject: [f2fs-dev] [PATCH] f2fs: validate before set/clear free nat bitmap Date: Fri, 10 Nov 2017 15:41:42 +0800 Message-ID: <000101d359f7$77d1aae0$677500a0$@samsung.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Return-path: Content-Language: zh-cn Sender: linux-kernel-owner@vger.kernel.org To: 'Chao Yu' , 'Chao Yu' , 'Jaegeuk Kim' Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net List-Id: linux-f2fs-devel.lists.sourceforge.net 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 increaced 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 beforeactually set/clear them. 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 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755556AbdKJHmh (ORCPT ); Fri, 10 Nov 2017 02:42:37 -0500 Received: from mailout3.samsung.com ([203.254.224.33]:54200 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751272AbdKJHmf (ORCPT ); Fri, 10 Nov 2017 02:42:35 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout3.samsung.com 20171110074234epoutp03d946dd923d82138b43a0e1cef08ed9a0~1qZ-VpgRj0257202572epoutp03U X-AuditID: b6c32a49-32bff70000001169-56-5a0558691553 From: "LiFan" To: "'Chao Yu'" , "'Chao Yu'" , "'Jaegeuk Kim'" Cc: , Subject: [f2fs-dev] [PATCH] f2fs: validate before set/clear free nat bitmap Date: Fri, 10 Nov 2017 15:41:42 +0800 Message-ID: <000101d359f7$77d1aae0$677500a0$@samsung.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-Index: AdNZ9xPMcqFMV1hmT2qoklITym7/XA== Content-Language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprFKsWRmVeSWpSXmKPExsWy7bCmhm5mBGuUwYVLUhanp55lsniyfhaz xaVF7haXd81hs5j6eC2rA6tHy5G3rB6bVnWyeexe8JnJ4/MmuQCWKC6blNSczLLUIn27BK6M dYsnMRdM4a548GM+WwPjYs4uRk4OCQETiYXv3zB2MXJxCAnsZpR4eL0DyvnEKPGvrZUZwvnG KLH8/z42mJYt7y6xQST2Mkp8PXyfBcJ5yiixtOEvaxcjBwebgIbE1M0yIKaIQLbEwT45kF5m AR+J37fuMYOEhQW8JT6cEQAJswioSqyb08UIYvMKWEq0bZnLDmELSpyc+YQFolVeYvvbOcwQ JyhI7Dj7GqxeREBP4teJm1A14hJ3WltZQa6RENjCJrHj4n+oBheJjXMeQd0vLPHq+BZ2CFtK 4vO7vVDxdYwSn89YQDRvZ5SY9/EjE0TCWmLzml/sIEczC2hKrN+lDxG2lfjQ9JERYjGfRO/v J0wgJRICvBIdbUIQJWoSL1fPYoEIe0icvqsOEXaUONTYxzqBUXEWki9nIflyFpJvZiHsXcDI sopRMrWgODc9tdi0wDAvtVyvODG3uDQvXS85P3cTIzjFaHnuYJx1zucQowAHoxIP74e7LFFC rIllxZW5hxglOJiVRHj15VmjhHhTEiurUovy44tKc1KLDzFKc7AoifMe21kaKSSQnliSmp2a WpBaBJNl4uCUamDkdeBfYLGlazZvRkDNXrvXts6eMkcXaehlq8T2ntwR8cG/Q7k3y9JmU1Lo j8lib6Yw/KmvXLdg/s+0W/VBE802H9IMNH9yaVfi2sthxZ/ffanc8Ny4qvR43nJr0XpJjmb2 Lyfy9mjJ871j/TWB0VzQzvXDo4KE1dosMb7pfIvjNJaWfLv3cqcSS3FGoqEWc1FxIgCwlo1B LQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrELMWRmVeSWpSXmKPExsWy7bCSvG5GBGuUwcXj+hanp55lsniyfhaz xaVF7haXd81hs5j6eC2rA6tHy5G3rB6bVnWyeexe8JnJ4/MmuQCWKC6blNSczLLUIn27BK6M dYsnMRdM4a548GM+WwPjYs4uRk4OCQETiS3vLrGB2EICuxkltj3PhIjLSCw4/IUdwhaWWPnv OTtEzWNGietvfbsYOTjYBDQkpm6WAQmLCORKnF70GKyEWcBPYtfDFcwgJcIC3hIfzgiAhFkE VCXWzeliBLF5BSwl2rbMZYewBSVOznzCAlLOLKAn0baREWKKvMT2t3OYIQ5QkNhx9jUjxCY9 iV8nbrJA1IhL3GltZZ3AKDgLyaRZCJNmIZk0C0nHAkaWVYySqQXFuem5xYYFRnmp5XrFibnF pXnpesn5uZsYwSGvpbWD8cSJ+EOMAhyMSjy8Hg9YooRYE8uKK3MPMUpwMCuJ8OrLs0YJ8aYk VlalFuXHF5XmpBYfYpTmYFES55XPPxYpJJCeWJKanZpakFoEk2Xi4JRqYFx4/UnHokZn6XV7 XPcmh8xvnpdQcqx2h61e6Px5kRunrtmvfkKrZ862a7q/3hyKs9mX4nDcvVqR6x2DUsmpaVs4 Jjv1RDBUTAieMXdjPyf7virrj8nnWZKbg+ObHTM+5z5yCOcPPh0bf9/0hLA9Z8ImtYJZft57 FvEW7XG1nJhrbbSrgs+KS4mlOCPRUIu5qDgRAN85jDN1AgAA X-CMS-MailID: 20171110074232epcas5p3c1468e254cb24d7fefdea4175f53469e X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-MTR: 20171110074232epcas5p3c1468e254cb24d7fefdea4175f53469e CMS-TYPE: 105P X-CMS-RootMailID: 20171110074232epcas5p3c1468e254cb24d7fefdea4175f53469e X-RootMTR: 20171110074232epcas5p3c1468e254cb24d7fefdea4175f53469e 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 increaced 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 beforeactually set/clear them. 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