Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp48172pxk; Tue, 22 Sep 2020 18:14:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzqHCZfsTKh5+/y0vEgzFUDyPMhR4jvS8ZxEyzI6bz/OU/dfhC16vCr5uESUOLz57eeveND X-Received: by 2002:a17:906:2b4f:: with SMTP id b15mr8063903ejg.477.1600823642797; Tue, 22 Sep 2020 18:14:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600823642; cv=none; d=google.com; s=arc-20160816; b=IvHQpD05Rzdg2+50xtm3BN0e5dAyb4xU+E51RG2d/+AV8dPZmmZwDeoCvLEqC8aqPH XXX99JjCg5jh08ObkurNYHFNV/yfSwhudG+3zL8RUp+zttMCTJFMAq5dQ4yExnnUMaQy s8RZJo4Ko3R93dKu1kfkNBCcUVld4wIRNafN7WB3OgooskRDar4e5/t3dK26BWHO+w/6 aYRSYRdN3KUu96AQ0TCg8U6I//hv0r5ej1IRinQluEtyYneHx/VubhpTj4xofU1CIQbA 94hJbWrh0RGbvh39px93C9XRm5hafRtxNEbQS27xjLyNrYB7O5gOriN6dgKjZrYU0TOe CeVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:sender:dkim-signature; bh=6Jea0D8IQymzKa0cePGlWsc3mYiPTYFJmjhFuidHEKk=; b=vTjSXsnrSRyujTLMLsW0hmp8UXYG1Jfc8TSjqS3NGvq6WmyesKPi/HZ6dv49TyicXD l+oaYCqAzWOBqYGG4cMQ/EokmahHo8sUT4KjPCgpsPqfV7xHN3s62h0Uh684ssbBdDpI 9a3RKjB9n1aAPzTTXIOOstHENZG4wJ/NLf8Od2XB23d0SDYp/earyBC8BPHtyOJqN62G PkwauVYnC6E2+83SCrudEphd36uyoh7OjNeszVhljxD9YWFQTBaxNHMqLZG6B7QZ/yh7 fNC07C56ll2jm9I3P8zXdnXO+A6pYn+TsM+0VtSLqIZ6SrFSnRE6AqvTPZLhPLyJvdCZ hAsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="Fw/pQ9kO"; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y39si12926253ede.275.2020.09.22.18.13.26; Tue, 22 Sep 2020 18:14:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-ext4-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=@google.com header.s=20161025 header.b="Fw/pQ9kO"; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726769AbgIWBJk (ORCPT + 99 others); Tue, 22 Sep 2020 21:09:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726848AbgIWBJ1 (ORCPT ); Tue, 22 Sep 2020 21:09:27 -0400 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 96128C0613D0 for ; Tue, 22 Sep 2020 18:09:27 -0700 (PDT) Received: by mail-pl1-x649.google.com with SMTP id r9so265366plo.13 for ; Tue, 22 Sep 2020 18:09:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=6Jea0D8IQymzKa0cePGlWsc3mYiPTYFJmjhFuidHEKk=; b=Fw/pQ9kOsMZOp4qcT//rGk0Ty0QnPBIDZAQyCHbGz+EB0pENDjiV0Msb9s3Us7Rqy8 LW694CF7h2UAEaewdIWmuHdo6GPeQxAY3OMDp4A30swVcAgrTfLA9IKzxZJbhW2PZdV4 4El+U8pvEnZ2ke/FYErM9S7pWsuw25W9oV0xGx2RW3h0AZQ0QWD/TCHm+TdQsnsVamCU HP8rIZr6ZqIXyFSFq6oumaQoSIMxhMCoxpT8dXxHepR7EUpmiSTu9hAWCSGTl1ejKyC7 Z5ARTwIW+48S7v6wv+Ryn4ULJPl8AS1R4hZUc5xYPa2P7yyEnjnn8uzXiByNpwqIICgl lI8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=6Jea0D8IQymzKa0cePGlWsc3mYiPTYFJmjhFuidHEKk=; b=kX/PEJ2CM+lF81xeUrxMOg/z2paeRBozqQ4MyiVNNkpLTkhKgpYO5kF85fggOooc9t XeizsG7AQBJXn6xYaINN9KP9ZFglhDW2kSiDKAD0gMk6S2OkIpT+gdKbkeJSiDBibghr pJ75kS4U+CeigbAkNxWypRSHzIJ2+g2IJkEoDGFZv6JuVAkhK/lRgKfYqQ6w/z+Bj94W +9HetMr5aJ5zsHfh7vFpMXgUw1JBmZAl012a2XqTM4hsk5fenY+3HhNT2d5+KnXmJFfi qafKBbMGNxgBUgFYHAwU/NMUtobf0jeJcE1ZzCsXPoWKKdEe2Gz+B6srYlwlIDmzINQj mpNw== X-Gm-Message-State: AOAM532cWCLAVpbuFKIo18NTi5xurUvojqeytnx2GTRbfkW/FB7wN+cE 8+nP8VvZS1vE2u9yMPALLxBtuUFPZRY= Sender: "drosen via sendgmr" X-Received: from drosen.c.googlers.com ([fda3:e722:ac3:10:24:72f4:c0a8:4e6f]) (user=drosen job=sendgmr) by 2002:a62:1451:0:b029:13e:d13d:a058 with SMTP id 78-20020a6214510000b029013ed13da058mr6581273pfu.30.1600823367027; Tue, 22 Sep 2020 18:09:27 -0700 (PDT) Date: Wed, 23 Sep 2020 01:01:49 +0000 In-Reply-To: <20200923010151.69506-1-drosen@google.com> Message-Id: <20200923010151.69506-4-drosen@google.com> Mime-Version: 1.0 References: <20200923010151.69506-1-drosen@google.com> X-Mailer: git-send-email 2.28.0.681.g6f77f65b4e-goog Subject: [PATCH 3/5] libfs: Add generic function for setting dentry_ops From: Daniel Rosenberg To: "Theodore Y . Ts'o" , Jaegeuk Kim , Eric Biggers , Andreas Dilger , Chao Yu , Alexander Viro , Richard Weinberger , linux-fscrypt@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mtd@lists.infradead.org, Gabriel Krisman Bertazi , kernel-team@android.com, Daniel Rosenberg Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org This adds a function to set dentry operations at lookup time that will work for both encrypted files and casefolded filenames. A filesystem that supports both features simultaneously can use this function during lookup preperations to set up its dentry operations once fscrypt no longer does that itself. Currently the casefolding dentry operation are always set because the feature is toggleable on empty directories. Since we don't know what set of functions we'll eventually need, and cannot change them later, we add just add them. Signed-off-by: Daniel Rosenberg --- fs/libfs.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 1 + 2 files changed, 50 insertions(+) diff --git a/fs/libfs.c b/fs/libfs.c index fc34361c1489..83303858f1fe 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -1449,4 +1449,53 @@ int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str) return 0; } EXPORT_SYMBOL(generic_ci_d_hash); + +static const struct dentry_operations generic_ci_dentry_ops = { + .d_hash = generic_ci_d_hash, + .d_compare = generic_ci_d_compare, +}; +#endif + +#ifdef CONFIG_FS_ENCRYPTION +static const struct dentry_operations generic_encrypted_dentry_ops = { + .d_revalidate = fscrypt_d_revalidate, +}; +#endif + +#if IS_ENABLED(CONFIG_UNICODE) && IS_ENABLED(CONFIG_FS_ENCRYPTION) +static const struct dentry_operations generic_encrypted_ci_dentry_ops = { + .d_hash = generic_ci_d_hash, + .d_compare = generic_ci_d_compare, + .d_revalidate = fscrypt_d_revalidate, +}; +#endif + +/** + * generic_set_encrypted_ci_d_ops - helper for setting d_ops for given dentry + * @dentry: dentry to set ops on + * + * This function sets the dentry ops for the given dentry to handle both + * casefolding and encryption of the dentry name. + */ +void generic_set_encrypted_ci_d_ops(struct dentry *dentry) +{ +#ifdef CONFIG_FS_ENCRYPTION + if (dentry->d_flags & DCACHE_ENCRYPTED_NAME) { +#ifdef CONFIG_UNICODE + if (dentry->d_sb->s_encoding) { + d_set_d_op(dentry, &generic_encrypted_ci_dentry_ops); + return; + } #endif + d_set_d_op(dentry, &generic_encrypted_dentry_ops); + return; + } +#endif +#ifdef CONFIG_UNICODE + if (dentry->d_sb->s_encoding) { + d_set_d_op(dentry, &generic_ci_dentry_ops); + return; + } +#endif +} +EXPORT_SYMBOL(generic_set_encrypted_ci_d_ops); diff --git a/include/linux/fs.h b/include/linux/fs.h index bc5417c61e12..6627896db835 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3277,6 +3277,7 @@ extern int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str); extern int generic_ci_d_compare(const struct dentry *dentry, unsigned int len, const char *str, const struct qstr *name); #endif +extern void generic_set_encrypted_ci_d_ops(struct dentry *dentry); #ifdef CONFIG_MIGRATION extern int buffer_migrate_page(struct address_space *, -- 2.28.0.681.g6f77f65b4e-goog