efivarfs: Never return ENOENT from firmware again
Previously in1fa7e69
efi_status_to_err() translated firmware status EFI_NOT_FOUND to -EIO instead of -ENOENT for efivarfs operations to avoid confusion. After refactoring ine14ab23
, it is also used in other places where the translation may be unnecessary. So move the translation to efivarfs specific code. Also return EOF for reading zero-length files, which is what users would expect. Cc: Josh Boyer <jwboyer@redhat.com> Cc: Jeremy Kerr <jk@ozlabs.org> Cc: Lee, Chun-Yi <jlee@suse.com> Cc: Andy Whitcroft <apw@canonical.com> Signed-off-by: Lingzhu Xiang <lxiang@redhat.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
This commit is contained in:
Родитель
f722406faa
Коммит
3fab70c165
|
@ -44,8 +44,11 @@ static ssize_t efivarfs_file_write(struct file *file,
|
|||
|
||||
bytes = efivar_entry_set_get_size(var, attributes, &datasize,
|
||||
data, &set);
|
||||
if (!set && bytes)
|
||||
if (!set && bytes) {
|
||||
if (bytes == -ENOENT)
|
||||
bytes = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (bytes == -ENOENT) {
|
||||
drop_nlink(inode);
|
||||
|
@ -76,7 +79,14 @@ static ssize_t efivarfs_file_read(struct file *file, char __user *userbuf,
|
|||
int err;
|
||||
|
||||
err = efivar_entry_size(var, &datasize);
|
||||
if (err)
|
||||
|
||||
/*
|
||||
* efivarfs represents uncommitted variables with
|
||||
* zero-length files. Reading them should return EOF.
|
||||
*/
|
||||
if (err == -ENOENT)
|
||||
return 0;
|
||||
else if (err)
|
||||
return err;
|
||||
|
||||
data = kmalloc(datasize + sizeof(attributes), GFP_KERNEL);
|
||||
|
|
Загрузка…
Ссылка в новой задаче