Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp3289520ybi; Fri, 19 Jul 2019 00:40:31 -0700 (PDT) X-Google-Smtp-Source: APXvYqxYqFSy7Aj5cPbvO+wQMPATpP4Xjcy3dWHhvNxVqdMCukrIgL+FtDoVTXoYSlBlPIuvWwJ7 X-Received: by 2002:a17:90a:384d:: with SMTP id l13mr57022670pjf.86.1563522030939; Fri, 19 Jul 2019 00:40:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563522030; cv=none; d=google.com; s=arc-20160816; b=COGZyLaUQ4yDd6YbZop9pd609IRqzSmvyLE1o9Yo76A8m9Mhm3yv4iNPXh9jfJ0Lzp EfXv2xSmSmC/Dw7RRj9ZubD2QR5K6qoXhVcJSYdZYIhDORyXhrLedTnudsFfl3nAfpLC YkC6KFmzjcJ6ZFcj0ziEirF+AQ5kQcIhK/YLvNSVZh7GmtBE2s9BG8uMM4mUcfgN5pR7 eudb3pzP7A18SG/Uv9EgeNeLYaU/Ajf0A4UDRUHAcfYCqFuxCPjJgj3xcnM5ojWnN56h mLIGLqs/6ypZK+zazIoTvb5jty1bqRHk75zOr+YAMsngX2iDjLzO1N6KH1ZpBXB5uhXX AiJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from; bh=mrEUxZsldsDCFdqymR6uHfvREiHwfW8WlQA63bKz9YQ=; b=xLIY0wfzUacxxUiqed47DMRd1oA0F++BRfS+mC/pigPfzUpSVvE7vk9lsfDPHgkkIK qsvPU5YouVvlzBbk++CnegXNSaGxSKW6GinuxE/LAcjagXRaJpnxF+ghmTKZl3Tw3yYj ZMrGUco85pY2/kychQcxm7bE85wc2hR2LaiIIgb3g5jn91fTAwKn5+6qOow5AxUFj/kF Bx6Jntl8B13B9OYLDHjzVZHoXOqmJQ1rwHD5qbWUP5Zj1pr3Dw3kv84Q9Di5O/qZq3Im HunUwrJmlUhjFTFL7T13gCJ44fT5ikjYXuNuYS5rzPtcJZDr192qx8SSKEqQIPEm//Un ON3Q== 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 v31si1008513pjb.22.2019.07.19.00.40.15; Fri, 19 Jul 2019 00:40:30 -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 S1726795AbfGSHjP (ORCPT + 99 others); Fri, 19 Jul 2019 03:39:15 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:2290 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726271AbfGSHjP (ORCPT ); Fri, 19 Jul 2019 03:39:15 -0400 Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id A2A08BFD0208CAD6C96A; Fri, 19 Jul 2019 15:39:13 +0800 (CST) Received: from szvp000203569.huawei.com (10.120.216.130) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.439.0; Fri, 19 Jul 2019 15:39:05 +0800 From: Chao Yu To: CC: , , , Chao Yu Subject: [PATCH v2] f2fs: separate NOCoW and pinfile semantics Date: Fri, 19 Jul 2019 15:39:03 +0800 Message-ID: <20190719073903.9138-1-yuchao0@huawei.com> X-Mailer: git-send-email 2.18.0.rc1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.120.216.130] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Pinning a file is heavy, because skipping pinned files make GC running with heavy load or no effect. So that this patch propose to separate nocow and pinfile semantics: - NOCoW flag can only be set on regular file. - NOCoW file will only trigger IPU at common writeback/flush. - NOCow file will do OPU during GC. For the demand of 1) avoid fragment of file's physical block and 2) userspace don't care about file's specific physical address, tagging file as NOCoW will be cheaper than pinned one. Signed-off-by: Chao Yu --- v2: - rebase code to fix compile error. fs/f2fs/data.c | 3 ++- fs/f2fs/f2fs.h | 1 + fs/f2fs/file.c | 22 +++++++++++++++++++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index a2a28bb269bf..15fb8954c363 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1884,7 +1884,8 @@ static inline bool check_inplace_update_policy(struct inode *inode, bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio) { - if (f2fs_is_pinned_file(inode)) + if (f2fs_is_pinned_file(inode) || + F2FS_I(inode)->i_flags & F2FS_NOCOW_FL) return true; /* if this is cold file, we should overwrite to avoid fragmentation */ diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 596ab3e1dd7b..f6c5a3d2e659 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -2374,6 +2374,7 @@ static inline void f2fs_change_bit(unsigned int nr, char *addr) #define F2FS_NOATIME_FL 0x00000080 /* do not update atime */ #define F2FS_INDEX_FL 0x00001000 /* hash-indexed directory */ #define F2FS_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ +#define F2FS_NOCOW_FL 0x00800000 /* Do not cow file */ #define F2FS_PROJINHERIT_FL 0x20000000 /* Create with parents projid */ /* Flags that should be inherited by new inodes from their parent. */ diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 7ca545874060..ae0fec54cac6 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -1692,6 +1692,7 @@ static const struct { { F2FS_NOATIME_FL, FS_NOATIME_FL }, { F2FS_INDEX_FL, FS_INDEX_FL }, { F2FS_DIRSYNC_FL, FS_DIRSYNC_FL }, + { F2FS_NOCOW_FL, FS_NOCOW_FL }, { F2FS_PROJINHERIT_FL, FS_PROJINHERIT_FL }, }; @@ -1715,7 +1716,8 @@ static const struct { FS_NODUMP_FL | \ FS_NOATIME_FL | \ FS_DIRSYNC_FL | \ - FS_PROJINHERIT_FL) + FS_PROJINHERIT_FL | \ + FS_NOCOW_FL) /* Convert f2fs on-disk i_flags to FS_IOC_{GET,SET}FLAGS flags */ static inline u32 f2fs_iflags_to_fsflags(u32 iflags) @@ -1753,8 +1755,6 @@ static int f2fs_ioc_getflags(struct file *filp, unsigned long arg) fsflags |= FS_ENCRYPT_FL; if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) fsflags |= FS_INLINE_DATA_FL; - if (is_inode_flag_set(inode, FI_PIN_FILE)) - fsflags |= FS_NOCOW_FL; fsflags &= F2FS_GETTABLE_FS_FL; @@ -1794,6 +1794,22 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg) if (ret) goto out; + if ((fsflags ^ old_fsflags) & FS_NOCOW_FL) { + if (!S_ISREG(inode->i_mode)) { + ret = -EINVAL; + goto out; + } + + if (f2fs_should_update_outplace(inode, NULL)) { + ret = -EINVAL; + goto out; + } + + ret = f2fs_convert_inline_inode(inode); + if (ret) + goto out; + } + ret = f2fs_setflags_common(inode, iflags, f2fs_fsflags_to_iflags(F2FS_SETTABLE_FS_FL)); out: -- 2.18.0.rc1