From nobody Wed Feb 11 15:58:23 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E96F2C7618A for ; Tue, 14 Mar 2023 10:40:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229695AbjCNKk6 (ORCPT ); Tue, 14 Mar 2023 06:40:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37168 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229516AbjCNKkr (ORCPT ); Tue, 14 Mar 2023 06:40:47 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7723520066; Tue, 14 Mar 2023 03:40:20 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id DC1431F88C; Tue, 14 Mar 2023 10:39:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1678790345; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lXpeUENOVL0/Czrcbie4Fl5tkihbr0boSVc43vZ6le0=; b=Z9PfuxwIIc5rqCtweTGg3hWo59RW+/6ocULRVrpd1KEjoR7MOdPxuyb4vpFCmUm5m4+KVX Z/38jta4sX67vr4tp4kOx/HZHmNKU5gr+l0CbJP1ebECdbseuzb//6wa+X7VY/qZQSVs67 j28C+8JOJp3Mz1qVCyorSR+GGoC12CU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1678790345; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lXpeUENOVL0/Czrcbie4Fl5tkihbr0boSVc43vZ6le0=; b=/G8hseUbm1026Kcf5vnHC15iIAvWyaAvIFDJk0Ixdq6NjaopCwZiXKmHA7HCKsQbjJdZkV n/+zjroxfNfYefAA== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 3378113A1B; Tue, 14 Mar 2023 10:39:05 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id +EBtCclOEGS4FQAAMHmgww (envelope-from ); Tue, 14 Mar 2023 10:39:05 +0000 Received: from localhost (brahms.olymp [local]) by brahms.olymp (OpenSMTPD) with ESMTPA id 219aa8f7; Tue, 14 Mar 2023 10:39:03 +0000 (UTC) From: =?UTF-8?q?Lu=C3=ADs=20Henriques?= To: Eric Biggers , Xiubo Li , Jeff Layton Cc: "Theodore Y. Ts'o" , Jaegeuk Kim , Ilya Dryomov , linux-fscrypt@vger.kernel.org, ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Lu=C3=ADs=20Henriques?= Subject: [PATCH v2 1/2] fscrypt: new helper function - fscrypt_prepare_atomic_open() Date: Tue, 14 Mar 2023 10:39:01 +0000 Message-Id: <20230314103902.32592-2-lhenriques@suse.de> In-Reply-To: <20230314103902.32592-1-lhenriques@suse.de> References: <20230314103902.32592-1-lhenriques@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch introduces a new helper function which prepares an atomic_open. Because atomic open can act as a lookup if handed a dentry that is negative, we need to set DCACHE_NOKEY_NAME if the key for the parent isn't available. The reason for getting the encryption info before checking if the directory= has the encryption key is because we may have the key available but the encrypt= ion info isn't yet set (maybe due to a drop_caches). The regular open path will call fscrypt_file_open() which uses function fscrypt_require_key() for sett= ing the encryption info if needed. The atomic open needs to do something simil= ar. Signed-off-by: Lu=C3=ADs Henriques Reviewed-by: Xiubo Li --- fs/crypto/hooks.c | 33 +++++++++++++++++++++++++++++++++ include/linux/fscrypt.h | 7 +++++++ 2 files changed, 40 insertions(+) diff --git a/fs/crypto/hooks.c b/fs/crypto/hooks.c index 7b8c5a1104b5..165ddf01bf9f 100644 --- a/fs/crypto/hooks.c +++ b/fs/crypto/hooks.c @@ -117,6 +117,39 @@ int __fscrypt_prepare_readdir(struct inode *dir) } EXPORT_SYMBOL_GPL(__fscrypt_prepare_readdir); =20 +/** + * fscrypt_prepare_atomic_open() - prepare an atomic open on an encrypted = directory + * @dir: inode of parent directory + * @dentry: dentry being open + * + * Because atomic open can act as a lookup if handed a dentry that is nega= tive, + * we need to set DCACHE_NOKEY_NAME if the key for the parent isn't availa= ble. + * + * The reason for getting the encryption info before checking if the direc= tory + * has the encryption key is because the key may be available but the encr= yption + * info isn't yet set (maybe due to a drop_caches). The regular open path= will + * call fscrypt_file_open() which uses function fscrypt_require_key() for + * setting the encryption info if needed. The atomic open needs to do som= ething + * similar. + * + * Return: 0 on success, or an error code if fscrypt_get_encryption_info() + * fails. + */ +int fscrypt_prepare_atomic_open(struct inode *dir, struct dentry *dentry) +{ + int err; + + err =3D fscrypt_get_encryption_info(dir, true); + if (!err && !fscrypt_has_encryption_key(dir)) { + spin_lock(&dentry->d_lock); + dentry->d_flags |=3D DCACHE_NOKEY_NAME; + spin_unlock(&dentry->d_lock); + } + + return err; +} +EXPORT_SYMBOL_GPL(fscrypt_prepare_atomic_open); + int __fscrypt_prepare_setattr(struct dentry *dentry, struct iattr *attr) { if (attr->ia_valid & ATTR_SIZE) diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h index 4f5f8a651213..c70acb2a737a 100644 --- a/include/linux/fscrypt.h +++ b/include/linux/fscrypt.h @@ -362,6 +362,7 @@ int __fscrypt_prepare_rename(struct inode *old_dir, str= uct dentry *old_dentry, int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry, struct fscrypt_name *fname); int __fscrypt_prepare_readdir(struct inode *dir); +int fscrypt_prepare_atomic_open(struct inode *dir, struct dentry *dentry); int __fscrypt_prepare_setattr(struct dentry *dentry, struct iattr *attr); int fscrypt_prepare_setflags(struct inode *inode, unsigned int oldflags, unsigned int flags); @@ -688,6 +689,12 @@ static inline int __fscrypt_prepare_readdir(struct ino= de *dir) return -EOPNOTSUPP; } =20 +static inline int fscrypt_prepare_atomic_open(struct inode *dir, + struct dentry *dentry) +{ + return -EOPNOTSUPP; +} + static inline int __fscrypt_prepare_setattr(struct dentry *dentry, struct iattr *attr) {