diff mbox series

efivarfs: allow creation of zero length files

Message ID 63837c36eceaf8cf2af7933dccca54ff4dd9f30d.camel@HansenPartnership.com
State New
Headers show
Series efivarfs: allow creation of zero length files | expand

Commit Message

James Bottomley Feb. 26, 2025, 9:48 p.m. UTC
Temporarily allow the creation of zero length files in efivarfs so the
Linux Vendor Firmware Service can continue to operate. This hack should
be reverted as soon as the LVFS mechanisms for updating firmware have
been fixed.

LVFS has been coded to open a firmware file, close it, remove the
immutable bit and write to it.  Since commit 908af31f4896 ("efivarfs:
fix error on write to new variable leaving remnants") this behaviour
results in the first close removing the file which causes the second
write to fail.  To allow LVFS to keep working code up an indicator of
size 1 if a write fails and only remove the file on that condition (so
create at zero size is allowed).

Tested-by: Richard Hughes <richard@hughsie.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
---
This should be reverted in the 6.15 release

 fs/efivarfs/file.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

 		inode_set_mtime_to_ts(inode,
inode_set_ctime_current(inode));
@@ -124,7 +125,8 @@ static int efivarfs_file_release(struct inode
*inode, struct file *file)
 	struct efivar_entry *var = inode->i_private;
 
 	inode_lock(inode);
-	var->removed = (--var->open_count == 0 && i_size_read(inode)
== 0);
+	/* FIXME: temporary work around for fwupdate */
+	var->removed = (--var->open_count == 0 && i_size_read(inode)
== 1);
 	inode_unlock(inode);
 
 	if (var->removed)
diff mbox series

Patch

diff --git a/fs/efivarfs/file.c b/fs/efivarfs/file.c
index cb1b6d0c3454..c294a8fc566d 100644
--- a/fs/efivarfs/file.c
+++ b/fs/efivarfs/file.c
@@ -57,10 +57,11 @@  static ssize_t efivarfs_file_write(struct file
*file,
 
 	if (bytes == -ENOENT) {
 		/*
-		 * zero size signals to release that the write deleted
-		 * the variable
+		 * FIXME: temporary workaround for fwupdate, signal
+		 * failed write with a 1 to keep created but not
+		 * written files
 		 */
-		i_size_write(inode, 0);
+		i_size_write(inode, 1);
 	} else {
 		i_size_write(inode, datasize + sizeof(attributes));