2 EFI_FILE_PROTOCOL.SetPosition() member function for the Virtio Filesystem
5 Copyright (C) 2020, Red Hat, Inc.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <Library/MemoryAllocationLib.h> // FreePool()
12 #include "VirtioFsDxe.h"
16 VirtioFsSimpleFileSetPosition (
17 IN EFI_FILE_PROTOCOL
*This
,
21 VIRTIO_FS_FILE
*VirtioFsFile
;
24 VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr
;
26 VirtioFsFile
= VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This
);
29 // Directories can only be rewound, per spec.
31 if (VirtioFsFile
->IsDirectory
) {
33 return EFI_UNSUPPORTED
;
36 VirtioFsFile
->FilePosition
= 0;
37 if (VirtioFsFile
->FileInfoArray
!= NULL
) {
38 FreePool (VirtioFsFile
->FileInfoArray
);
39 VirtioFsFile
->FileInfoArray
= NULL
;
42 VirtioFsFile
->SingleFileInfoSize
= 0;
43 VirtioFsFile
->NumFileInfo
= 0;
44 VirtioFsFile
->NextFileInfo
= 0;
51 if (Position
< MAX_UINT64
) {
53 // Caller is requesting absolute file position.
55 VirtioFsFile
->FilePosition
= Position
;
60 // Caller is requesting a seek to EOF.
62 VirtioFs
= VirtioFsFile
->OwnerFs
;
63 Status
= VirtioFsFuseGetAttr (VirtioFs
, VirtioFsFile
->NodeId
, &FuseAttr
);
64 if (EFI_ERROR (Status
)) {
68 VirtioFsFile
->FilePosition
= FuseAttr
.Size
;