Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3467242imm; Tue, 29 May 2018 07:45:29 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqChyQdkKaH9VnsmTT6UyL7uCfZH70k6btHtDkxNE2ifZuSCr55A7c6u/Yigptfc2QVCRTY X-Received: by 2002:a17:902:bb84:: with SMTP id m4-v6mr17737027pls.339.1527605129441; Tue, 29 May 2018 07:45:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527605129; cv=none; d=google.com; s=arc-20160816; b=K7TVx5cH1i3FyTMlpclPy7cAopqV2Kd9Hf9sZI9IfaykxqNBeUmsm8L+GBuuadGjx3 TN1BVZbq83WalD7LbbFSDbz7cKpcCw8A0mKNtSdc08N+WnwDEhohCSVY3Qo7Wwa/nse5 kyn7hbCxxa9VB4+otISlJiYhE0nzWPV7g4iw9IxMx0dwugy5+smBF+7/vBA6XS7POuQs zgnjbIB2inwRwoQGiENWHVp5zxUOI5z4zShuxS0geWKpmQaiTOVyWkEBrC50WQL3ZJD9 /Pj7scgRr/8yOMIuuuvoUbg1Cj/5S8fDb9fLwdqaVjniVSFauEQUaIlBnfbZIisioGCo ID7A== 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=1E9Dk22b9z9qqRj38F+rxLta+3FPF4bXtJARg++CfUE=; b=E/vfM25UyuH0dhebwIspB5ByKRfw8+k/acnuK7l0zd1NmIF+t52CriS9ON5LAS2AZF VungvAgAIY/JLKmBIQUuUt+7kbhIN/XE98XURPVOBFL3pLVA6S3uKX6HYjTDZoyzpvFi 97Rj3XnVA5iBrPUrujadkwZ4dOjTFBBqMfh7ThAabBZMJzuTsTFzumSaZweyw4t00vIK n5LubUgTqCysnGaaqNY4gdKBkpdSjYJpE8d4Vdai7nxZXWQuuGFDWu6tNww3TrbFFCEn zhM+86tOeLlbDkKdJVMbAIURmPyWEGCbth4jggCmtht4DQ0PBn08tWwG1TicQESn03Ex /30Q== 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 73-v6si4750117pld.450.2018.05.29.07.45.15; Tue, 29 May 2018 07:45:29 -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 S935715AbeE2OoJ (ORCPT + 99 others); Tue, 29 May 2018 10:44:09 -0400 Received: from mail-wm0-f50.google.com ([74.125.82.50]:54621 "EHLO mail-wm0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935569AbeE2Onx (ORCPT ); Tue, 29 May 2018 10:43:53 -0400 Received: by mail-wm0-f50.google.com with SMTP id f6-v6so41346921wmc.4 for ; Tue, 29 May 2018 07:43:52 -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=1E9Dk22b9z9qqRj38F+rxLta+3FPF4bXtJARg++CfUE=; b=FbtdDAPtI41yWfziT4kynyqN56HabvYyytRtC2CbCW9qQHwp8qeZ5m+/+rdiNLEkzj WpqrmHMQTIpoaDniXSiYEfEM9KjkYA/kvJZAObmawJ760xtNxfrFnFWfCftgmG/kK+3i MAGp1D+XmsJwJIsY3z4tV/Li0Mmc9HeWuM6CKQwlOeDpaMkyDW+l/TwAJflmG3sg3wsE d8G/Bh4xiIXdhEaPHpeTJh6fg4jwqTSei750jpzUloh6LTuUOG4PRCdWpFMtINC3PrBH O393VyKXU9Is2b5l8Xv2rPMP8j71IOd+PtqxKi2QfxAXibtcE5Pj9g5FclMJcOeomemC Exxg== X-Gm-Message-State: ALKqPwfRdbgN4RAcSSxdf1z6mLUmPshZQuVeEcINf3xUO26zXX1eGT45 XDA27bFwCQNzzr9Pa2STtYN3XQ== X-Received: by 2002:a1c:d4d2:: with SMTP id l201-v6mr10553918wmg.98.1527605031932; Tue, 29 May 2018 07:43:51 -0700 (PDT) Received: from veci.piliscsaba.redhat.com (catv-176-63-54-97.catv.broadband.hu. [176.63.54.97]) by smtp.gmail.com with ESMTPSA id t198-v6sm18834422wmt.23.2018.05.29.07.43.50 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 29 May 2018 07:43:51 -0700 (PDT) From: Miklos Szeredi To: linux-unionfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 09/39] ovl: copy up times Date: Tue, 29 May 2018 16:43:09 +0200 Message-Id: <20180529144339.16538-10-mszeredi@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180529144339.16538-1-mszeredi@redhat.com> References: <20180529144339.16538-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 | 31 ++++++++++++++++++++++++------- fs/overlayfs/inode.c | 3 +++ fs/overlayfs/overlayfs.h | 2 +- fs/overlayfs/util.c | 10 +++++++++- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index b2bc313241a6..8d8e063e4706 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -241,7 +241,7 @@ static int ovl_instantiate(struct dentry *dentry, struct inode *inode, .newinode = inode, }; - ovl_dentry_version_inc(dentry->d_parent, false); + ovl_dir_modified(dentry->d_parent, false); ovl_dentry_set_upper_alias(dentry); if (!hardlink) { /* @@ -721,7 +721,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: @@ -766,7 +766,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 @@ -796,6 +796,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); @@ -831,6 +832,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: @@ -1137,10 +1149,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 1db5b3b458a1..24fc27683a57 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 3c5e9f18b0d9..eeaad0710704 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -231,7 +231,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