Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3548619pxj; Tue, 15 Jun 2021 03:28:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxQ014zhUzBYTqvmDUrrFIJmt7s1lwqCEG1qoJ9IXIRNT5KQagmiJB9+Rsno1RjXqAGawws X-Received: by 2002:a92:9411:: with SMTP id c17mr18261414ili.264.1623752920933; Tue, 15 Jun 2021 03:28:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623752920; cv=none; d=google.com; s=arc-20160816; b=hb0eDNjMSE86MESJnzi9i/2ufd6jVZgMHxkl5QHs9EB3xsqwuw9ZHu4KcU83WYI/dM 2IJhV/5XR6veqYcgu3Xvt+e42zZXbFPrSS5UFkhsB4vNH8kQuh53Z1rR2PXLcdONzoBg 5aiBgiQdrsLfvV/31XIhNKRTuT8feRt0Kc3OEY6kDSQUivMHDImXjPnBw/5Q9ZYn7pk5 oEuoPxaL1XEIy3Vl1/ruuSMd5ylhjCquVYUXq1IaRGY0UDrPN294ZJrvqX0a5ZUjeN3z 1cq5K0XKfXX1BbURyWzZd1ebiB8B4OpJkBUgtPPkY3tIqT+iZES/gmj4pz/7UWMXR4LR wSzw== 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 :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject; bh=flgTYgJSpjazHb4MKcC2qWho5GUmSlI5lKiqsDnAQYY=; b=wBDhZHac3bNqmpgQf8TdfHZQcwPkHQ50H4qT/QrFlu2DRWoa9F8hRD31j/UzNlMTDE 6VZkW54TJtybFEpqLRP1EEoy8oyQTpR0wgGZakY24j/vWUz5+SZ2QVSbfnDFVer6KNv3 Ju/k1j5+DYDMb4cv95AOHYLhdH54u6u6ZGYc+JkpwAqobZqJK5YZ+VIgqGxU3xvR3U5u 2igIdh8kWwz2AnusIZGbBytz0O7w+4j3NbKu0m2pajaXPRYZOWeazAfRwBoHUwf/T9h0 GNiOpQnqaQIDczgZ/GkFFGzhFNSzmu1SVy5Or/83p4I9/aUT028ZGDcOUV3enkPFNXZ5 sWyA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w29si1407561jap.40.2021.06.15.03.28.28; Tue, 15 Jun 2021 03:28:40 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231625AbhFOK2Z convert rfc822-to-8bit (ORCPT + 99 others); Tue, 15 Jun 2021 06:28:25 -0400 Received: from us-smtp-delivery-44.mimecast.com ([205.139.111.44]:55376 "EHLO us-smtp-delivery-44.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231626AbhFOK2X (ORCPT ); Tue, 15 Jun 2021 06:28:23 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-226-wu-Lyb9TPteVua-OfWEG7g-1; Tue, 15 Jun 2021 06:26:17 -0400 X-MC-Unique: wu-Lyb9TPteVua-OfWEG7g-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CDFBA81841E; Tue, 15 Jun 2021 10:26:15 +0000 (UTC) Received: from web.messagingengine.com (ovpn-116-40.sin2.redhat.com [10.67.116.40]) by smtp.corp.redhat.com (Postfix) with ESMTP id 19EDA5D9DD; Tue, 15 Jun 2021 10:26:08 +0000 (UTC) Subject: [PATCH v7 2/6] kernfs: add a revision to identify directory node changes From: Ian Kent To: Greg Kroah-Hartman , Tejun Heo Cc: Eric Sandeen , Fox Chen , Brice Goglin , Al Viro , Rick Lindsley , David Howells , Miklos Szeredi , Marcelo Tosatti , "Eric W. Biederman" , Carlos Maiolino , linux-fsdevel , Kernel Mailing List Date: Tue, 15 Jun 2021 18:26:07 +0800 Message-ID: <162375276735.232295.14056277248741694521.stgit@web.messagingengine.com> In-Reply-To: <162375263398.232295.14755578426619198534.stgit@web.messagingengine.com> References: <162375263398.232295.14755578426619198534.stgit@web.messagingengine.com> User-Agent: StGit/0.23 MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=raven@themaw.net X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: themaw.net Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a revision counter to kernfs directory nodes so it can be used to detect if a directory node has changed during negative dentry revalidation. There's an assumption that sizeof(unsigned long) <= sizeof(pointer) on all architectures and as far as I know that assumption holds. So adding a revision counter to the struct kernfs_elem_dir variant of the kernfs_node type union won't increase the size of the kernfs_node struct. This is because struct kernfs_elem_dir is at least sizeof(pointer) smaller than the largest union variant. It's tempting to make the revision counter a u64 but that would increase the size of kernfs_node on archs where sizeof(pointer) is smaller than the revision counter. Signed-off-by: Ian Kent --- fs/kernfs/dir.c | 3 +++ fs/kernfs/kernfs-internal.h | 19 +++++++++++++++++++ include/linux/kernfs.h | 5 +++++ 3 files changed, 27 insertions(+) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 33166ec90a112..48704c5b6a072 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -372,6 +372,7 @@ static int kernfs_link_sibling(struct kernfs_node *kn) /* successfully added, account subdir number */ if (kernfs_type(kn) == KERNFS_DIR) kn->parent->dir.subdirs++; + kernfs_inc_rev(kn->parent); return 0; } @@ -394,6 +395,7 @@ static bool kernfs_unlink_sibling(struct kernfs_node *kn) if (kernfs_type(kn) == KERNFS_DIR) kn->parent->dir.subdirs--; + kernfs_inc_rev(kn->parent); rb_erase(&kn->rb, &kn->parent->dir.children); RB_CLEAR_NODE(&kn->rb); @@ -1573,6 +1575,7 @@ int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent, */ kernfs_unlink_sibling(kn); kernfs_get(new_parent); + kernfs_inc_rev(new_parent); /* rename_lock protects ->parent and ->name accessors */ spin_lock_irq(&kernfs_rename_lock); diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h index ccc3b44f6306f..6a38897b4d02c 100644 --- a/fs/kernfs/kernfs-internal.h +++ b/fs/kernfs/kernfs-internal.h @@ -81,6 +81,25 @@ static inline struct kernfs_node *kernfs_dentry_node(struct dentry *dentry) return d_inode(dentry)->i_private; } +static inline void kernfs_set_rev(struct kernfs_node *parent, + struct dentry *dentry) +{ + dentry->d_time = parent->dir.rev; +} + +static inline void kernfs_inc_rev(struct kernfs_node *parent) +{ + parent->dir.rev++; +} + +static inline bool kernfs_dir_changed(struct kernfs_node *parent, + struct dentry *dentry) +{ + if (parent->dir.rev != dentry->d_time) + return true; + return false; +} + extern const struct super_operations kernfs_sops; extern struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache; diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 9e8ca8743c268..d68b4ad095737 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -98,6 +98,11 @@ struct kernfs_elem_dir { * better directly in kernfs_node but is here to save space. */ struct kernfs_root *root; + /* + * Monotonic revision counter, used to identify if a directory + * node has changed during negative dentry revalidation. + */ + unsigned long rev; }; struct kernfs_elem_symlink {