]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Include/IndustryStandard/VirtioFs.h
OvmfPkg/VirtioFsDxe: handle file rename/move in EFI_FILE_PROTOCOL.SetInfo
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / VirtioFs.h
index 63aced229e9bc99d8198546ef23f50b650d809a7..0b2ed701004672acd543ce28bdd786fc8055253a 100644 (file)
@@ -81,9 +81,17 @@ typedef struct {
 //\r
 #define VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID 1\r
 \r
+//\r
+// Distinguished errno values.\r
+//\r
+#define VIRTIO_FS_FUSE_ERRNO_ENOENT (-2)\r
+\r
 //\r
 // File mode bitmasks.\r
 //\r
+#define VIRTIO_FS_FUSE_MODE_TYPE_MASK 0170000u\r
+#define VIRTIO_FS_FUSE_MODE_TYPE_REG  0100000u\r
+#define VIRTIO_FS_FUSE_MODE_TYPE_DIR  0040000u\r
 #define VIRTIO_FS_FUSE_MODE_PERM_RWXU 0000700u\r
 #define VIRTIO_FS_FUSE_MODE_PERM_RUSR 0000400u\r
 #define VIRTIO_FS_FUSE_MODE_PERM_WUSR 0000200u\r
@@ -100,13 +108,58 @@ typedef struct {
 #define VIRTIO_FS_FUSE_OPEN_REQ_F_RDONLY 0\r
 #define VIRTIO_FS_FUSE_OPEN_REQ_F_RDWR   2\r
 \r
+//\r
+// Flags for VirtioFsFuseOpInit.\r
+//\r
+#define VIRTIO_FS_FUSE_INIT_REQ_F_DO_READDIRPLUS BIT13\r
+\r
+/**\r
+  Macro for calculating the size of a directory stream entry.\r
+\r
+  The macro may evaluate Namelen multiple times.\r
+\r
+  The macro evaluates to a UINTN value that is safe to cast to UINT32.\r
+\r
+  @param[in] Namelen  The size of the filename byte array that follows\r
+                      VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE in the directory\r
+                      stream, as reported by\r
+                      VIRTIO_FS_FUSE_STATFS_RESPONSE.Namelen or\r
+                      VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE.Namelen. The filename\r
+                      byte array is not NUL-terminated.\r
+\r
+  @retval 0  Namelen was zero or greater than SIZE_4KB.\r
+\r
+  @return    The number of bytes in the directory entry, including the\r
+             VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE header.\r
+**/\r
+#define VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE_SIZE(Namelen)             \\r
+  ((Namelen) == 0 || (Namelen) > SIZE_4KB ?                          \\r
+   (UINTN)0 :                                                        \\r
+   ALIGN_VALUE (                                                     \\r
+     sizeof (VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE) + (UINTN)(Namelen), \\r
+     sizeof (UINT64)                                                 \\r
+     )                                                               \\r
+   )\r
+\r
+//\r
+// Flags for VirtioFsFuseOpRename2.\r
+//\r
+#define VIRTIO_FS_FUSE_RENAME2_REQ_F_NOREPLACE BIT0\r
+\r
 //\r
 // FUSE operation codes.\r
 //\r
 typedef enum {\r
+  VirtioFsFuseOpLookup      =  1,\r
   VirtioFsFuseOpForget      =  2,\r
+  VirtioFsFuseOpGetAttr     =  3,\r
   VirtioFsFuseOpMkDir       =  9,\r
+  VirtioFsFuseOpUnlink      = 10,\r
+  VirtioFsFuseOpRmDir       = 11,\r
   VirtioFsFuseOpOpen        = 14,\r
+  VirtioFsFuseOpRead        = 15,\r
+  VirtioFsFuseOpWrite       = 16,\r
+  VirtioFsFuseOpStatFs      = 17,\r
   VirtioFsFuseOpRelease     = 18,\r
   VirtioFsFuseOpFsync       = 20,\r
   VirtioFsFuseOpFlush       = 25,\r
@@ -115,6 +168,8 @@ typedef enum {
   VirtioFsFuseOpReleaseDir  = 29,\r
   VirtioFsFuseOpFsyncDir    = 30,\r
   VirtioFsFuseOpCreate      = 35,\r
+  VirtioFsFuseOpReadDirPlus = 44,\r
+  VirtioFsFuseOpRename2     = 45,\r
 } VIRTIO_FS_FUSE_OPCODE;\r
 \r
 #pragma pack (1)\r
@@ -184,6 +239,21 @@ typedef struct {
   UINT64 NumberOfLookups;\r
 } VIRTIO_FS_FUSE_FORGET_REQUEST;\r
 \r
+//\r
+// Headers for VirtioFsFuseOpGetAttr.\r
+//\r
+typedef struct {\r
+  UINT32 GetAttrFlags;\r
+  UINT32 Dummy;\r
+  UINT64 FileHandle;\r
+} VIRTIO_FS_FUSE_GETATTR_REQUEST;\r
+\r
+typedef struct {\r
+  UINT64 AttrValid;\r
+  UINT32 AttrValidNsec;\r
+  UINT32 Dummy;\r
+} VIRTIO_FS_FUSE_GETATTR_RESPONSE;\r
+\r
 //\r
 // Header for VirtioFsFuseOpMkDir.\r
 //\r
@@ -206,6 +276,53 @@ typedef struct {
   UINT32 Padding;\r
 } VIRTIO_FS_FUSE_OPEN_RESPONSE;\r
 \r
+//\r
+// Header for VirtioFsFuseOpRead and VirtioFsFuseOpReadDirPlus.\r
+//\r
+typedef struct {\r
+  UINT64 FileHandle;\r
+  UINT64 Offset;\r
+  UINT32 Size;\r
+  UINT32 ReadFlags;\r
+  UINT64 LockOwner;\r
+  UINT32 Flags;\r
+  UINT32 Padding;\r
+} VIRTIO_FS_FUSE_READ_REQUEST;\r
+\r
+//\r
+// Headers for VirtioFsFuseOpWrite.\r
+//\r
+typedef struct {\r
+  UINT64 FileHandle;\r
+  UINT64 Offset;\r
+  UINT32 Size;\r
+  UINT32 WriteFlags;\r
+  UINT64 LockOwner;\r
+  UINT32 Flags;\r
+  UINT32 Padding;\r
+} VIRTIO_FS_FUSE_WRITE_REQUEST;\r
+\r
+typedef struct {\r
+  UINT32 Size;\r
+  UINT32 Padding;\r
+} VIRTIO_FS_FUSE_WRITE_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpStatFs.\r
+//\r
+typedef struct {\r
+  UINT64 Blocks;\r
+  UINT64 Bfree;\r
+  UINT64 Bavail;\r
+  UINT64 Files;\r
+  UINT64 Ffree;\r
+  UINT32 Bsize;\r
+  UINT32 Namelen;\r
+  UINT32 Frsize;\r
+  UINT32 Padding;\r
+  UINT32 Spare[6];\r
+} VIRTIO_FS_FUSE_STATFS_RESPONSE;\r
+\r
 //\r
 // Header for VirtioFsFuseOpRelease and VirtioFsFuseOpReleaseDir.\r
 //\r
@@ -268,6 +385,34 @@ typedef struct {
   UINT32 Umask;\r
   UINT32 Padding;\r
 } VIRTIO_FS_FUSE_CREATE_REQUEST;\r
+\r
+//\r
+// Header for VirtioFsFuseOpReadDirPlus.\r
+//\r
+// Diverging from the rest of the headers, this structure embeds other\r
+// structures. The reason is that a scatter list cannot be used to receive\r
+// NodeResp and AttrResp separately; the record below is followed by a variable\r
+// size filename byte array, and then such pairs are repeated a number of\r
+// times. Thus, later header start offsets depend on earlier filename array\r
+// sizes.\r
+//\r
+typedef struct {\r
+  VIRTIO_FS_FUSE_NODE_RESPONSE       NodeResp;\r
+  VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE AttrResp;\r
+  UINT64                             NodeId;\r
+  UINT64                             CookieForNextEntry;\r
+  UINT32                             Namelen;\r
+  UINT32                             Type;\r
+} VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpRename2.\r
+//\r
+typedef struct {\r
+  UINT64 NewDir;\r
+  UINT32 Flags;\r
+  UINT32 Padding;\r
+} VIRTIO_FS_FUSE_RENAME2_REQUEST;\r
 #pragma pack ()\r
 \r
 #endif // VIRTIO_FS_H_\r