2 FUSE_FSYNC / FUSE_FSYNCDIR wrapper for the Virtio Filesystem device.
4 Copyright (C) 2020, Red Hat, Inc.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "VirtioFsDxe.h"
12 Synchronize the in-core state of a regular file or a directory with the
13 storage device on the host, by sending the FUSE_FSYNC or FUSE_FSYNCDIR
14 request to the Virtio Filesystem device.
16 The function may only be called after VirtioFsFuseInitSession() returns
17 successfully and before VirtioFsUninit() is called.
19 @param[in,out] VirtioFs The Virtio Filesystem device to send the FUSE_FSYNC
20 / FUSE_FSYNCDIR request to. On output, the FUSE
21 request counter "VirtioFs->RequestId" will have been
24 @param[in] NodeId The inode number of the file or directory to sync.
26 @param[in] FuseHandle The open handle to the file or directory to sync.
28 @param[in] IsDir TRUE if NodeId and FuseHandle refer to a directory,
29 FALSE if NodeId and FuseHandle refer to a regular
32 @retval EFI_SUCCESS The file or directory has been synchronized.
34 @return The "errno" value mapped to an EFI_STATUS code, if the
35 Virtio Filesystem device explicitly reported an error.
37 @return Error codes propagated from VirtioFsSgListsValidate(),
38 VirtioFsFuseNewRequest(), VirtioFsSgListsSubmit(),
39 VirtioFsFuseCheckResponse().
42 VirtioFsFuseFsyncFileOrDir (
43 IN OUT VIRTIO_FS
*VirtioFs
,
49 VIRTIO_FS_FUSE_REQUEST CommonReq
;
50 VIRTIO_FS_FUSE_FSYNC_REQUEST FsyncReq
;
51 VIRTIO_FS_IO_VECTOR ReqIoVec
[2];
52 VIRTIO_FS_SCATTER_GATHER_LIST ReqSgList
;
53 VIRTIO_FS_FUSE_RESPONSE CommonResp
;
54 VIRTIO_FS_IO_VECTOR RespIoVec
[1];
55 VIRTIO_FS_SCATTER_GATHER_LIST RespSgList
;
59 // Set up the scatter-gather lists.
61 ReqIoVec
[0].Buffer
= &CommonReq
;
62 ReqIoVec
[0].Size
= sizeof CommonReq
;
63 ReqIoVec
[1].Buffer
= &FsyncReq
;
64 ReqIoVec
[1].Size
= sizeof FsyncReq
;
65 ReqSgList
.IoVec
= ReqIoVec
;
66 ReqSgList
.NumVec
= ARRAY_SIZE (ReqIoVec
);
68 RespIoVec
[0].Buffer
= &CommonResp
;
69 RespIoVec
[0].Size
= sizeof CommonResp
;
70 RespSgList
.IoVec
= RespIoVec
;
71 RespSgList
.NumVec
= ARRAY_SIZE (RespIoVec
);
74 // Validate the scatter-gather lists; calculate the total transfer sizes.
76 Status
= VirtioFsSgListsValidate (VirtioFs
, &ReqSgList
, &RespSgList
);
77 if (EFI_ERROR (Status
)) {
82 // Populate the common request header.
84 Status
= VirtioFsFuseNewRequest (
88 IsDir
? VirtioFsFuseOpFsyncDir
: VirtioFsFuseOpFsync
,
91 if (EFI_ERROR (Status
)) {
96 // Populate the FUSE_FSYNC- / FUSE_FSYNCDIR-specific fields.
98 FsyncReq
.FileHandle
= FuseHandle
;
99 FsyncReq
.FsyncFlags
= 0;
100 FsyncReq
.Padding
= 0;
103 // Submit the request.
105 Status
= VirtioFsSgListsSubmit (VirtioFs
, &ReqSgList
, &RespSgList
);
106 if (EFI_ERROR (Status
)) {
111 // Verify the response (all response buffers are fixed size).
113 Status
= VirtioFsFuseCheckResponse (&RespSgList
, CommonReq
.Unique
, NULL
);
114 if (Status
== EFI_DEVICE_ERROR
) {
117 "%a: Label=\"%s\" NodeId=%Lu FuseHandle=%Lu "
118 "IsDir=%d Errno=%d\n",
126 Status
= VirtioFsErrnoToEfiStatus (CommonResp
.Error
);