All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: devel@edk2.groups.io, virtio-fs@redhat.com, lersek@redhat.com
Cc: "Jordan Justen" <jordan.l.justen@intel.com>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Ard Biesheuvel" <ard.biesheuvel@arm.com>
Subject: [Virtio-fs] [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




  parent reply	other threads:[~2020-12-16 21:10 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-16 21:10 [Virtio-fs] [edk2 PATCH 00/48] ArmVirtPkg, OvmfPkg: virtio filesystem driver Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 01/48] OvmfPkg: introduce VirtioFsDxe Laszlo Ersek
2020-12-18 17:42   ` Ard Biesheuvel
2020-12-18 18:13     ` Dr. David Alan Gilbert
2020-12-19 21:16       ` Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 02/48] ArmVirtPkg: include VirtioFsDxe in the ArmVirtQemu* platforms Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 03/48] OvmfPkg/VirtioFsDxe: DriverBinding: open VirtioDevice, install SimpleFs Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 04/48] OvmfPkg/VirtioFsDxe: implement virtio device (un)initialization Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 05/48] OvmfPkg/VirtioFsDxe: add a scatter-gather list data type Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 06/48] OvmfPkg/VirtioFsDxe: introduce the basic FUSE request/response headers Laszlo Ersek
2020-12-17 11:49   ` 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 ` [Virtio-fs] [edk2 PATCH 08/48] OvmfPkg/VirtioFsDxe: submit the FUSE_INIT request to the device Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 09/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_OPENDIR Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 10/48] OvmfPkg/VirtioFsDxe: add shared wrapper for FUSE_RELEASE / FUSE_RELEASEDIR Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 11/48] OvmfPkg/VirtioFsDxe: implement EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume() Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 12/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_FORGET Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 13/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_FSYNC / FUSE_FSYNCDIR Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 14/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_FLUSH Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 15/48] OvmfPkg/VirtioFsDxe: flush, sync, release and forget in Close() / Delete() Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 16/48] OvmfPkg/VirtioFsDxe: add helper for appending and sanitizing paths Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 17/48] OvmfPkg/VirtioFsDxe: manage path lifecycle in OpenVolume, Close, Delete Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 18/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_OPEN Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 19/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_MKDIR Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 20/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_CREATE Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 21/48] OvmfPkg/VirtioFsDxe: convert FUSE inode attributes to EFI_FILE_INFO Laszlo Ersek
2020-12-16 21:10 ` [Virtio-fs] [edk2 PATCH 22/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_LOOKUP Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 23/48] OvmfPkg/VirtioFsDxe: split canon. path into last parent + last component Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 24/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_UNLINK / FUSE_RMDIR Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 25/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_GETATTR Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 26/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Open() Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 27/48] OvmfPkg/VirtioFsDxe: erase the dir. entry in EFI_FILE_PROTOCOL.Delete() Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 28/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_STATFS Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 29/48] OvmfPkg/VirtioFsDxe: add helper for formatting UEFI basenames Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 30/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetInfo() Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 31/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetPosition, .SetPosition Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 32/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_READ / FUSE_READDIRPLUS Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 33/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Read() for regular files Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 34/48] OvmfPkg/VirtioFsDxe: convert FUSE dirent filename to EFI_FILE_INFO Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 35/48] OvmfPkg/VirtioFsDxe: add EFI_FILE_INFO cache fields to VIRTIO_FS_FILE Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 36/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Read() for directories Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 37/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Flush() Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 38/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_WRITE Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 39/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Write() Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 40/48] OvmfPkg/VirtioFsDxe: handle the volume label in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 41/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_RENAME2 Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [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 ` [Virtio-fs] [edk2 PATCH 43/48] OvmfPkg/VirtioFsDxe: handle file rename/move in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 44/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_SETATTR Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 45/48] OvmfPkg/VirtioFsDxe: add helper for determining file size update Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 46/48] OvmfPkg/VirtioFsDxe: add helper for determining access time updates Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 47/48] OvmfPkg/VirtioFsDxe: add helper for determining file mode bits update Laszlo Ersek
2020-12-16 21:11 ` [Virtio-fs] [edk2 PATCH 48/48] OvmfPkg/VirtioFsDxe: handle attribute updates in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-18 17:44 ` [Virtio-fs] [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           ` [Virtio-fs] [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-all 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=lersek@redhat.com \
    --cc=ard.biesheuvel@arm.com \
    --cc=devel@edk2.groups.io \
    --cc=jordan.l.justen@intel.com \
    --cc=philmd@redhat.com \
    --cc=virtio-fs@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.