]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioFsDxe/FuseOpen.c
OvmfPkg/MemEncryptSevLib: Make the MemEncryptSevLib available for SEC
[mirror_edk2.git] / OvmfPkg / VirtioFsDxe / FuseOpen.c
CommitLineData
da82d2e3
LE
1/** @file\r
2 FUSE_OPEN wrapper for the Virtio Filesystem device.\r
3\r
4 Copyright (C) 2020, Red Hat, Inc.\r
5\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7**/\r
8\r
9#include "VirtioFsDxe.h"\r
10\r
11/**\r
12 Send a FUSE_OPEN request to the Virtio Filesystem device, for opening a\r
13 regular file.\r
14\r
15 The function may only be called after VirtioFsFuseInitSession() returns\r
16 successfully and before VirtioFsUninit() is called.\r
17\r
18 @param[in,out] VirtioFs The Virtio Filesystem device to send the FUSE_OPEN\r
19 request to. On output, the FUSE request counter\r
20 "VirtioFs->RequestId" will have been incremented.\r
21\r
22 @param[in] NodeId The inode number of the regular file to open.\r
23\r
24 @param[in] ReadWrite If TRUE, open the regular file in read-write mode.\r
25 If FALSE, open the regular file in read-only mode.\r
26\r
27 @param[out] FuseHandle The open handle to the regular file, returned by the\r
28 Virtio Filesystem device.\r
29\r
30 @retval EFI_SUCCESS The regular file has been opened.\r
31\r
32 @return The "errno" value mapped to an EFI_STATUS code, if the\r
33 Virtio Filesystem device explicitly reported an error.\r
34\r
35 @return Error codes propagated from VirtioFsSgListsValidate(),\r
36 VirtioFsFuseNewRequest(), VirtioFsSgListsSubmit(),\r
37 VirtioFsFuseCheckResponse().\r
38**/\r
39EFI_STATUS\r
40VirtioFsFuseOpen (\r
41 IN OUT VIRTIO_FS *VirtioFs,\r
42 IN UINT64 NodeId,\r
43 IN BOOLEAN ReadWrite,\r
44 OUT UINT64 *FuseHandle\r
45 )\r
46{\r
47 VIRTIO_FS_FUSE_REQUEST CommonReq;\r
48 VIRTIO_FS_FUSE_OPEN_REQUEST OpenReq;\r
49 VIRTIO_FS_IO_VECTOR ReqIoVec[2];\r
50 VIRTIO_FS_SCATTER_GATHER_LIST ReqSgList;\r
51 VIRTIO_FS_FUSE_RESPONSE CommonResp;\r
52 VIRTIO_FS_FUSE_OPEN_RESPONSE OpenResp;\r
53 VIRTIO_FS_IO_VECTOR RespIoVec[2];\r
54 VIRTIO_FS_SCATTER_GATHER_LIST RespSgList;\r
55 EFI_STATUS Status;\r
56\r
57 //\r
58 // Set up the scatter-gather lists.\r
59 //\r
60 ReqIoVec[0].Buffer = &CommonReq;\r
61 ReqIoVec[0].Size = sizeof CommonReq;\r
62 ReqIoVec[1].Buffer = &OpenReq;\r
63 ReqIoVec[1].Size = sizeof OpenReq;\r
64 ReqSgList.IoVec = ReqIoVec;\r
65 ReqSgList.NumVec = ARRAY_SIZE (ReqIoVec);\r
66\r
67 RespIoVec[0].Buffer = &CommonResp;\r
68 RespIoVec[0].Size = sizeof CommonResp;\r
69 RespIoVec[1].Buffer = &OpenResp;\r
70 RespIoVec[1].Size = sizeof OpenResp;\r
71 RespSgList.IoVec = RespIoVec;\r
72 RespSgList.NumVec = ARRAY_SIZE (RespIoVec);\r
73\r
74 //\r
75 // Validate the scatter-gather lists; calculate the total transfer sizes.\r
76 //\r
77 Status = VirtioFsSgListsValidate (VirtioFs, &ReqSgList, &RespSgList);\r
78 if (EFI_ERROR (Status)) {\r
79 return Status;\r
80 }\r
81\r
82 //\r
83 // Populate the common request header.\r
84 //\r
85 Status = VirtioFsFuseNewRequest (VirtioFs, &CommonReq, ReqSgList.TotalSize,\r
86 VirtioFsFuseOpOpen, NodeId);\r
87 if (EFI_ERROR (Status)) {\r
88 return Status;\r
89 }\r
90\r
91 //\r
92 // Populate the FUSE_OPEN-specific fields.\r
93 //\r
94 OpenReq.Flags = (ReadWrite ?\r
95 VIRTIO_FS_FUSE_OPEN_REQ_F_RDWR :\r
96 VIRTIO_FS_FUSE_OPEN_REQ_F_RDONLY);\r
97 OpenReq.Unused = 0;\r
98\r
99 //\r
100 // Submit the request.\r
101 //\r
102 Status = VirtioFsSgListsSubmit (VirtioFs, &ReqSgList, &RespSgList);\r
103 if (EFI_ERROR (Status)) {\r
104 return Status;\r
105 }\r
106\r
107 //\r
108 // Verify the response (all response buffers are fixed size).\r
109 //\r
110 Status = VirtioFsFuseCheckResponse (&RespSgList, CommonReq.Unique, NULL);\r
111 if (EFI_ERROR (Status)) {\r
112 if (Status == EFI_DEVICE_ERROR) {\r
113 DEBUG ((DEBUG_ERROR, "%a: Label=\"%s\" NodeId=%Lu ReadWrite=%d "\r
114 "Errno=%d\n", __FUNCTION__, VirtioFs->Label, NodeId, ReadWrite,\r
115 CommonResp.Error));\r
116 Status = VirtioFsErrnoToEfiStatus (CommonResp.Error);\r
117 }\r
118 return Status;\r
119 }\r
120\r
121 //\r
122 // Output the open handle.\r
123 //\r
124 *FuseHandle = OpenResp.FileHandle;\r
125 return EFI_SUCCESS;\r
126}\r