Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp107298ybn; Tue, 24 Sep 2019 19:12:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqwxRmUtr73wiHajC9UZAIG0NtTquCm1TTeMIdgVqWAOkIa43Icck89tgAyyjLk2ZbR1QYmA X-Received: by 2002:a1c:c74e:: with SMTP id x75mr4290290wmf.177.1569377529013; Tue, 24 Sep 2019 19:12:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569377529; cv=none; d=google.com; s=arc-20160816; b=PKZpssiI+4f2+S3dyKbfE4+KP3/qEyMe34StdWoSFYbNz4RkEQSGC8r2gmTAY69HtT 4Q+uceUpUIHwO90sTKOjNiTqky7vkqHDizyEhMb91q5vYEbc0xAPkIGK1Y+qdT++4u9/ I1EfpuDTdYCUCKDoDvYorN7BwIsvWGrUm1/IVGojfE1G42LVsoToZN0w4cmHXFGnsFjo viBBxe1XXVybXG73bVgNIQI6wAkWfmebgA3+gRdpcpG2FB7TXMqivj10yetAN0YZJOaY 0nltHaT2yTky9zUjuhO9aaKJdxklM0xQXAHVhCTtr5QSugYwEIB+0mS5ou2b+iX+pxSb 8voQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:subject; bh=LriA3ZVExoMaXJ1C5Q4aDlit9CiNrtTYm6BusB5aGM8=; b=vHjRQpODhNgKa6PPgNsk/ngX1tL5xS8lH9pZ4Tx2wnRjQ8aVWnrPMO9+cc8ElxhaQ4 7frB7Y7TGDYvZC5RfMGd9CzyTpa/z/liZXjQVzF3GrqPzvWJx3Pw7NsArb/+HwnBhHhX Wo+DbYRffZOXjBH102iG00klnHJPZgac0tU31uYdRKpu9XLwpHNqPyul3o9NXIRMbXI2 fxJiN/2VSnwLwje7X3tZNKDJ2uL1ES7O8s/ISS3g3sanVSAhF/KERao+BtHtoZcRI26O 9noeYLegOKZTgWxoI30Cm2i+6ynVC7TAhcuK9ZLW8f/sQPOd/dU5mp6bF8J67DYcRGva l5FA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s27si2299102edm.226.2019.09.24.19.11.15; Tue, 24 Sep 2019 19:12:08 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2403855AbfIWB4W (ORCPT + 99 others); Sun, 22 Sep 2019 21:56:22 -0400 Received: from szxga07-in.huawei.com ([45.249.212.35]:35012 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2390768AbfIWB4W (ORCPT ); Sun, 22 Sep 2019 21:56:22 -0400 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id EFF74F41318306BA7B05; Mon, 23 Sep 2019 09:56:19 +0800 (CST) Received: from [10.134.22.195] (10.134.22.195) by smtp.huawei.com (10.3.19.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 23 Sep 2019 09:56:13 +0800 Subject: Re: [PATCH 1/1] f2fs: update multi-dev metadata in resize_fs To: sunqiuyang , , , , References: <20190918125158.12126-1-sunqiuyang@huawei.com> From: Chao Yu Message-ID: <1bb74096-8499-7779-503e-5fc7c3350a1b@huawei.com> Date: Mon, 23 Sep 2019 09:55:53 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20190918125158.12126-1-sunqiuyang@huawei.com> Content-Type: text/plain; charset="windows-1252" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.134.22.195] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2019/9/18 20:51, sunqiuyang wrote: > From: Qiuyang Sun > > Multi-device metadata should be updated in resize_fs as well. > > Also, we check that the new FS size still reaches the last device. > > Signed-off-by: Qiuyang Sun > --- > fs/f2fs/gc.c | 32 ++++++++++++++++++++++++++++++-- > 1 file changed, 30 insertions(+), 2 deletions(-) > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c > index 5877bd7..a2b8cbe 100644 > --- a/fs/f2fs/gc.c > +++ b/fs/f2fs/gc.c > @@ -1431,26 +1431,46 @@ static void update_sb_metadata(struct f2fs_sb_info *sbi, int secs) > int segment_count_main = le32_to_cpu(raw_sb->segment_count_main); > long long block_count = le64_to_cpu(raw_sb->block_count); > int segs = secs * sbi->segs_per_sec; > + int ndevs = sbi->s_ndevs; > > raw_sb->section_count = cpu_to_le32(section_count + secs); > raw_sb->segment_count = cpu_to_le32(segment_count + segs); > raw_sb->segment_count_main = cpu_to_le32(segment_count_main + segs); > raw_sb->block_count = cpu_to_le64(block_count + > (long long)segs * sbi->blocks_per_seg); > + if (ndevs > 1) { if (f2fs_is_multi_device(sbi)) { int last_ndev = sbi->s_ndevs - 1; > + int dev_segs = > + le32_to_cpu(raw_sb->devs[ndevs - 1].total_segments); > + > + raw_sb->devs[ndevs - 1].total_segments = > + cpu_to_le32(dev_segs + segs); > + } > } > > static void update_fs_metadata(struct f2fs_sb_info *sbi, int secs) > { > int segs = secs * sbi->segs_per_sec; > + long long blks = (long long)segs * sbi->blocks_per_seg; > long long user_block_count = > le64_to_cpu(F2FS_CKPT(sbi)->user_block_count); > + int ndevs = sbi->s_ndevs; > > SM_I(sbi)->segment_count = (int)SM_I(sbi)->segment_count + segs; > MAIN_SEGS(sbi) = (int)MAIN_SEGS(sbi) + segs; > FREE_I(sbi)->free_sections = (int)FREE_I(sbi)->free_sections + secs; > FREE_I(sbi)->free_segments = (int)FREE_I(sbi)->free_segments + segs; > - F2FS_CKPT(sbi)->user_block_count = cpu_to_le64(user_block_count + > - (long long)segs * sbi->blocks_per_seg); > + F2FS_CKPT(sbi)->user_block_count = cpu_to_le64(user_block_count + blks); > + > + if (ndevs > 1) { if (f2fs_is_multi_device(sbi)) { int last_ndev = sbi->s_ndevs - 1; > + FDEV(ndevs - 1).total_segments = > + (int)FDEV(ndevs - 1).total_segments + segs; > + FDEV(ndevs - 1).end_blk = > + (long long)FDEV(ndevs - 1).end_blk + blks; > +#ifdef CONFIG_BLK_DEV_ZONED > + FDEV(ndevs - 1).nr_blkz = (int)FDEV(ndevs - 1).nr_blkz + > + (int)(blks >> sbi->log_blocks_per_blkz); > +#endif > + } > } > > int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count) > @@ -1465,6 +1485,14 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count) > if (block_count > old_block_count) > return -EINVAL; > > + if (sbi->s_ndevs > 1) { if (f2fs_is_multi_device(sbi)) { int last_ndev = sbi->s_ndevs - 1; Otherwise it looks good to me. Thanks, > + __u64 last_segs = FDEV(sbi->s_ndevs - 1).total_segments; > + > + if (block_count + last_segs * sbi->blocks_per_seg <= > + old_block_count) > + return -EINVAL; > + } > + > /* new fs size should align to section size */ > div_u64_rem(block_count, BLKS_PER_SEC(sbi), &rem); > if (rem) >