From c4edb49b4f074f8d22a9c5e8f337dc29658de01c Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 16 Dec 2020 22:11:08 +0100 Subject: OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetPosition, .SetPosition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using the functions introduced previously, we can now implement VirtioFsSimpleFileGetPosition() and VirtioFsSimpleFileSetPosition(). Cc: Ard Biesheuvel Cc: Jordan Justen Cc: Philippe Mathieu-Daudé Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097 Signed-off-by: Laszlo Ersek Message-Id: <20201216211125.19496-32-lersek@redhat.com> Acked-by: Ard Biesheuvel --- OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c | 40 ++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c') diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c b/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c index ee8cb1f4e4..ac62853026 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c @@ -16,5 +16,43 @@ VirtioFsSimpleFileSetPosition ( IN UINT64 Position ) { - return EFI_DEVICE_ERROR; + VIRTIO_FS_FILE *VirtioFsFile; + VIRTIO_FS *VirtioFs; + EFI_STATUS Status; + VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr; + + VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); + + // + // Directories can only be rewound, per spec. + // + if (VirtioFsFile->IsDirectory) { + if (Position != 0) { + return EFI_UNSUPPORTED; + } + VirtioFsFile->FilePosition = 0; + return EFI_SUCCESS; + } + + // + // Regular file. + // + if (Position < MAX_UINT64) { + // + // Caller is requesting absolute file position. + // + VirtioFsFile->FilePosition = Position; + return EFI_SUCCESS; + } + + // + // Caller is requesting a seek to EOF. + // + VirtioFs = VirtioFsFile->OwnerFs; + Status = VirtioFsFuseGetAttr (VirtioFs, VirtioFsFile->NodeId, &FuseAttr); + if (EFI_ERROR (Status)) { + return Status; + } + VirtioFsFile->FilePosition = FuseAttr.Size; + return EFI_SUCCESS; } -- cgit v1.2.3