]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioFsDxe/SimpleFsWrite.c
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / VirtioFsDxe / SimpleFsWrite.c
CommitLineData
334c13e1
LE
1/** @file\r
2 EFI_FILE_PROTOCOL.Write() member function for the Virtio Filesystem driver.\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
11EFI_STATUS\r
12EFIAPI\r
13VirtioFsSimpleFileWrite (\r
ac0a286f
MK
14 IN EFI_FILE_PROTOCOL *This,\r
15 IN OUT UINTN *BufferSize,\r
16 IN VOID *Buffer\r
334c13e1
LE
17 )\r
18{\r
ac0a286f
MK
19 VIRTIO_FS_FILE *VirtioFsFile;\r
20 VIRTIO_FS *VirtioFs;\r
21 EFI_STATUS Status;\r
22 UINTN Transferred;\r
23 UINTN Left;\r
44f43f94
LE
24\r
25 VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);\r
26 VirtioFs = VirtioFsFile->OwnerFs;\r
27\r
28 if (VirtioFsFile->IsDirectory) {\r
29 return EFI_UNSUPPORTED;\r
30 }\r
ac0a286f 31\r
44f43f94
LE
32 if (!VirtioFsFile->IsOpenForWriting) {\r
33 return EFI_ACCESS_DENIED;\r
34 }\r
35\r
36 Status = EFI_SUCCESS;\r
37 Transferred = 0;\r
38 Left = *BufferSize;\r
39 while (Left > 0) {\r
ac0a286f 40 UINT32 WriteSize;\r
44f43f94
LE
41\r
42 //\r
43 // Honor the write buffer size limit.\r
44 //\r
45 WriteSize = (UINT32)MIN ((UINTN)VirtioFs->MaxWrite, Left);\r
ac0a286f
MK
46 Status = VirtioFsFuseWrite (\r
47 VirtioFs,\r
48 VirtioFsFile->NodeId,\r
49 VirtioFsFile->FuseHandle,\r
50 VirtioFsFile->FilePosition + Transferred,\r
51 &WriteSize,\r
52 (UINT8 *)Buffer + Transferred\r
53 );\r
54 if (!EFI_ERROR (Status) && (WriteSize == 0)) {\r
44f43f94
LE
55 //\r
56 // Progress should have been made.\r
57 //\r
58 Status = EFI_DEVICE_ERROR;\r
59 }\r
ac0a286f 60\r
44f43f94
LE
61 if (EFI_ERROR (Status)) {\r
62 break;\r
63 }\r
ac0a286f 64\r
44f43f94
LE
65 Transferred += WriteSize;\r
66 Left -= WriteSize;\r
67 }\r
68\r
ac0a286f 69 *BufferSize = Transferred;\r
44f43f94
LE
70 VirtioFsFile->FilePosition += Transferred;\r
71 //\r
72 // According to the UEFI spec,\r
73 //\r
74 // - 'Partial writes only occur when there has been a data error during the\r
75 // write attempt (such as "file space full")', and\r
76 //\r
77 // - (as an example) EFI_VOLUME_FULL is returned when 'The volume is full'.\r
78 //\r
79 // These together imply that after a partial write, we have to return an\r
80 // error. In other words, (Transferred > 0) is inconsequential for the return\r
81 // value.\r
82 //\r
83 return Status;\r
334c13e1 84}\r