From: "Laszlo Ersek" <lersek@redhat.com>
To: devel@edk2.groups.io, virtio-fs@redhat.com, lersek@redhat.com
Cc: "Ard Biesheuvel" <ard.biesheuvel@arm.com>,
"Jordan Justen" <jordan.l.justen@intel.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: [edk2 PATCH 07/48] OvmfPkg/VirtioFsDxe: map "errno" values to EFI_STATUS
Date: Wed, 16 Dec 2020 22:10:44 +0100 [thread overview]
Message-ID: <20201216211125.19496-8-lersek@redhat.com> (raw)
In-Reply-To: <20201216211125.19496-1-lersek@redhat.com>
The VirtioFsFuseCheckResponse() function dedicates the EFI_DEVICE_ERROR
status code to the case when the Virtio Filesystem device explicitly
returns an error via the "VIRTIO_FS_FUSE_RESPONSE.Error" field.
Said field effectively carries a Linux "errno" value. Introduce a helper
function for mapping "errno" values to (hopefully) reasonable EFI_STATUS
codes. This way we'll be able to propagate "errno" values as EFI_STATUS
return codes along the UEFI call stack -- in some detail anyway.
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
OvmfPkg/VirtioFsDxe/VirtioFsDxe.h | 5 +
OvmfPkg/VirtioFsDxe/Helpers.c | 200 ++++++++++++++++++++
2 files changed, 205 insertions(+)
diff --git a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h
index f7eae9a4b71a..772ab743cc8e 100644
--- a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h
+++ b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h
@@ -144,16 +144,21 @@ VirtioFsFuseNewRequest (
EFI_STATUS
VirtioFsFuseCheckResponse (
IN VIRTIO_FS_SCATTER_GATHER_LIST *ResponseSgList,
IN UINT64 RequestId,
OUT UINTN *TailBufferFill
);
+EFI_STATUS
+VirtioFsErrnoToEfiStatus (
+ IN INT32 Errno
+ );
+
//
// EFI_SIMPLE_FILE_SYSTEM_PROTOCOL member functions for the Virtio Filesystem
// driver.
//
EFI_STATUS
EFIAPI
VirtioFsOpenVolume (
diff --git a/OvmfPkg/VirtioFsDxe/Helpers.c b/OvmfPkg/VirtioFsDxe/Helpers.c
index 5bd2dc641f6d..334fa6c7dd26 100644
--- a/OvmfPkg/VirtioFsDxe/Helpers.c
+++ b/OvmfPkg/VirtioFsDxe/Helpers.c
@@ -909,8 +909,208 @@ VirtioFsFuseCheckResponse (
// If the last buffer is considered variable size, report its filled size.
//
if (TailBufferFill != NULL) {
*TailBufferFill = ResponseSgList->IoVec[NumFixedSizeVec].Transferred;
}
return EFI_SUCCESS;
}
+
+/**
+ An ad-hoc function for mapping FUSE (well, Linux) "errno" values to
+ EFI_STATUS.
+
+ @param[in] Errno The "VIRTIO_FS_FUSE_RESPONSE.Error" value, returned by the
+ Virtio Filesystem device. The value is expected to be
+ negative.
+
+ @return An EFI_STATUS error code that's deemed a passable
+ mapping for the Errno value.
+
+ @retval EFI_DEVICE_ERROR Fallback EFI_STATUS code for unrecognized Errno
+ values.
+**/
+EFI_STATUS
+VirtioFsErrnoToEfiStatus (
+ IN INT32 Errno
+ )
+{
+ switch (Errno) {
+ case -1: // EPERM Operation not permitted
+ return EFI_SECURITY_VIOLATION;
+
+ case -2: // ENOENT No such file or directory
+ case -3: // ESRCH No such process
+ case -6: // ENXIO No such device or address
+ case -10: // ECHILD No child processes
+ case -19: // ENODEV No such device
+ case -49: // EUNATCH Protocol driver not attached
+ case -65: // ENOPKG Package not installed
+ case -79: // ELIBACC Can not access a needed shared library
+ case -126: // ENOKEY Required key not available
+ return EFI_NOT_FOUND;
+
+ case -4: // EINTR Interrupted system call
+ case -11: // EAGAIN, EWOULDBLOCK Resource temporarily unavailable
+ case -16: // EBUSY Device or resource busy
+ case -26: // ETXTBSY Text file busy
+ case -35: // EDEADLK, EDEADLOCK Resource deadlock avoided
+ case -39: // ENOTEMPTY Directory not empty
+ case -42: // ENOMSG No message of desired type
+ case -61: // ENODATA No data available
+ case -85: // ERESTART Interrupted system call should be restarted
+ return EFI_NOT_READY;
+
+ case -5: // EIO Input/output error
+ case -45: // EL2NSYNC Level 2 not synchronized
+ case -46: // EL3HLT Level 3 halted
+ case -47: // EL3RST Level 3 reset
+ case -51: // EL2HLT Level 2 halted
+ case -121: // EREMOTEIO Remote I/O error
+ case -133: // EHWPOISON Memory page has hardware error
+ return EFI_DEVICE_ERROR;
+
+ case -7: // E2BIG Argument list too long
+ case -36: // ENAMETOOLONG File name too long
+ case -90: // EMSGSIZE Message too long
+ return EFI_BAD_BUFFER_SIZE;
+
+ case -8: // ENOEXEC Exec format error
+ case -15: // ENOTBLK Block device required
+ case -18: // EXDEV Invalid cross-device link
+ case -20: // ENOTDIR Not a directory
+ case -21: // EISDIR Is a directory
+ case -25: // ENOTTY Inappropriate ioctl for device
+ case -27: // EFBIG File too large
+ case -29: // ESPIPE Illegal seek
+ case -38: // ENOSYS Function not implemented
+ case -59: // EBFONT Bad font file format
+ case -60: // ENOSTR Device not a stream
+ case -83: // ELIBEXEC Cannot exec a shared library directly
+ case -88: // ENOTSOCK Socket operation on non-socket
+ case -91: // EPROTOTYPE Protocol wrong type for socket
+ case -92: // ENOPROTOOPT Protocol not available
+ case -93: // EPROTONOSUPPORT Protocol not supported
+ case -94: // ESOCKTNOSUPPORT Socket type not supported
+ case -95: // ENOTSUP, EOPNOTSUPP Operation not supported
+ case -96: // EPFNOSUPPORT Protocol family not supported
+ case -97: // EAFNOSUPPORT Address family not supported by protocol
+ case -99: // EADDRNOTAVAIL Cannot assign requested address
+ case -118: // ENOTNAM Not a XENIX named type file
+ case -120: // EISNAM Is a named type file
+ case -124: // EMEDIUMTYPE Wrong medium type
+ return EFI_UNSUPPORTED;
+
+ case -9: // EBADF Bad file descriptor
+ case -14: // EFAULT Bad address
+ case -44: // ECHRNG Channel number out of range
+ case -48: // ELNRNG Link number out of range
+ case -53: // EBADR Invalid request descriptor
+ case -56: // EBADRQC Invalid request code
+ case -57: // EBADSLT Invalid slot
+ case -76: // ENOTUNIQ Name not unique on network
+ case -84: // EILSEQ Invalid or incomplete multibyte or wide character
+ return EFI_NO_MAPPING;
+
+ case -12: // ENOMEM Cannot allocate memory
+ case -23: // ENFILE Too many open files in system
+ case -24: // EMFILE Too many open files
+ case -31: // EMLINK Too many links
+ case -37: // ENOLCK No locks available
+ case -40: // ELOOP Too many levels of symbolic links
+ case -50: // ENOCSI No CSI structure available
+ case -55: // ENOANO No anode
+ case -63: // ENOSR Out of streams resources
+ case -82: // ELIBMAX Attempting to link in too many shared libraries
+ case -87: // EUSERS Too many users
+ case -105: // ENOBUFS No buffer space available
+ case -109: // ETOOMANYREFS Too many references: cannot splice
+ case -119: // ENAVAIL No XENIX semaphores available
+ case -122: // EDQUOT Disk quota exceeded
+ return EFI_OUT_OF_RESOURCES;
+
+ case -13: // EACCES Permission denied
+ return EFI_ACCESS_DENIED;
+
+ case -17: // EEXIST File exists
+ case -98: // EADDRINUSE Address already in use
+ case -106: // EISCONN Transport endpoint is already connected
+ case -114: // EALREADY Operation already in progress
+ case -115: // EINPROGRESS Operation now in progress
+ return EFI_ALREADY_STARTED;
+
+ case -22: // EINVAL Invalid argument
+ case -33: // EDOM Numerical argument out of domain
+ return EFI_INVALID_PARAMETER;
+
+ case -28: // ENOSPC No space left on device
+ case -54: // EXFULL Exchange full
+ return EFI_VOLUME_FULL;
+
+ case -30: // EROFS Read-only file system
+ return EFI_WRITE_PROTECTED;
+
+ case -32: // EPIPE Broken pipe
+ case -43: // EIDRM Identifier removed
+ case -67: // ENOLINK Link has been severed
+ case -68: // EADV Advertise error
+ case -69: // ESRMNT Srmount error
+ case -70: // ECOMM Communication error on send
+ case -73: // EDOTDOT RFS specific error
+ case -78: // EREMCHG Remote address changed
+ case -86: // ESTRPIPE Streams pipe error
+ case -102: // ENETRESET Network dropped connection on reset
+ case -103: // ECONNABORTED Software caused connection abort
+ case -104: // ECONNRESET Connection reset by peer
+ case -116: // ESTALE Stale file handle
+ case -125: // ECANCELED Operation canceled
+ case -128: // EKEYREVOKED Key has been revoked
+ case -129: // EKEYREJECTED Key was rejected by service
+ case -130: // EOWNERDEAD Owner died
+ case -131: // ENOTRECOVERABLE State not recoverable
+ return EFI_ABORTED;
+
+ case -34: // ERANGE Numerical result out of range
+ case -75: // EOVERFLOW Value too large for defined data type
+ return EFI_BUFFER_TOO_SMALL;
+
+ case -52: // EBADE Invalid exchange
+ case -108: // ESHUTDOWN Cannot send after transport endpoint shutdown
+ case -111: // ECONNREFUSED Connection refused
+ return EFI_END_OF_FILE;
+
+ case -62: // ETIME Timer expired
+ case -110: // ETIMEDOUT Connection timed out
+ case -127: // EKEYEXPIRED Key has expired
+ return EFI_TIMEOUT;
+
+ case -64: // ENONET Machine is not on the network
+ case -66: // EREMOTE Object is remote
+ case -72: // EMULTIHOP Multihop attempted
+ case -100: // ENETDOWN Network is down
+ case -101: // ENETUNREACH Network is unreachable
+ case -112: // EHOSTDOWN Host is down
+ case -113: // EHOSTUNREACH No route to host
+ case -123: // ENOMEDIUM No medium found
+ case -132: // ERFKILL Operation not possible due to RF-kill
+ return EFI_NO_MEDIA;
+
+ case -71: // EPROTO Protocol error
+ return EFI_PROTOCOL_ERROR;
+
+ case -74: // EBADMSG Bad message
+ case -77: // EBADFD File descriptor in bad state
+ case -80: // ELIBBAD Accessing a corrupted shared library
+ case -81: // ELIBSCN .lib section in a.out corrupted
+ case -117: // EUCLEAN Structure needs cleaning
+ return EFI_VOLUME_CORRUPTED;
+
+ case -89: // EDESTADDRREQ Destination address required
+ case -107: // ENOTCONN Transport endpoint is not connected
+ return EFI_NOT_STARTED;
+
+ default:
+ break;
+ }
+
+ return EFI_DEVICE_ERROR;
+}
--
2.19.1.3.g30247aa5d201
next prev parent reply other threads:[~2020-12-16 21:26 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-16 21:10 [edk2 PATCH 00/48] ArmVirtPkg, OvmfPkg: virtio filesystem driver Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 01/48] OvmfPkg: introduce VirtioFsDxe Laszlo Ersek
2020-12-18 17:42 ` Ard Biesheuvel
2020-12-18 18:13 ` [Virtio-fs] " Dr. David Alan Gilbert
2020-12-19 21:16 ` Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 02/48] ArmVirtPkg: include VirtioFsDxe in the ArmVirtQemu* platforms Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 03/48] OvmfPkg/VirtioFsDxe: DriverBinding: open VirtioDevice, install SimpleFs Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 04/48] OvmfPkg/VirtioFsDxe: implement virtio device (un)initialization Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 05/48] OvmfPkg/VirtioFsDxe: add a scatter-gather list data type Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 06/48] OvmfPkg/VirtioFsDxe: introduce the basic FUSE request/response headers Laszlo Ersek
2020-12-17 11:49 ` [Virtio-fs] " Dr. David Alan Gilbert
2020-12-17 13:57 ` Laszlo Ersek
2020-12-17 14:06 ` Dr. David Alan Gilbert
2020-12-17 14:32 ` Laszlo Ersek
2020-12-16 21:10 ` Laszlo Ersek [this message]
2020-12-16 21:10 ` [edk2 PATCH 08/48] OvmfPkg/VirtioFsDxe: submit the FUSE_INIT request to the device Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 09/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_OPENDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 10/48] OvmfPkg/VirtioFsDxe: add shared wrapper for FUSE_RELEASE / FUSE_RELEASEDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 11/48] OvmfPkg/VirtioFsDxe: implement EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume() Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 12/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_FORGET Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 13/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_FSYNC / FUSE_FSYNCDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 14/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_FLUSH Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 15/48] OvmfPkg/VirtioFsDxe: flush, sync, release and forget in Close() / Delete() Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 16/48] OvmfPkg/VirtioFsDxe: add helper for appending and sanitizing paths Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 17/48] OvmfPkg/VirtioFsDxe: manage path lifecycle in OpenVolume, Close, Delete Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 18/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_OPEN Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 19/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_MKDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 20/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_CREATE Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 21/48] OvmfPkg/VirtioFsDxe: convert FUSE inode attributes to EFI_FILE_INFO Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 22/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_LOOKUP Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 23/48] OvmfPkg/VirtioFsDxe: split canon. path into last parent + last component Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 24/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_UNLINK / FUSE_RMDIR Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 25/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_GETATTR Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 26/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Open() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 27/48] OvmfPkg/VirtioFsDxe: erase the dir. entry in EFI_FILE_PROTOCOL.Delete() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 28/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_STATFS Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 29/48] OvmfPkg/VirtioFsDxe: add helper for formatting UEFI basenames Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 30/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetInfo() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 31/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetPosition, .SetPosition Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 32/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_READ / FUSE_READDIRPLUS Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 33/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Read() for regular files Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 34/48] OvmfPkg/VirtioFsDxe: convert FUSE dirent filename to EFI_FILE_INFO Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 35/48] OvmfPkg/VirtioFsDxe: add EFI_FILE_INFO cache fields to VIRTIO_FS_FILE Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 36/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Read() for directories Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 37/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Flush() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 38/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_WRITE Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 39/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Write() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 40/48] OvmfPkg/VirtioFsDxe: handle the volume label in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 41/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_RENAME2 Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 42/48] OvmfPkg/VirtioFsDxe: add helper for composing rename/move destination path Laszlo Ersek
2020-12-18 17:39 ` Ard Biesheuvel
2020-12-19 22:40 ` Laszlo Ersek
2020-12-19 22:54 ` Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 43/48] OvmfPkg/VirtioFsDxe: handle file rename/move in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 44/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_SETATTR Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 45/48] OvmfPkg/VirtioFsDxe: add helper for determining file size update Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 46/48] OvmfPkg/VirtioFsDxe: add helper for determining access time updates Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 47/48] OvmfPkg/VirtioFsDxe: add helper for determining file mode bits update Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 48/48] OvmfPkg/VirtioFsDxe: handle attribute updates in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-18 17:44 ` [edk2 PATCH 00/48] ArmVirtPkg, OvmfPkg: virtio filesystem driver Ard Biesheuvel
2020-12-20 0:09 ` Laszlo Ersek
2020-12-20 10:15 ` Ard Biesheuvel
2020-12-21 1:46 ` Laszlo Ersek
2020-12-21 10:10 ` Ard Biesheuvel
2020-12-21 18:02 ` [edk2-devel] " Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201216211125.19496-8-lersek@redhat.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox