Re: [PATCH] efivarfs: allow creation of zero length files

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>
>




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux