/** @file
  EFI_FILE_PROTOCOL.Delete() member function for the Virtio Filesystem driver.

  Copyright (C) 2020, Red Hat, Inc.

  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include <Library/BaseLib.h>             // RemoveEntryList()
#include <Library/MemoryAllocationLib.h> // FreePool()

#include "VirtioFsDxe.h"

EFI_STATUS
EFIAPI
VirtioFsSimpleFileDelete (
  IN EFI_FILE_PROTOCOL  *This
  )
{
  VIRTIO_FS_FILE  *VirtioFsFile;
  VIRTIO_FS       *VirtioFs;
  EFI_STATUS      Status;

  VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);
  VirtioFs     = VirtioFsFile->OwnerFs;

  //
  // All actions in this function are "best effort"; the UEFI spec requires
  // EFI_FILE_PROTOCOL.Delete() to release resources unconditionally. If a step
  // related to removing the file fails, it's only reflected in the return
  // status (EFI_WARN_DELETE_FAILURE rather than EFI_SUCCESS).
  //
  // Release, remove, and (if needed) forget. We don't waste time flushing and
  // syncing; if the EFI_FILE_PROTOCOL user cares enough, they should keep the
  // parent directory open until after this function call returns, and then
  // force a sync on *that* EFI_FILE_PROTOCOL instance, using either the
  // Flush() member function, or the Close() member function.
  //
  // If any action fails below, we still try the others.
  //
  VirtioFsFuseReleaseFileOrDir (
    VirtioFs,
    VirtioFsFile->NodeId,
    VirtioFsFile->FuseHandle,
    VirtioFsFile->IsDirectory
    );

  //
  // VirtioFsFile->FuseHandle is gone at this point, but VirtioFsFile->NodeId
  // is still valid. Continue with removing the file or directory. The result
  // of this operation determines the return status of the function.
  //
  if (VirtioFsFile->IsOpenForWriting) {
    UINT64  ParentNodeId;
    CHAR8   *LastComponent;

    //
    // Split our canonical pathname into most specific parent directory
    // (identified by NodeId), and single-component filename within that
    // directory. If This stands for the root directory "/", then the following
    // function call will gracefully fail.
    //
    Status = VirtioFsLookupMostSpecificParentDir (
               VirtioFs,
               VirtioFsFile->CanonicalPathname,
               &ParentNodeId,
               &LastComponent
               );
    if (!EFI_ERROR (Status)) {
      //
      // Attempt the actual removal. Regardless of the outcome, ParentNodeId
      // must be forgotten right after (unless it stands for the root
      // directory).
      //
      Status = VirtioFsFuseRemoveFileOrDir (
                 VirtioFs,
                 ParentNodeId,
                 LastComponent,
                 VirtioFsFile->IsDirectory
                 );
      if (ParentNodeId != VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID) {
        VirtioFsFuseForget (VirtioFs, ParentNodeId);
      }
    }

    if (EFI_ERROR (Status)) {
      //
      // Map any failure to the spec-mandated warning code.
      //
      Status = EFI_WARN_DELETE_FAILURE;
    }
  } else {
    Status = EFI_WARN_DELETE_FAILURE;
  }

  //
  // Finally, if we've known VirtioFsFile->NodeId from a lookup, then we should
  // also ask the server to forget it *once*.
  //
  if (VirtioFsFile->NodeId != VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID) {
    VirtioFsFuseForget (VirtioFs, VirtioFsFile->NodeId);
  }

  //
  // One fewer file left open for the owner filesystem.
  //
  RemoveEntryList (&VirtioFsFile->OpenFilesEntry);

  FreePool (VirtioFsFile->CanonicalPathname);
  if (VirtioFsFile->FileInfoArray != NULL) {
    FreePool (VirtioFsFile->FileInfoArray);
  }

  FreePool (VirtioFsFile);
  return Status;
}
