Received: by 10.223.176.5 with SMTP id f5csp2168948wra; Sun, 4 Feb 2018 22:32:40 -0800 (PST) X-Google-Smtp-Source: AH8x225jKECRKEs75JE86RTsa1A80uAvA3/WuVetZ2O4wInwF1/VQ9VmSPrDRlbwZ+MI8X3yp3z9 X-Received: by 10.99.5.207 with SMTP id 198mr8326506pgf.80.1517812360062; Sun, 04 Feb 2018 22:32:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517812360; cv=none; d=google.com; s=arc-20160816; b=Kv2XECFVoLlmWqvl+NO7dDBzaxHnS7lwlt0ndhumgonXWb9dzOljm3kruhTjOlW8jV jDIe193XsGAuyAP+rkHFXI1/p1mM6vwW2LgH48AgnfpqM+sTEroCUfo6X5yAqEAniaaA Quo7quYSrdVwN+9b6CtfS82eDVVLKngJ73KoL469z62nsQdUsjzQHboIlRDc9jOZ3RRa WnA5PvjZXJ+Tel7n1t7DnEz7EdQkajnX6mvqK24nfLXijqhoEIVsOy8sTYSKR/UJw16C sjUeSdgnmK04bDcspMi8l6+iMWMjqO19BZH5JV2Wt++fqmmrtcaroDjXGSnH/evytp+i 7DLw== 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:cc:to:subject:arc-authentication-results; bh=sJlLiXUClybE+/skorjYCSG7w6bDeD5Kz7c3oC10kMI=; b=xPRnbGml3zMXJtipf5aASGn+Z/rVG+ZolZ9GjUHtbE6T1xwvvzKbc43nJtuKLVW8lD ZRwIn/2zjiZ6zk/4VhHKsOeQqOjQb8Q5HtIucFSCFPCw/jI1LFx/RKefKewekUz4D+dk +pFIS1vSEdeYmtPrO+q0R2BT0V7s2swW6oTZ7UnA5E0Zzjaexz/w52U+OxHrsUNQfsWi Ff7sx4VOe/RSxTE59V2oKtFN5YV2s6CQf/L5lMA5EHb/sjkJ81Y4vMpWvRdeoI5m8T3t HXVtoMfmX6Byijko9m6xlHpjSDgamiHjx7xn3u1aVGw2GZ4V086eZMvz4szmQtCb9Wzv XcPQ== 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 e32-v6si6474432plb.34.2018.02.04.22.32.25; Sun, 04 Feb 2018 22:32:40 -0800 (PST) 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 S1752532AbeBEGaa (ORCPT + 99 others); Mon, 5 Feb 2018 01:30:30 -0500 Received: from szxga06-in.huawei.com ([45.249.212.32]:36825 "EHLO huawei.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1750854AbeBEGaX (ORCPT ); Mon, 5 Feb 2018 01:30:23 -0500 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 9D5465B898634; Mon, 5 Feb 2018 14:30:10 +0800 (CST) Received: from [127.0.0.1] (10.134.22.195) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.361.1; Mon, 5 Feb 2018 14:30:01 +0800 Subject: Re: [PATCH 1/2] f2fs: enable to gc page whose inode already atomic commit To: Yunlong Song , Chao Yu , , CC: , , , , , References: <1517626068-49739-1-git-send-email-yunlong.song@huawei.com> From: Chao Yu Message-ID: <312d70f3-b1ae-9ced-44cb-fde83de362ff@huawei.com> Date: Mon, 5 Feb 2018 14:29:59 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" 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 2018/2/5 10:53, Yunlong Song wrote: > Is it necessary to add a lock here? What's the problem of this patch (no > lock at all)? Anyway, the problem is expected to be fixed asap, since > attackers can easily write an app with only atomic start and no atomic > commit, which will cause f2fs run into loop gc if the disk layout is > much fragmented, since f2fs_gc will select the same target victim all > the time (e.g. one block of target victim belongs to the opened atomic > file, and it will not be moved and do_garbage_collect will finally > return 0, and that victim is selected again next time) and goto gc_more > time and time again, which will block all the fs ops (all the fs ops > will hang up in f2fs_balance_fs). Hmm.. w/ original commit log and implementation, I supposed that the patch intended to fix to make atomic write be isolated from other IOs like GC triggered writes... Alright, we have discuss the problem before in below link: https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1571951.html I meant, for example: f2fs_ioc_start_atomic_write() inode->atomic_open_time = get_mtime(); f2fs_ioc_commit_atomic_write() inode->atomic_open_time = 0; f2fs_balance_fs_bg() for_each_atomic_open_file() if (inode->atomic_open_time && inode->atomic_open_time > threshold) { drop_inmem_pages(); f2fs_msg(); } threshold = 30s Any thoughts? Thanks, > > On 2018/2/4 22:56, Chao Yu wrote: >> On 2018/2/3 10:47, Yunlong Song wrote: >>> If inode has already started to atomic commit, then set_page_dirty will >>> not mix the gc pages with the inmem atomic pages, so the page can be >>> gced safely. >> >> Let's avoid Ccing fs mailing list if the patch didn't change vfs common >> codes. >> >> As you know, the problem here is mixed dnode block flushing w/o writebacking >> gced data block, result in making transaction unintegrated. >> >> So how about just using dio_rwsem[WRITE] during atomic committing to exclude >> GCing data block of atomic opened file? >> >> Thanks, >> >>> >>> Signed-off-by: Yunlong Song >>> --- >>> fs/f2fs/data.c | 5 ++--- >>> fs/f2fs/gc.c | 6 ++++-- >>> 2 files changed, 6 insertions(+), 5 deletions(-) >>> >>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c >>> index 7435830..edafcb6 100644 >>> --- a/fs/f2fs/data.c >>> +++ b/fs/f2fs/data.c >>> @@ -1580,14 +1580,13 @@ bool should_update_outplace(struct inode *inode, struct f2fs_io_info *fio) >>> return true; >>> if (S_ISDIR(inode->i_mode)) >>> return true; >>> - if (f2fs_is_atomic_file(inode)) >>> - return true; >>> if (fio) { >>> if (is_cold_data(fio->page)) >>> return true; >>> if (IS_ATOMIC_WRITTEN_PAGE(fio->page)) >>> return true; >>> - } >>> + } else if (f2fs_is_atomic_file(inode)) >>> + return true; >>> return false; >>> } >>> >>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c >>> index b9d93fd..84ab3ff 100644 >>> --- a/fs/f2fs/gc.c >>> +++ b/fs/f2fs/gc.c >>> @@ -622,7 +622,8 @@ static void move_data_block(struct inode *inode, block_t bidx, >>> if (!check_valid_map(F2FS_I_SB(inode), segno, off)) >>> goto out; >>> >>> - if (f2fs_is_atomic_file(inode)) >>> + if (f2fs_is_atomic_file(inode) && >>> + !f2fs_is_commit_atomic_write(inode)) >>> goto out; >>> >>> if (f2fs_is_pinned_file(inode)) { >>> @@ -729,7 +730,8 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type, >>> if (!check_valid_map(F2FS_I_SB(inode), segno, off)) >>> goto out; >>> >>> - if (f2fs_is_atomic_file(inode)) >>> + if (f2fs_is_atomic_file(inode) && >>> + !f2fs_is_commit_atomic_write(inode)) >>> goto out; >>> if (f2fs_is_pinned_file(inode)) { >>> if (gc_type == FG_GC) >>> >> >> . >> >