Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp598835pxb; Tue, 19 Oct 2021 09:07:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx2DNJiNKIiFdjRJC9OC2CTKEdMLSV+8Y3ggXuhm1h0JrWVNhRGoIl98WY1Pv3lcZZBPMT0 X-Received: by 2002:a05:6402:5113:: with SMTP id m19mr55880490edd.231.1634659637058; Tue, 19 Oct 2021 09:07:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634659637; cv=none; d=google.com; s=arc-20160816; b=ILX+6vBDD+BSI0FdPHIaiYMpo6CPcb7XXLd05xKUUwqqTK8wJolFbi8CiF1y4bd/MT w1zDAGZmils5VhQlg/ILCB1EBmb/9QsqBlW7gAQziCgXCSOIF6fzjm/bX7wZk+MHaob6 EztUphltyjUft6CmnWUV6YRN2grHDei/JOWSXjUVP/PJYJ9GElkyqnV90otH2kymhbxD f9BLQTClQVAY6A7Um/YWGPu080+EDeR6CddVQKqTDbrLJC/ZInpgt7d8Z8SPfnqAPILq HkK5qFSfEdpBxgtM+whZyPmcKtQzsV6keqQNysgplXFNSekzBgt0baKDPSmxjTkBteun /S1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=g/jsHVQAvNzunGQb0wziwjY53g/EPbrMKbfjiqPl4Gc=; b=C+oCTtmcN2+Np9PcXJyjfiebyE8MB77OMjFBEEvb/EkStvhpFWTI0KboAx8004k8eG oKcQxasaVuZeB5T8euTyryLQkd3oqaxd7CnrBlJxzOuucyAmMYLwgmdUYI2v+BCAJ02i mOImHFlXKaYVoMzZgCQVtQoZYI+QxIIfWtludg33hTSQm8nCLmWjGmE4OXARLazJkJZr eIlZdJPegb4vjctZrHGVoIwkfKozkzDfnhPwpZsEYyt07pQa0IrtIHgDjYQOS8tAbLjM z/MQTUU8bUzU5Kqah60OqOeJsUUSFTcyOJg7VLO8w5QThAhLeVbZDHtmZ+iiCnT2ZjRF t6Sw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bytedance-com.20210112.gappssmtp.com header.s=20210112 header.b=G4sSHUkJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=bytedance.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g14si18018974edb.434.2021.10.19.09.06.50; Tue, 19 Oct 2021 09:07:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@bytedance-com.20210112.gappssmtp.com header.s=20210112 header.b=G4sSHUkJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=bytedance.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232187AbhJSQFY (ORCPT + 99 others); Tue, 19 Oct 2021 12:05:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58774 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231559AbhJSQFW (ORCPT ); Tue, 19 Oct 2021 12:05:22 -0400 Received: from mail-pl1-x629.google.com (mail-pl1-x629.google.com [IPv6:2607:f8b0:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A002EC061746 for ; Tue, 19 Oct 2021 09:03:09 -0700 (PDT) Received: by mail-pl1-x629.google.com with SMTP id b14so4202377plg.2 for ; Tue, 19 Oct 2021 09:03:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=g/jsHVQAvNzunGQb0wziwjY53g/EPbrMKbfjiqPl4Gc=; b=G4sSHUkJ8erVD2b59qOEY744aPEFAe9AohmIJVKL1ypzhMaHxSBPQuCebyfM0Fwe5M 6YQpZBfsWF0I9i41yUbXiVo3xUcNw9pDd1ahgl75/3yJo22iqJaHBzRL26O6WmJ4dsqD CTgAaJNuxDFy8v2WwZ8OQhvASl8w6RNxDdyowUT0CKQIWgYmdvnUa91M3uVcAf2tJfwJ mX7SLbwC8pdJ17FRyL9wIcomyif0V8fYa6lrRo5ERO6JFNOgSOqSB4m6IlcLZhm33Cx+ JZ6Rgh+H2cb6efDMIlObcliMmRSEOxDXw9HFz/btrelBKpFSmwPMGrPBCKeCyE8BgFFk 0P+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=g/jsHVQAvNzunGQb0wziwjY53g/EPbrMKbfjiqPl4Gc=; b=G+xRgV8q780oTyd6JMVObsxmaaHlbvU0ZK1rUmXTNc/+N/LbkeJe2HsI7TB1/Wk5Pi owVPl3FMUwPyiREaWqHBR42cb75hqmr5b18GwQXzL4JDadr1hYpljxPvC9qONTbSnKeb dqCTr8uiimFcaRdFEQWsGVqITmvMyHGgUj1gS8l4hbxytLnCgpk5/XK12ox6lMN0XU+H SzfOPCljIhtkNEwbWdOW1WthFDen0A7LaDE7vGLkA1I3A6rJsG/gyIfUKLqNlseY9ATn 3wyo8sB+QSMzZHivWIuu13OqAUrdJbb8Dbe5GOU84ax6xfrnEcsYBSTIcL7sH5Afk/bO OpxQ== X-Gm-Message-State: AOAM532dlA9uNuv5bjX5/sRLN912TZIx/wodmHCfQJHHVS+fNS8tBpvo nbhswEeSbvR5mu4LU9r7CBZrbQ== X-Received: by 2002:a17:903:22d0:b0:13f:507:6414 with SMTP id y16-20020a17090322d000b0013f05076414mr34148954plg.69.1634659387661; Tue, 19 Oct 2021 09:03:07 -0700 (PDT) Received: from localhost.localdomain ([139.177.225.225]) by smtp.gmail.com with ESMTPSA id 66sm16431749pfu.185.2021.10.19.09.03.05 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Oct 2021 09:03:07 -0700 (PDT) From: Jiachen Zhang To: miklos@szeredi.hu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xieyongji@bytedance.com, Jiachen Zhang Subject: [RFCv2] fuse: Sync attributes when the inode is clean in writeback mode Date: Wed, 20 Oct 2021 00:02:51 +0800 Message-Id: <20211019160251.6728-1-zhangjiachen.jaycee@bytedance.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is the RFCv2 version of this patch. Compared with the previous version, v2 based on the latest fuse for-next branch commit 83d9bf94c077 ("fuse: add cache_mask"). With the new cleanups and fuse interfaces, this commit is more clean compared with v1 [1]. The propose of this commit is still to relax the c/mtime and size updating for writeback_cache mode. Because when writeback cache is enabled, kernel will locally maintain the attributes, and never trusts any server side attribute changes. This limitaion is too strict in some use cases. For example, if a file is not actively wrote from the fuse mount in writeback mode, the writeback related caches should be clean, and the user may expect to see the new size changed from the server side. This commit tires to relax the limitation. If there is no dirty page of an fuse inode, update its ctime, atime and size even in writeback_cache mode. The page cache cleaness checking is based on a new fuse writeback helper (fuse_file_is_writeback_locked) and a mm/filemap helper introduced in a recent commit 63135aa3866d ("mm: provide filemap_range_needs_writeback() helper"). [1] https://patchwork.kernel.org/project/linux-fsdevel/patch/20211012145558.19137-1-zhangjiachen.jaycee@bytedance.com/ Signed-off-by: Jiachen Zhang --- fs/fuse/file.c | 21 +++++++++++++++++++++ fs/fuse/fuse_i.h | 1 + fs/fuse/inode.c | 10 ++++++++++ 3 files changed, 32 insertions(+) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index bc450daf27a2..635624d65c76 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -412,6 +412,27 @@ static struct fuse_writepage_args *fuse_find_writeback(struct fuse_inode *fi, return NULL; } +/* + * Check if any page of this file is under writeback. + * + * The fuse_inode lock should be held by the caller. + */ +bool fuse_file_is_writeback_locked(struct inode *inode) +{ + struct fuse_inode *fi = get_fuse_inode(inode); + pgoff_t idx_from = 0; + pgoff_t idx_to = 0; + size_t fuse_inode_size = i_size_read(inode); + bool found; + + if (fuse_inode_size > 0) + idx_to = (fuse_inode_size - 1) >> PAGE_SHIFT; + + found = fuse_find_writeback(fi, idx_from, idx_to); + + return found; +} + /* * Check if any page in a range is under writeback * diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 119459ad9e50..dbb2a5ae99b6 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -1288,5 +1288,6 @@ struct fuse_file *fuse_file_open(struct fuse_mount *fm, u64 nodeid, unsigned int open_flags, bool isdir); void fuse_file_release(struct inode *inode, struct fuse_file *ff, unsigned int open_flags, fl_owner_t id, bool isdir); +bool fuse_file_is_writeback_locked(struct inode *inode); #endif /* _FS_FUSE_I_H */ diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index d1620bf01246..72316ca5ecca 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -23,6 +23,7 @@ #include #include #include +#include MODULE_AUTHOR("Miklos Szeredi "); MODULE_DESCRIPTION("Filesystem in Userspace"); @@ -244,8 +245,17 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr, * In case of writeback_cache enabled, writes update mtime, ctime and * may update i_size. In these cases trust the cached value in the * inode. + * + * One expection is if the page cache is clean and there is no in-flight + * fuse writeback request. The c/mtime and file size are allowed to be + * updated from server, so clear cache_mask in this case. */ cache_mask = fuse_get_cache_mask(inode); + if (!filemap_range_needs_writeback(inode->i_mapping, 0, + i_size_read(inode) - 1) && !fuse_file_is_writeback_locked(inode)) { + cache_mask = 0; + } + if (cache_mask & STATX_SIZE) attr->size = i_size_read(inode); -- 2.20.1