//\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
#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
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
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
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
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