* [PATCH 6.1.y] efivarfs: expose used and total size
@ 2026-07-14 4:33 Mario Limonciello (AMD)
2026-07-14 4:58 ` Greg KH
2026-07-15 0:12 ` Sasha Levin
0 siblings, 2 replies; 6+ messages in thread
From: Mario Limonciello (AMD) @ 2026-07-14 4:33 UTC (permalink / raw)
To: stable; +Cc: Anisse Astier, Ard Biesheuvel, Mario Limonciello
From: Anisse Astier <an.astier@criteo.com>
When writing EFI variables, one might get errors with no other message
on why it fails. Being able to see how much is used by EFI variables
helps analyzing such issues.
Since this is not a conventional filesystem, block size is intentionally
set to 1 instead of PAGE_SIZE.
x86 quirks of reserved size are taken into account; so that available
and free size can be different, further helping debugging space issues.
With this patch, one can see the remaining space in EFI variable storage
via efivarfs, like this:
$ df -h /sys/firmware/efi/efivars/
Filesystem Size Used Avail Use% Mounted on
efivarfs 176K 106K 66K 62% /sys/firmware/efi/efivars
Signed-off-by: Anisse Astier <an.astier@criteo.com>
[ardb: - rename efi_reserved_space() to efivar_reserved_space()
- whitespace/coding style tweaks]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
(cherry-picked from d86ff3333cb1 ("efivarfs: expose used and total size"))
Adjusted for headers in linux-6.1.y
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
Cc:Steve McIntyre <steve@einval.com>
Cc:Richard Hughes <richard@hughsie.com>
Background for this backport is that fwupd needs to be able to do CA
updates on Debian oldstable (bookworm) which tracks 6.1.7. The CA update
process checks for free storage, and needs this function to do it.
arch/x86/platform/efi/quirks.c | 8 +++++++
drivers/firmware/efi/efi.c | 1 +
drivers/firmware/efi/vars.c | 12 +++++++++++
fs/efivarfs/super.c | 39 +++++++++++++++++++++++++++++++++-
include/linux/efi.h | 11 ++++++++++
5 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c
index b0b848d6933a..f0cc00032751 100644
--- a/arch/x86/platform/efi/quirks.c
+++ b/arch/x86/platform/efi/quirks.c
@@ -114,6 +114,14 @@ void efi_delete_dummy_variable(void)
EFI_VARIABLE_RUNTIME_ACCESS, 0, NULL);
}
+u64 efivar_reserved_space(void)
+{
+ if (efi_no_storage_paranoia)
+ return 0;
+ return EFI_MIN_RESERVE;
+}
+EXPORT_SYMBOL_GPL(efivar_reserved_space);
+
/*
* In the nonblocking case we do not attempt to perform garbage
* collection if we do not have enough free space. Rather, we do the
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index 9786dfff9f84..83b63dd2de9b 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -211,6 +211,7 @@ static int generic_ops_register(void)
generic_ops.get_variable = efi.get_variable;
generic_ops.get_next_variable = efi.get_next_variable;
generic_ops.query_variable_store = efi_query_variable_store;
+ generic_ops.query_variable_info = efi.query_variable_info;
if (efi_rt_services_supported(EFI_RT_SUPPORTED_SET_VARIABLE)) {
generic_ops.set_variable = efi.set_variable;
diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
index 4ca256bcd697..d22160e7c785 100644
--- a/drivers/firmware/efi/vars.c
+++ b/drivers/firmware/efi/vars.c
@@ -250,3 +250,15 @@ efi_status_t efivar_set_variable(efi_char16_t *name, efi_guid_t *vendor,
return status;
}
EXPORT_SYMBOL_NS_GPL(efivar_set_variable, EFIVAR);
+
+efi_status_t efivar_query_variable_info(u32 attr,
+ u64 *storage_space,
+ u64 *remaining_space,
+ u64 *max_variable_size)
+{
+ if (!__efivars->ops->query_variable_info)
+ return EFI_UNSUPPORTED;
+ return __efivars->ops->query_variable_info(attr, storage_space,
+ remaining_space, max_variable_size);
+}
+EXPORT_SYMBOL_NS_GPL(efivar_query_variable_info, EFIVAR);
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
index b8c4641ed152..6bd100f03aa5 100644
--- a/fs/efivarfs/super.c
+++ b/fs/efivarfs/super.c
@@ -14,6 +14,7 @@
#include <linux/slab.h>
#include <linux/magic.h>
#include <linux/printk.h>
+#include <linux/statfs.h>
#include "internal.h"
@@ -24,8 +25,44 @@ static void efivarfs_evict_inode(struct inode *inode)
clear_inode(inode);
}
+static int efivarfs_statfs(struct dentry *dentry, struct kstatfs *buf)
+{
+ const u32 attr = EFI_VARIABLE_NON_VOLATILE |
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS;
+ u64 storage_space, remaining_space, max_variable_size;
+ efi_status_t status;
+
+ status = efivar_query_variable_info(attr, &storage_space, &remaining_space,
+ &max_variable_size);
+ if (status != EFI_SUCCESS)
+ return efi_status_to_err(status);
+
+ /*
+ * This is not a normal filesystem, so no point in pretending it has a block
+ * size; we declare f_bsize to 1, so that we can then report the exact value
+ * sent by EFI QueryVariableInfo in f_blocks and f_bfree
+ */
+ buf->f_bsize = 1;
+ buf->f_namelen = NAME_MAX;
+ buf->f_blocks = storage_space;
+ buf->f_bfree = remaining_space;
+ buf->f_type = dentry->d_sb->s_magic;
+
+ /*
+ * In f_bavail we declare the free space that the kernel will allow writing
+ * when the storage_paranoia x86 quirk is active. To use more, users
+ * should boot the kernel with efi_no_storage_paranoia.
+ */
+ if (remaining_space > efivar_reserved_space())
+ buf->f_bavail = remaining_space - efivar_reserved_space();
+ else
+ buf->f_bavail = 0;
+
+ return 0;
+}
static const struct super_operations efivarfs_ops = {
- .statfs = simple_statfs,
+ .statfs = efivarfs_statfs,
.drop_inode = generic_delete_inode,
.evict_inode = efivarfs_evict_inode,
};
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 1d73c77051c0..5868c4b29332 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -1039,6 +1039,7 @@ struct efivar_operations {
efi_set_variable_t *set_variable;
efi_set_variable_t *set_variable_nonblocking;
efi_query_variable_store_t *query_variable_store;
+ efi_query_variable_info_t *query_variable_info;
};
struct efivars {
@@ -1047,6 +1048,12 @@ struct efivars {
const struct efivar_operations *ops;
};
+#ifdef CONFIG_X86
+u64 __attribute_const__ efivar_reserved_space(void);
+#else
+static inline u64 efivar_reserved_space(void) { return 0; }
+#endif
+
/*
* The maximum size of VariableName + Data = 1024
* Therefore, it's reasonable to save that much
@@ -1081,6 +1088,10 @@ efi_status_t efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
efi_status_t efivar_set_variable(efi_char16_t *name, efi_guid_t *vendor,
u32 attr, unsigned long data_size, void *data);
+efi_status_t efivar_query_variable_info(u32 attr, u64 *storage_space,
+ u64 *remaining_space,
+ u64 *max_variable_size);
+
#if IS_ENABLED(CONFIG_EFI_CAPSULE_LOADER)
extern bool efi_capsule_pending(int *reset_type);
--
2.53.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 6.1.y] efivarfs: expose used and total size
2026-07-14 4:33 [PATCH 6.1.y] efivarfs: expose used and total size Mario Limonciello (AMD)
@ 2026-07-14 4:58 ` Greg KH
2026-07-14 5:03 ` Mario Limonciello
2026-07-15 0:12 ` Sasha Levin
1 sibling, 1 reply; 6+ messages in thread
From: Greg KH @ 2026-07-14 4:58 UTC (permalink / raw)
To: Mario Limonciello (AMD)
Cc: stable, Anisse Astier, Ard Biesheuvel, Mario Limonciello
On Mon, Jul 13, 2026 at 11:33:29PM -0500, Mario Limonciello (AMD) wrote:
> From: Anisse Astier <an.astier@criteo.com>
>
> When writing EFI variables, one might get errors with no other message
> on why it fails. Being able to see how much is used by EFI variables
> helps analyzing such issues.
>
> Since this is not a conventional filesystem, block size is intentionally
> set to 1 instead of PAGE_SIZE.
>
> x86 quirks of reserved size are taken into account; so that available
> and free size can be different, further helping debugging space issues.
>
> With this patch, one can see the remaining space in EFI variable storage
> via efivarfs, like this:
>
> $ df -h /sys/firmware/efi/efivars/
> Filesystem Size Used Avail Use% Mounted on
> efivarfs 176K 106K 66K 62% /sys/firmware/efi/efivars
>
> Signed-off-by: Anisse Astier <an.astier@criteo.com>
> [ardb: - rename efi_reserved_space() to efivar_reserved_space()
> - whitespace/coding style tweaks]
> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> (cherry-picked from d86ff3333cb1 ("efivarfs: expose used and total size"))
> Adjusted for headers in linux-6.1.y
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
> Cc:Steve McIntyre <steve@einval.com>
> Cc:Richard Hughes <richard@hughsie.com>
>
> Background for this backport is that fwupd needs to be able to do CA
> updates on Debian oldstable (bookworm) which tracks 6.1.7. The CA update
> process checks for free storage, and needs this function to do it.
What is the git id of this commit?
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 6.1.y] efivarfs: expose used and total size
2026-07-14 4:58 ` Greg KH
@ 2026-07-14 5:03 ` Mario Limonciello
2026-07-14 5:19 ` Greg KH
0 siblings, 1 reply; 6+ messages in thread
From: Mario Limonciello @ 2026-07-14 5:03 UTC (permalink / raw)
To: Greg KH; +Cc: stable, Anisse Astier, Ard Biesheuvel, Mario Limonciello
On 7/13/26 11:58 PM, Greg KH wrote:
> On Mon, Jul 13, 2026 at 11:33:29PM -0500, Mario Limonciello (AMD) wrote:
>> From: Anisse Astier <an.astier@criteo.com>
>>
>> When writing EFI variables, one might get errors with no other message
>> on why it fails. Being able to see how much is used by EFI variables
>> helps analyzing such issues.
>>
>> Since this is not a conventional filesystem, block size is intentionally
>> set to 1 instead of PAGE_SIZE.
>>
>> x86 quirks of reserved size are taken into account; so that available
>> and free size can be different, further helping debugging space issues.
>>
>> With this patch, one can see the remaining space in EFI variable storage
>> via efivarfs, like this:
>>
>> $ df -h /sys/firmware/efi/efivars/
>> Filesystem Size Used Avail Use% Mounted on
>> efivarfs 176K 106K 66K 62% /sys/firmware/efi/efivars
>>
>> Signed-off-by: Anisse Astier <an.astier@criteo.com>
>> [ardb: - rename efi_reserved_space() to efivar_reserved_space()
>> - whitespace/coding style tweaks]
>> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
>> (cherry-picked from d86ff3333cb1 ("efivarfs: expose used and total size"))
>> Adjusted for headers in linux-6.1.y
>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
>> ---
>> Cc:Steve McIntyre <steve@einval.com>
>> Cc:Richard Hughes <richard@hughsie.com>
>>
>> Background for this backport is that fwupd needs to be able to do CA
>> updates on Debian oldstable (bookworm) which tracks 6.1.7. The CA update
>> process checks for free storage, and needs this function to do it.
>
> What is the git id of this commit?
Oh I mentioned it above between Ard's S-o-b and mine:
d86ff3333cb1 ("efivarfs: expose used and total size")
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 6.1.y] efivarfs: expose used and total size
2026-07-14 5:03 ` Mario Limonciello
@ 2026-07-14 5:19 ` Greg KH
0 siblings, 0 replies; 6+ messages in thread
From: Greg KH @ 2026-07-14 5:19 UTC (permalink / raw)
To: Mario Limonciello
Cc: stable, Anisse Astier, Ard Biesheuvel, Mario Limonciello
On Tue, Jul 14, 2026 at 12:03:19AM -0500, Mario Limonciello wrote:
>
>
> On 7/13/26 11:58 PM, Greg KH wrote:
> > On Mon, Jul 13, 2026 at 11:33:29PM -0500, Mario Limonciello (AMD) wrote:
> > > From: Anisse Astier <an.astier@criteo.com>
> > >
> > > When writing EFI variables, one might get errors with no other message
> > > on why it fails. Being able to see how much is used by EFI variables
> > > helps analyzing such issues.
> > >
> > > Since this is not a conventional filesystem, block size is intentionally
> > > set to 1 instead of PAGE_SIZE.
> > >
> > > x86 quirks of reserved size are taken into account; so that available
> > > and free size can be different, further helping debugging space issues.
> > >
> > > With this patch, one can see the remaining space in EFI variable storage
> > > via efivarfs, like this:
> > >
> > > $ df -h /sys/firmware/efi/efivars/
> > > Filesystem Size Used Avail Use% Mounted on
> > > efivarfs 176K 106K 66K 62% /sys/firmware/efi/efivars
> > >
> > > Signed-off-by: Anisse Astier <an.astier@criteo.com>
> > > [ardb: - rename efi_reserved_space() to efivar_reserved_space()
> > > - whitespace/coding style tweaks]
> > > Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> > > (cherry-picked from d86ff3333cb1 ("efivarfs: expose used and total size"))
> > > Adjusted for headers in linux-6.1.y
> > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> > > ---
> > > Cc:Steve McIntyre <steve@einval.com>
> > > Cc:Richard Hughes <richard@hughsie.com>
> > >
> > > Background for this backport is that fwupd needs to be able to do CA
> > > updates on Debian oldstable (bookworm) which tracks 6.1.7. The CA update
> > > process checks for free storage, and needs this function to do it.
> >
> > What is the git id of this commit?
>
> Oh I mentioned it above between Ard's S-o-b and mine:
>
> d86ff3333cb1 ("efivarfs: expose used and total size")
ick, you did, sorry, I missed it as that's not the "normal" cherry-pick
output, my fault
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 6.1.y] efivarfs: expose used and total size
2026-07-14 4:33 [PATCH 6.1.y] efivarfs: expose used and total size Mario Limonciello (AMD)
2026-07-14 4:58 ` Greg KH
@ 2026-07-15 0:12 ` Sasha Levin
2026-07-15 1:21 ` Mario Limonciello
1 sibling, 1 reply; 6+ messages in thread
From: Sasha Levin @ 2026-07-15 0:12 UTC (permalink / raw)
To: stable
Cc: Sasha Levin, Anisse Astier, Ard Biesheuvel, Mario Limonciello,
Mario Limonciello (AMD)
> Background for this backport is that fwupd needs to be able to do CA
> updates on Debian oldstable (bookworm) which tracks 6.1.7. The CA update
> process checks for free storage, and needs this function to do it.
Queued for 6.1. I also pulled in the follow-up fix 79b83606abc7 ("efivarfs: fix
statfs() on efivarfs") on top, so the broken statfs() error path this commit
shipped with doesn't land in 6.1.y, thanks.
--
Thanks,
Sasha
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 6.1.y] efivarfs: expose used and total size
2026-07-15 0:12 ` Sasha Levin
@ 2026-07-15 1:21 ` Mario Limonciello
0 siblings, 0 replies; 6+ messages in thread
From: Mario Limonciello @ 2026-07-15 1:21 UTC (permalink / raw)
To: Sasha Levin, stable
Cc: Anisse Astier, Ard Biesheuvel, Mario Limonciello (AMD)
On 7/14/26 19:12, Sasha Levin wrote:
>> Background for this backport is that fwupd needs to be able to do CA
>> updates on Debian oldstable (bookworm) which tracks 6.1.7. The CA update
>> process checks for free storage, and needs this function to do it.
>
> Queued for 6.1. I also pulled in the follow-up fix 79b83606abc7 ("efivarfs: fix
> statfs() on efivarfs") on top, so the broken statfs() error path this commit
> shipped with doesn't land in 6.1.y, thanks.
>
Much appreciated.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-07-15 1:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-14 4:33 [PATCH 6.1.y] efivarfs: expose used and total size Mario Limonciello (AMD)
2026-07-14 4:58 ` Greg KH
2026-07-14 5:03 ` Mario Limonciello
2026-07-14 5:19 ` Greg KH
2026-07-15 0:12 ` Sasha Levin
2026-07-15 1:21 ` Mario Limonciello
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox