]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioFsDxe/FuseOpen.c
OvmfPkg: Apply uncrustify changes
[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
ac0a286f
MK
41 IN OUT VIRTIO_FS *VirtioFs,\r
42 IN UINT64 NodeId,\r
43 IN BOOLEAN ReadWrite,\r
44 OUT UINT64 *FuseHandle\r
da82d2e3
LE
45 )\r
46{\r
ac0a286f
MK
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
da82d2e3
LE
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
ac0a286f
MK
85 Status = VirtioFsFuseNewRequest (\r
86 VirtioFs,\r
87 &CommonReq,\r
88 ReqSgList.TotalSize,\r
89 VirtioFsFuseOpOpen,\r
90 NodeId\r
91 );\r
da82d2e3
LE
92 if (EFI_ERROR (Status)) {\r
93 return Status;\r
94 }\r
95\r
96 //\r
97 // Populate the FUSE_OPEN-specific fields.\r
98 //\r
ac0a286f
MK
99 OpenReq.Flags = (ReadWrite ?\r
100 VIRTIO_FS_FUSE_OPEN_REQ_F_RDWR :\r
101 VIRTIO_FS_FUSE_OPEN_REQ_F_RDONLY);\r
da82d2e3
LE
102 OpenReq.Unused = 0;\r
103\r
104 //\r
105 // Submit the request.\r
106 //\r
107 Status = VirtioFsSgListsSubmit (VirtioFs, &ReqSgList, &RespSgList);\r
108 if (EFI_ERROR (Status)) {\r
109 return Status;\r
110 }\r
111\r
112 //\r
113 // Verify the response (all response buffers are fixed size).\r
114 //\r
115 Status = VirtioFsFuseCheckResponse (&RespSgList, CommonReq.Unique, NULL);\r
116 if (EFI_ERROR (Status)) {\r
117 if (Status == EFI_DEVICE_ERROR) {\r
ac0a286f
MK
118 DEBUG ((\r
119 DEBUG_ERROR,\r
120 "%a: Label=\"%s\" NodeId=%Lu ReadWrite=%d "\r
121 "Errno=%d\n",\r
122 __FUNCTION__,\r
123 VirtioFs->Label,\r
124 NodeId,\r
125 ReadWrite,\r
126 CommonResp.Error\r
127 ));\r
da82d2e3
LE
128 Status = VirtioFsErrnoToEfiStatus (CommonResp.Error);\r
129 }\r
ac0a286f 130\r
da82d2e3
LE
131 return Status;\r
132 }\r
133\r
134 //\r
135 // Output the open handle.\r
136 //\r
137 *FuseHandle = OpenResp.FileHandle;\r
138 return EFI_SUCCESS;\r
139}\r