Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp792623rdg; Fri, 13 Oct 2023 00:48:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHo+mEvdJbNZJuCvPycuothsTNxraBJGS02OIiPcEIjh9tuLJnMQttqjQTXKwrWN7XBo04b X-Received: by 2002:a05:6e02:1561:b0:351:5cdb:225c with SMTP id k1-20020a056e02156100b003515cdb225cmr34999574ilu.17.1697183283726; Fri, 13 Oct 2023 00:48:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697183283; cv=none; d=google.com; s=arc-20160816; b=opTUHyZjAJbahIAh1ToIk3YruYZPbzEIrt6AZdiySkcJS1uETU27IhifV6BgLLec3c /DrmbAD8JLWJKYyKgLCowRlt34xzbgZV77IR84QXpnpjYYejGMh1dxfuLWZu6Xrcj8z9 D67xDuquvteuBYMffhcY8I5TQVH72QZ7yHoO73AuKVeRZoXe45x7GM2MWRm5Q7wNQ+nw hWTAi5C/1q3D0umXO6SJXXG8HR/BXWx/ElDYy+ZzFh5M+zVt5ZI6fRHllUC53gVpv/8s g5xiVXXmpO3SvJAtsNFjZuP2XLmf5QHndJCqAiQ9YHFgQG9I995tNdZUkf1uX2a8MWCG gfpw== 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=jIMHOnYKgrKZVI5d8A5nr31GCdEXvfO3UnWIc+HhE5Q=; fh=2acbz04hQKGlNzErCIM2sP87nDS7IPYqq4pGDApTOxk=; b=A3DYcgZ054vw7vSJoEcR1V0djGhjlIRb8o1r13A1r4gRLvWVeF6XV93KW1lGmMsI/C /DGqPfO4SSM2me9zs98DWe+5Hc/r3UCmFaEx+yltt7vDW/COP6x72nfiCx6UTzRWnsYc aGJQrIZlOwpG+euntwBYswTlx22qgtskZ0U6I/CDsyThCva/dErZPqRLoPIgwxsFvDXv ub8MaZ/SNQyeILqxV6+5rc8EJO2fF75qIxrewMLOwb/xW/U4k01kslPVj9ZBXk5TsJLO h8LGHhyr8Hi16cuYUskEx8Io99ENn2lcY0uNkXsiLv7DocIOMq3BP78dRjXUD8GpmZvD HNBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=JbB7a2Z8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 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 snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id i8-20020a635408000000b00573ffd25b44si3994103pgb.182.2023.10.13.00.48.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Oct 2023 00:48:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=JbB7a2Z8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id B781682F05F6; Fri, 13 Oct 2023 00:48:02 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230011AbjJMHr4 (ORCPT + 99 others); Fri, 13 Oct 2023 03:47:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48604 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230004AbjJMHrm (ORCPT ); Fri, 13 Oct 2023 03:47:42 -0400 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EFA38C2 for ; Fri, 13 Oct 2023 00:47:39 -0700 (PDT) Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-1c888b3a25aso14396315ad.0 for ; Fri, 13 Oct 2023 00:47:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1697183259; x=1697788059; darn=vger.kernel.org; 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=jIMHOnYKgrKZVI5d8A5nr31GCdEXvfO3UnWIc+HhE5Q=; b=JbB7a2Z8oAg0fjKqqlkbE8P6uOJcJJA3026EpcN/+p76GCPijWGLnz/QxZs0HiUB06 bp7Cb6xR8xXl3pv8TzF6j93uRrA64qhUd6SCqGOBiNYZXqATK3Elo1vR3frtZWlBo4mx BP3r6AA57u8Hh61W/lUcfvOGdoqeUTfgm09s62aLxaNUw0Z5y6AqJnA5TRELTfYLwPhH lDPMLQW7QuCXu+S9vbTt0GRBGyWDdy1f/pNy7xcRxrIchzshBQWvVZD4Hc+3o/aagDqT UcNhyb3u/cldx5W/P8d8hcRjOZpXyfp2UW6qoCVD2OlqCtVkXwYGKuQCtrmE4CgsNamw ovow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697183259; x=1697788059; 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=jIMHOnYKgrKZVI5d8A5nr31GCdEXvfO3UnWIc+HhE5Q=; b=k6A5k2cwCUsCdIGEq4u4+m/SJ2Ir4HT4vyOg0dMZ0j1qB/VckKqebUGA3u6jvU43Ov P89k3tBcosqdEqjlF7YOA7RNxMqjWkcZVlcNSG32jVX69zhYY4WE7jH6IlXCcsl1R5AS fYbTmvIf/6IKIE9fxNJWj5Mq3YL0Q4SleCgywX7CH69uLss7ftQUvmRBNRYwfp5/0VHn e0LPxiDn+bJnwCqJ+J3fJJFtr4wB5Jeu6mpEtVngFiGGDO51OoX0srltP/bVvodpKHZz t6qYjcuzWoCdENpc3c7OuAZBKtQbu17NAzspskY1k9/eAnrhiVUcKyISTli2JnpsVwD9 0ULg== X-Gm-Message-State: AOJu0Yy/KU5ux2BLONmiteEuxkNgZrRwvLoXOkV4MJP8DhuE/u8UmNT0 6Yfz24C/RXRoI0LYjsaMZXZmbg== X-Received: by 2002:a17:902:ea11:b0:1c8:7d21:fc63 with SMTP id s17-20020a170902ea1100b001c87d21fc63mr25083841plg.56.1697183259386; Fri, 13 Oct 2023 00:47:39 -0700 (PDT) Received: from localhost.localdomain (fp9875a45d.knge128.ap.nuro.jp. [152.117.164.93]) by smtp.gmail.com with ESMTPSA id z8-20020a170903018800b001c9ccbb8fdasm3200548plg.260.2023.10.13.00.47.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Oct 2023 00:47:38 -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 v9 4/6] efivarfs: automatically update super block flag Date: Fri, 13 Oct 2023 16:45:37 +0900 Message-Id: <20231013074540.8980-5-masahisa.kojima@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20231013074540.8980-1-masahisa.kojima@linaro.org> References: <20231013074540.8980-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=ham 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 X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Fri, 13 Oct 2023 00:48:02 -0700 (PDT) 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 4776a3dd9a72..489707b9b0b0 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -1355,6 +1355,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