Received: by 2002:a05:6359:6284:b0:131:369:b2a3 with SMTP id se4csp2523625rwb; Sun, 6 Aug 2023 21:25:47 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH5Bs0oIqK+zyP8gfc8XtKiJGwi2IQC5dii7yVA4x6jeARyhsxJ3eaNwsrhtyuqhubTC2NJ X-Received: by 2002:a17:90a:8986:b0:269:524f:2a19 with SMTP id v6-20020a17090a898600b00269524f2a19mr2905492pjn.26.1691382347085; Sun, 06 Aug 2023 21:25:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691382347; cv=none; d=google.com; s=arc-20160816; b=Q/GjejB3ExeP6qJbHlZHYuvxbEACv/+C+N0UvOS4RsLYlml84nUNbveP79gHCjvj05 NcUZTPt99c+3POhgZx9Gglsnk4algE+iFxzkxhnf/fYa/JXUHaS+OHJTe2JkzS57bOGT p+tOwCTJYux3fL2DNda+gclZQ5GoMpYkZ8yuHOHBjmlKd1czvh4L92chjlnCuQcL9rEo LJBhboQnxXaY/5FVZztiwx61woxfj6CJOOlZrdTxenPM+61YmpgDuzhhpRfrK+E0pByA x+zN1HY0d8mFrQxsYW9VWT+RqxIf1NVboRRCzaPzN3L7TonA9alme6WUxw3DgN2KSinX uryQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=G1Ss6Zu6KDUKnIWTfTdD1avxJMXCefuvC5IKQQ+Drm4=; fh=rZzFfA0zAM6yEq76SMH7KBlAKdgq8IFvn1kg9Q4igA4=; b=xy52p4fncLQXmVbHREYckV0bgu8pAXCRO2aYlWgOsfGsiO/Db5E8kSz8zMQzCXRcja mkdI47EkxkQwIRmWtKeWL2GfwYepibwZRHigKcSNW34EZIkOCYLS1msuWg67Xb+eDEom PtUlcvOhli8sOz+hYcmS39Z3CNHt4TAq5DPw/IzwhP7QfzIN3aREOLv50q193iaJ3oUY 39ZfhHD/SLlCNoIza03SCGC07rEimwUm63a4Xokd+PICxMvd5kYIhtIXJ1hZ/wQOgTwd TAwWIYX5t+mXzQMl6V7mM+vN4hhFOosKpB1ETq9fGpOalePKhpO+T+rGaiUpjVFWsnZ2 JJEQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=qBNOpSAv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x13-20020a17090a8a8d00b00268345e910csi5285826pjn.127.2023.08.06.21.25.34; Sun, 06 Aug 2023 21:25:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=qBNOpSAv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229947AbjHGC4Y (ORCPT + 99 others); Sun, 6 Aug 2023 22:56:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48964 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229970AbjHGC4T (ORCPT ); Sun, 6 Aug 2023 22:56:19 -0400 Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EBCB3171E for ; Sun, 6 Aug 2023 19:55:45 -0700 (PDT) Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1bc65360648so9468505ad.1 for ; Sun, 06 Aug 2023 19:55:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691376944; x=1691981744; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=G1Ss6Zu6KDUKnIWTfTdD1avxJMXCefuvC5IKQQ+Drm4=; b=qBNOpSAvsRX7NZexEKzLiyF2XJmqUIVDt9Srb9fenSHGtYV7OuPree4w0XbF/PubUu 7PnxZPkwtGO0Wib+Fu5zsk+RBI3OCF8zojA6eq5emL38+i2qEgFLQUKcYuldzPuUVkIj 5QNXpPEevBJPJhJQbhKeMNyDTu5jgU4OkJ2YGx57Nu2wHVCujhdsiaUo8dpsVewPZDAL YHUSR3/yIsXNkFkFCb+77mYvDJ0VFRuPwvEaRtp0QVKq7bOx8v1dLZgo6WJZrbuvAU8x gKQCMaS0ACI9qIT2EjxaF1NYZYwPnfr138Pq5vk/Ireui6ffh6Kvm1YWrcTu/t5bX8WB vlBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691376944; x=1691981744; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=G1Ss6Zu6KDUKnIWTfTdD1avxJMXCefuvC5IKQQ+Drm4=; b=gVhOxY7jmgnAHNo1116s1Qg/NlgLJBDc2PJxzOK4NAdW1ObPZmKr5/2+bnI1lb23F6 mVFKKs8pwz+ZGt8W6gC39Sxts1qr6gTYeprBo7zBoQyz7BM6uKpNo3aC1wpagFBfsfWd pbsK8HDpX47cn4zs27QDqrJ/bgj//6wlGmn/rqv6EF7sa1A2KhElBsyPgJ+Y5M3/OM5r gJvenCAipbidYREi2gs+Vfa48Aqwnc+PALHEeT/XST61rkbwGLTMBG1dZS1tpfMNUQlB xHKN3bO0b3FVYO70tVnFz28UEfg4FEtEfwguYBXaXJNRWSoOmDF+d6bS0ieST+ZSkEdi i+Yw== X-Gm-Message-State: AOJu0YzZvKmR1t9wRRlld3MxtTuIeukt8ep6v0t23pNHQeD1AOEE5VNF 4fWcHBB1YiyIw0ZPebRaKOnwsA== X-Received: by 2002:a17:902:f7c9:b0:1bb:b91b:2b40 with SMTP id h9-20020a170902f7c900b001bbb91b2b40mr8462349plw.60.1691376943816; Sun, 06 Aug 2023 19:55:43 -0700 (PDT) Received: from localhost ([164.70.16.189]) by smtp.gmail.com with ESMTPSA id a7-20020a170902ecc700b001aaecc0b6ffsm5502354plh.160.2023.08.06.19.55.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Aug 2023 19:55:41 -0700 (PDT) From: Masahisa Kojima To: Ard Biesheuvel , Jens Wiklander , Jan Kiszka , Sumit Garg , linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Ilias Apalodimas , Johan Hovold , Masahisa Kojima , Randy Dunlap , Heinrich Schuchardt , Jonathan Cameron , Jeremy Kerr , linux-efi@vger.kernel.org Subject: [PATCH v8 4/5] efivarfs: automatically update super block flag Date: Mon, 7 Aug 2023 11:53:41 +0900 Message-Id: <20230807025343.1939-5-masahisa.kojima@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230807025343.1939-1-masahisa.kojima@linaro.org> References: <20230807025343.1939-1-masahisa.kojima@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org efivar operation is updated when the tee_stmm_efi module is probed. tee_stmm_efi module supports SetVariable runtime service, but user needs to manually remount the efivarfs as RW to enable the write access if the previous efivar operation does not support SerVariable and efivarfs is mounted as read-only. This commit notifies the update of efivar operation to efivarfs subsystem, then drops SB_RDONLY flag if the efivar operation supports SetVariable. Signed-off-by: Masahisa Kojima --- drivers/firmware/efi/efi.c | 6 ++++++ drivers/firmware/efi/vars.c | 8 ++++++++ fs/efivarfs/super.c | 33 +++++++++++++++++++++++++++++++++ include/linux/efi.h | 8 ++++++++ 4 files changed, 55 insertions(+) diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index 53ae25bbb6ac..d2eec5ed8e5e 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -187,6 +188,9 @@ static const struct attribute_group efi_subsys_attr_group = { .is_visible = efi_attr_is_visible, }; +struct blocking_notifier_head efivar_ops_nh; +EXPORT_SYMBOL_GPL(efivar_ops_nh); + static struct efivars generic_efivars; static struct efivar_operations generic_ops; @@ -427,6 +431,8 @@ static int __init efisubsys_init(void) platform_device_register_simple("efivars", 0, NULL, 0); } + BLOCKING_INIT_NOTIFIER_HEAD(&efivar_ops_nh); + error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group); if (error) { pr_err("efi: Sysfs attribute export failed with error %d.\n", diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c index e9dc7116daf1..f654e6f6af87 100644 --- a/drivers/firmware/efi/vars.c +++ b/drivers/firmware/efi/vars.c @@ -63,6 +63,7 @@ int efivars_register(struct efivars *efivars, const struct efivar_operations *ops) { int rv; + int event; if (down_interruptible(&efivars_lock)) return -EINTR; @@ -77,6 +78,13 @@ int efivars_register(struct efivars *efivars, __efivars = efivars; + if (efivar_supports_writes()) + event = EFIVAR_OPS_RDWR; + else + event = EFIVAR_OPS_RDONLY; + + blocking_notifier_call_chain(&efivar_ops_nh, event, NULL); + pr_info("Registered efivars operations\n"); rv = 0; out: diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c index e028fafa04f3..0f6e4d223aea 100644 --- a/fs/efivarfs/super.c +++ b/fs/efivarfs/super.c @@ -14,11 +14,36 @@ #include #include #include +#include #include "internal.h" LIST_HEAD(efivarfs_list); +struct efivarfs_info { + struct super_block *sb; + struct notifier_block nb; +}; + +static struct efivarfs_info info; + +static int efivarfs_ops_notifier(struct notifier_block *nb, unsigned long event, + void *data) +{ + switch (event) { + case EFIVAR_OPS_RDONLY: + info.sb->s_flags |= SB_RDONLY; + break; + case EFIVAR_OPS_RDWR: + info.sb->s_flags &= ~SB_RDONLY; + break; + default: + return NOTIFY_DONE; + } + + return NOTIFY_OK; +} + static void efivarfs_evict_inode(struct inode *inode) { clear_inode(inode); @@ -255,6 +280,12 @@ static int efivarfs_fill_super(struct super_block *sb, struct fs_context *fc) if (!root) return -ENOMEM; + info.sb = sb; + info.nb.notifier_call = efivarfs_ops_notifier; + err = blocking_notifier_chain_register(&efivar_ops_nh, &info.nb); + if (err) + return err; + INIT_LIST_HEAD(&efivarfs_list); err = efivar_init(efivarfs_callback, (void *)sb, true, &efivarfs_list); @@ -281,6 +312,8 @@ static int efivarfs_init_fs_context(struct fs_context *fc) static void efivarfs_kill_sb(struct super_block *sb) { + blocking_notifier_chain_unregister(&efivar_ops_nh, &info.nb); + info.sb = NULL; kill_litter_super(sb); if (!efivar_is_available()) diff --git a/include/linux/efi.h b/include/linux/efi.h index 603bba2d6437..17cd628b5c42 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -1365,6 +1365,14 @@ bool efi_config_table_is_usable(const efi_guid_t *guid, unsigned long table) umode_t efi_attr_is_visible(struct kobject *kobj, struct attribute *attr, int n); +/* + * efivar ops event type + */ +#define EFIVAR_OPS_RDONLY 0 +#define EFIVAR_OPS_RDWR 1 + +extern struct blocking_notifier_head efivar_ops_nh; + void efivars_generic_ops_register(void); void efivars_generic_ops_unregister(void); -- 2.30.2