Received: by 10.192.165.148 with SMTP id m20csp2831787imm; Mon, 7 May 2018 01:50:48 -0700 (PDT) X-Google-Smtp-Source: AB8JxZo5TYkOboa4ekmMMj7asKf062p2SpBrXMuvovQvsHxD2cwBvx7bUJVrTJ4tgjwMsFsTH0du X-Received: by 2002:a63:887:: with SMTP id 129-v6mr29054967pgi.17.1525683048386; Mon, 07 May 2018 01:50:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525683048; cv=none; d=google.com; s=arc-20160816; b=NdymKUWENyUhEdixpMReGsc5k0KHvkiAMwSMV1UrXWI+ssW9GbxYFNf8SSjoGatPtp F5dd4ygtH1G4fMw93p9XZruLZ+chI2BRTsGsy5v/sMzdc0iq/bWlDycdiyveazVxVFMb ydQFWRhvv61gSkWpFeJ8SVJPhF2piolyF7wN83urQxU772Z6xCT0DPGuBWIqX2doWNZV BZBArALLCoZPkWUBg4gI6dMxajh9ItLKvoimegrn9Uj6jdyDmcANywKDnN3O1Cn/Ti8M 635MK6oJunsmhOm+v9gSgbq5oA21CsEmr7o8zD32ZwaH9nK/6dbsqD7iXj/8MmLfqi+J E4ew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=EeTHeFHl2eq/O+gx4CZAJEhe7vsx66jv1ArLl+y7Ubk=; b=fvjsA9CVOjrv+tBXP0wTL5+FxLWRUOVAUFLW77Lz5NXnaVq0bxHbx46kFaBIhdxnJ+ UBK+CqHU2eHVm1oy8AAMXk8UK3rXs0Fdiih+0SeGw3JsEnEfUpw2NzNQFxP38v4QCj7E KZut+wFQdXh2vYKwr9rZzIDBWevpNJNBbtLds5sg6X5Db4i0yVLhKppSkKpZdWbYPg+X mAiGoPdDAMEEndDpcEstqqo8wPFLTBb4wqAg0MHdCPD7zqhUTUdAWndeh4QSle8xHuXY OjRF3dOMXR+QRjQF6dy/01AakuF4bFgiJiTAsyhgm8MIeqjxQ9hVXSikwpWBAeRt4jAk BWMA== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 189-v6si17749579pgi.254.2018.05.07.01.50.33; Mon, 07 May 2018 01:50:48 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751977AbeEGIt1 (ORCPT + 99 others); Mon, 7 May 2018 04:49:27 -0400 Received: from mail-wr0-f196.google.com ([209.85.128.196]:41047 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752085AbeEGIiV (ORCPT ); Mon, 7 May 2018 04:38:21 -0400 Received: by mail-wr0-f196.google.com with SMTP id g21-v6so27833522wrb.8 for ; Mon, 07 May 2018 01:38:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EeTHeFHl2eq/O+gx4CZAJEhe7vsx66jv1ArLl+y7Ubk=; b=MnuCmVGpEuZQ6X6C7lLkqsVLbVVMkkYc8Gb7lE8boHZnAHy/lYrgKUSes9LNMOg+2F 8v4vGVEFMKR6Fa846PQPzR2UqQmYGBq4LiNZYI3bxyK3RPsMk03BvtIoYhWY61Of7N7x F7GErSuvbAjZ0j7dkKgxHClyIUwNnSOZtgqWN2v//WmX/5RSISuSYgEK3eTE3LZX8io9 tVQpzdUGm/btZ357Medidbc1qI9eH1qtp7kWx/5jll7a3nT1bU0156BAigbcWF0XQloO rWrHav5d3FT2JYQrpBSFWKJVXrfRvTafzP6dw1HlNIcwjkqIBDJiEIps0L1i2FmOFKPW 2Uog== X-Gm-Message-State: ALQs6tBDzHPQJmQhh4/af0Aiu7Ud8dkAhysMe4pn+1IZBS6aABJBWXaK Jr0aaV4gw61SAhI1jHXBdIzGJA== X-Received: by 2002:adf:8827:: with SMTP id d36-v6mr28133026wrd.41.1525682299720; Mon, 07 May 2018 01:38:19 -0700 (PDT) Received: from veci.piliscsaba.redhat.com (C2B0E321.catv.pool.telekom.hu. [194.176.227.33]) by smtp.gmail.com with ESMTPSA id h8-v6sm5908050wmc.16.2018.05.07.01.38.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 07 May 2018 01:38:19 -0700 (PDT) From: Miklos Szeredi To: linux-unionfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 06/35] ovl: copy up times Date: Mon, 7 May 2018 10:37:38 +0200 Message-Id: <20180507083807.28792-7-mszeredi@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180507083807.28792-1-mszeredi@redhat.com> References: <20180507083807.28792-1-mszeredi@redhat.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Copy up mtime and ctime to overlay inode after times in real object are modified. Be careful not to dirty cachelines when not necessary. This is in preparation for moving overlay functionality out of the VFS. This patch shouldn't have any observable effect. Signed-off-by: Miklos Szeredi --- fs/overlayfs/dir.c | 33 +++++++++++++++++++++++++-------- fs/overlayfs/inode.c | 3 +++ fs/overlayfs/overlayfs.h | 2 +- fs/overlayfs/util.c | 10 +++++++++- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 839709c7803a..47dc980e8b33 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -186,11 +186,11 @@ static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry) static void ovl_instantiate(struct dentry *dentry, struct inode *inode, struct dentry *newdentry, bool hardlink) { - ovl_dentry_version_inc(dentry->d_parent, false); + ovl_dir_modified(dentry->d_parent, false); + ovl_copyattr(d_inode(newdentry), inode); ovl_dentry_set_upper_alias(dentry); if (!hardlink) { ovl_inode_update(inode, newdentry); - ovl_copyattr(newdentry->d_inode, inode); } else { WARN_ON(ovl_inode_real(inode) != d_inode(newdentry)); dput(newdentry); @@ -658,7 +658,7 @@ static int ovl_remove_and_whiteout(struct dentry *dentry, if (err) goto out_d_drop; - ovl_dentry_version_inc(dentry->d_parent, true); + ovl_dir_modified(dentry->d_parent, true); out_d_drop: d_drop(dentry); out_dput_upper: @@ -703,7 +703,7 @@ static int ovl_remove_upper(struct dentry *dentry, bool is_dir, err = vfs_rmdir(dir, upper); else err = vfs_unlink(dir, upper, NULL); - ovl_dentry_version_inc(dentry->d_parent, ovl_type_origin(dentry)); + ovl_dir_modified(dentry->d_parent, ovl_type_origin(dentry)); /* * Keeping this dentry hashed would mean having to release @@ -733,6 +733,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) int err; bool locked = false; const struct cred *old_cred; + struct dentry *upperdentry; bool lower_positive = ovl_lower_positive(dentry); LIST_HEAD(list); @@ -768,6 +769,17 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) drop_nlink(dentry->d_inode); } ovl_nlink_end(dentry, locked); + + /* + * Copy ctime + * + * Note: we fail to update ctime if there was no copy-up, only a + * whiteout + */ + upperdentry = ovl_dentry_upper(dentry); + if (upperdentry) + ovl_copyattr(d_inode(upperdentry), d_inode(dentry)); + out_drop_write: ovl_drop_write(dentry); out: @@ -1074,10 +1086,15 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, drop_nlink(d_inode(new)); } - ovl_dentry_version_inc(old->d_parent, ovl_type_origin(old) || - (!overwrite && ovl_type_origin(new))); - ovl_dentry_version_inc(new->d_parent, ovl_type_origin(old) || - (d_inode(new) && ovl_type_origin(new))); + ovl_dir_modified(old->d_parent, ovl_type_origin(old) || + (!overwrite && ovl_type_origin(new))); + ovl_dir_modified(new->d_parent, ovl_type_origin(old) || + (d_inode(new) && ovl_type_origin(new))); + + /* copy ctime: */ + ovl_copyattr(d_inode(olddentry), d_inode(old)); + if (d_inode(new) && ovl_dentry_upper(new)) + ovl_copyattr(d_inode(newdentry), d_inode(new)); out_dput: dput(newdentry); diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 6e3815fb006b..d3700f0de165 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -304,6 +304,9 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, } revert_creds(old_cred); + /* copy c/mtime */ + ovl_copyattr(d_inode(realdentry), inode); + out_drop_write: ovl_drop_write(dentry); out: diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index e0b7de799f6b..271561fa7882 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -237,7 +237,7 @@ void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect); void ovl_inode_init(struct inode *inode, struct dentry *upperdentry, struct dentry *lowerdentry); void ovl_inode_update(struct inode *inode, struct dentry *upperdentry); -void ovl_dentry_version_inc(struct dentry *dentry, bool impurity); +void ovl_dir_modified(struct dentry *dentry, bool impurity); u64 ovl_dentry_version_get(struct dentry *dentry); bool ovl_is_whiteout(struct dentry *dentry); struct file *ovl_path_open(struct path *path, int flags); diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 6f1078028c66..30a05d1d679d 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -333,7 +333,7 @@ void ovl_inode_update(struct inode *inode, struct dentry *upperdentry) } } -void ovl_dentry_version_inc(struct dentry *dentry, bool impurity) +static void ovl_dentry_version_inc(struct dentry *dentry, bool impurity) { struct inode *inode = d_inode(dentry); @@ -348,6 +348,14 @@ void ovl_dentry_version_inc(struct dentry *dentry, bool impurity) OVL_I(inode)->version++; } +void ovl_dir_modified(struct dentry *dentry, bool impurity) +{ + /* Copy mtime/ctime */ + ovl_copyattr(d_inode(ovl_dentry_upper(dentry)), d_inode(dentry)); + + ovl_dentry_version_inc(dentry, impurity); +} + u64 ovl_dentry_version_get(struct dentry *dentry) { struct inode *inode = d_inode(dentry); -- 2.14.3