/** @file
  FUSE_READ / FUSE_READDIRPLUS wrapper for the Virtio Filesystem device.

  Copyright (C) 2020, Red Hat, Inc.

  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include "VirtioFsDxe.h"

/**
  Read a chunk from a regular file or a directory stream, by sending the
  FUSE_READ / FUSE_READDIRPLUS request to the Virtio Filesystem device.

  The function may only be called after VirtioFsFuseInitSession() returns
  successfully and before VirtioFsUninit() is called.

  @param[in,out] VirtioFs  The Virtio Filesystem device to send the FUSE_READ
                           or FUSE_READDIRPLUS request to. On output, the FUSE
                           request counter "VirtioFs->RequestId" will have been
                           incremented.

  @param[in] NodeId        The inode number of the regular file or directory
                           stream to read from.

  @param[in] FuseHandle    The open handle to the regular file or directory
                           stream to read from.

  @param[in] IsDir         TRUE if NodeId and FuseHandle refer to a directory,
                           FALSE if NodeId and FuseHandle refer to a regular
                           file.

  @param[in] Offset        If IsDir is FALSE: the absolute file position at
                           which to start reading.

                           If IsDir is TRUE: the directory stream cookie at
                           which to start or continue reading. The zero-valued
                           cookie identifies the start of the directory stream.
                           Further positions in the directory stream can be
                           passed in from the CookieForNextEntry field of
                           VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE.

  @param[in,out] Size      On input, the number of bytes to read. On successful
                           return, the number of bytes actually read, which may
                           be smaller than the value on input.

                           When reading a regular file (i.e., when IsDir is
                           FALSE), EOF can be detected by passing in a nonzero
                           Size, and finding a zero Size on output.

                           When reading a directory stream (i.e., when IsDir is
                           TRUE), Data consists of a sequence of variably-sized
                           records (directory entries). A read operation
                           returns the maximal sequence of records that fits in
                           Size, without having to truncate a record. In order
                           to guarantee progress, call

                             VirtioFsFuseStatFs (VirtioFs, NodeId,
                               &FilesysAttr)

                           first, to learn the maximum Namelen for the
                           directory stream. Then assign Size at least

                             VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE_SIZE (
                               FilesysAttr.Namelen)

                           on input. (Remember that
                           VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE_SIZE() may return
                           0 if its Namelen argument is invalid.) EOF can be
                           detected if Size is set on input like described
                           above, and Size is zero on output.

  @param[out] Data         Buffer to read the bytes from the regular file or
                           the directory stream into. The caller is responsible
                           for providing room for (at least) as many bytes in
                           Data as Size is on input.

  @retval EFI_SUCCESS  Read successful. The caller is responsible for checking
                       Size to learn the actual byte count transferred.

  @return              The "errno" value mapped to an EFI_STATUS code, if the
                       Virtio Filesystem device explicitly reported an error.

  @return              Error codes propagated from VirtioFsSgListsValidate(),
                       VirtioFsFuseNewRequest(), VirtioFsSgListsSubmit(),
                       VirtioFsFuseCheckResponse().
**/
EFI_STATUS
VirtioFsFuseReadFileOrDir (
  IN OUT VIRTIO_FS  *VirtioFs,
  IN     UINT64     NodeId,
  IN     UINT64     FuseHandle,
  IN     BOOLEAN    IsDir,
  IN     UINT64     Offset,
  IN OUT UINT32     *Size,
  OUT VOID          *Data
  )
{
  VIRTIO_FS_FUSE_REQUEST         CommonReq;
  VIRTIO_FS_FUSE_READ_REQUEST    ReadReq;
  VIRTIO_FS_IO_VECTOR            ReqIoVec[2];
  VIRTIO_FS_SCATTER_GATHER_LIST  ReqSgList;
  VIRTIO_FS_FUSE_RESPONSE        CommonResp;
  VIRTIO_FS_IO_VECTOR            RespIoVec[2];
  VIRTIO_FS_SCATTER_GATHER_LIST  RespSgList;
  EFI_STATUS                     Status;
  UINTN                          TailBufferFill;

  //
  // Set up the scatter-gather lists.
  //
  ReqIoVec[0].Buffer = &CommonReq;
  ReqIoVec[0].Size   = sizeof CommonReq;
  ReqIoVec[1].Buffer = &ReadReq;
  ReqIoVec[1].Size   = sizeof ReadReq;
  ReqSgList.IoVec    = ReqIoVec;
  ReqSgList.NumVec   = ARRAY_SIZE (ReqIoVec);

  RespIoVec[0].Buffer = &CommonResp;
  RespIoVec[0].Size   = sizeof CommonResp;
  RespIoVec[1].Buffer = Data;
  RespIoVec[1].Size   = *Size;
  RespSgList.IoVec    = RespIoVec;
  RespSgList.NumVec   = ARRAY_SIZE (RespIoVec);

  //
  // Validate the scatter-gather lists; calculate the total transfer sizes.
  //
  Status = VirtioFsSgListsValidate (VirtioFs, &ReqSgList, &RespSgList);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  //
  // Populate the common request header.
  //
  Status = VirtioFsFuseNewRequest (
             VirtioFs,
             &CommonReq,
             ReqSgList.TotalSize,
             IsDir ? VirtioFsFuseOpReadDirPlus : VirtioFsFuseOpRead,
             NodeId
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  //
  // Populate the FUSE_READ- / FUSE_READDIRPLUS-specific fields.
  //
  ReadReq.FileHandle = FuseHandle;
  ReadReq.Offset     = Offset;
  ReadReq.Size       = *Size;
  ReadReq.ReadFlags  = 0;
  ReadReq.LockOwner  = 0;
  ReadReq.Flags      = 0;
  ReadReq.Padding    = 0;

  //
  // Submit the request.
  //
  Status = VirtioFsSgListsSubmit (VirtioFs, &ReqSgList, &RespSgList);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  //
  // Verify the response. Note that TailBufferFill is variable.
  //
  Status = VirtioFsFuseCheckResponse (
             &RespSgList,
             CommonReq.Unique,
             &TailBufferFill
             );
  if (EFI_ERROR (Status)) {
    if (Status == EFI_DEVICE_ERROR) {
      DEBUG ((
        DEBUG_ERROR,
        "%a: Label=\"%s\" NodeId=%Lu FuseHandle=%Lu "
        "IsDir=%d Offset=0x%Lx Size=0x%x Data@%p Errno=%d\n",
        __func__,
        VirtioFs->Label,
        NodeId,
        FuseHandle,
        IsDir,
        Offset,
        *Size,
        Data,
        CommonResp.Error
        ));
      Status = VirtioFsErrnoToEfiStatus (CommonResp.Error);
    }

    return Status;
  }

  //
  // Report the actual transfer size.
  //
  // Integer overflow in the (UINT32) cast below is not possible; the
  // VIRTIO_FS_SCATTER_GATHER_LIST functions would have caught that.
  //
  *Size = (UINT32)TailBufferFill;
  return EFI_SUCCESS;
}
