On Wed, 26 Feb 2025 at 22:48, James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> wrote: > > 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@xxxxxxxxxxx> > Signed-off-by: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> > --- > This should be reverted in the 6.15 release > Thanks James. Mind resending this with a MUA that doesn't mangle patches? > fs/efivarfs/file.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > 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)); > 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) > -- > 2.43.0 > >