From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752726AbeDRJx1 (ORCPT ); Wed, 18 Apr 2018 05:53:27 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:7176 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751210AbeDRJx0 (ORCPT ); Wed, 18 Apr 2018 05:53:26 -0400 Subject: Re: [PATCH 1/5] f2fs: fix race in between GC and atomic open To: CC: , , References: <20180418094505.98888-1-yuchao0@huawei.com> From: Chao Yu Message-ID: Date: Wed, 18 Apr 2018 17:53:16 +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: <20180418094505.98888-1-yuchao0@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 List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi all, Please ignore this patch, I just sent this before, sorry. Thanks, On 2018/4/18 17:45, Chao Yu wrote: > Thread GC thread > - f2fs_ioc_start_atomic_write > - get_dirty_pages > - filemap_write_and_wait_range > - f2fs_gc > - do_garbage_collect > - gc_data_segment > - move_data_page > - f2fs_is_atomic_file > - set_page_dirty > - set_inode_flag(, FI_ATOMIC_FILE) > > Dirty data page can still be generated by GC in race condition as > above call stack. > > This patch adds fi->dio_rwsem[WRITE] in f2fs_ioc_start_atomic_write > to avoid such race. > > Signed-off-by: Chao Yu > --- > fs/f2fs/file.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > index 78b3a58cfe21..408471bf4799 100644 > --- a/fs/f2fs/file.c > +++ b/fs/f2fs/file.c > @@ -1677,6 +1677,8 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) > > inode_lock(inode); > > + down_write(&F2FS_I(inode)->dio_rwsem[WRITE]); > + > if (f2fs_is_atomic_file(inode)) > goto out; > > @@ -1702,6 +1704,7 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) > stat_inc_atomic_write(inode); > stat_update_max_atomic_write(inode); > out: > + up_write(&F2FS_I(inode)->dio_rwsem[WRITE]); > inode_unlock(inode); > mnt_drop_write_file(filp); > return ret; >