1
- // Copyright (C) 2021 Alibaba Cloud. All rights reserved.
1
+ // Copyright (C) 2021-2022 Alibaba Cloud. All rights reserved.
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
4
use std:: ffi:: CStr ;
5
5
use std:: future:: Future ;
6
6
use std:: io;
7
7
use std:: ops:: Deref ;
8
- use std:: os:: unix:: io:: RawFd ;
9
8
use std:: pin:: Pin ;
10
9
use std:: sync:: Arc ;
11
10
use std:: time:: Duration ;
12
11
13
12
use async_trait:: async_trait;
14
13
15
14
use super :: { Context , Entry , FileSystem , ZeroCopyReader , ZeroCopyWriter } ;
16
- use crate :: abi:: fuse_abi:: { stat64, OpenOptions , SetattrValid } ;
17
- use crate :: api:: CreateIn ;
18
- use crate :: async_util:: { AsyncDrive , AsyncDriver } ;
15
+ use crate :: abi:: fuse_abi:: { stat64, CreateIn , OpenOptions , SetattrValid } ;
16
+ use crate :: transport:: AsyncFileReadWriteVolatile ;
19
17
20
18
/// A trait for directly copying data from the fuse transport into a `File` without first storing it
21
19
/// in an intermediate buffer in asynchronous mode.
22
- #[ async_trait]
23
- pub trait AsyncZeroCopyReader < D : AsyncDrive = AsyncDriver > : ZeroCopyReader {
20
+ #[ async_trait( ? Send ) ]
21
+ pub trait AsyncZeroCopyReader : ZeroCopyReader {
24
22
/// Copies at most `count` bytes from `self` directly into `f` at offset `off` without storing
25
23
/// it in any intermediate buffers. If the return value is `Ok(n)` then it must be guaranteed
26
24
/// that `0 <= n <= count`. If `n` is `0`, then it can indicate one of 3 possibilities:
@@ -36,17 +34,16 @@ pub trait AsyncZeroCopyReader<D: AsyncDrive = AsyncDriver>: ZeroCopyReader {
36
34
/// an error of the kind `io::ErrorKind::WriteZero`.
37
35
async fn async_read_to (
38
36
& mut self ,
39
- drive : D ,
40
- f : RawFd ,
37
+ f : Arc < dyn AsyncFileReadWriteVolatile > ,
41
38
count : usize ,
42
39
off : u64 ,
43
40
) -> io:: Result < usize > ;
44
41
}
45
42
46
43
/// A trait for directly copying data from a `RawFd` into the fuse transport without first storing
47
44
/// it in an intermediate buffer in asynchronous mode.
48
- #[ async_trait]
49
- pub trait AsyncZeroCopyWriter < D : AsyncDrive = AsyncDriver > : ZeroCopyWriter {
45
+ #[ async_trait( ? Send ) ]
46
+ pub trait AsyncZeroCopyWriter : ZeroCopyWriter {
50
47
/// Copies at most `count` bytes from `f` at offset `off` directly into `self` without storing
51
48
/// it in any intermediate buffers. If the return value is `Ok(n)` then it must be guaranteed
52
49
/// that `0 <= n <= count`. If `n` is `0`, then it can indicate one of 3 possibilities:
@@ -62,8 +59,7 @@ pub trait AsyncZeroCopyWriter<D: AsyncDrive = AsyncDriver>: ZeroCopyWriter {
62
59
/// error of the kind `io::ErrorKind::UnexpectedEof`.
63
60
async fn async_write_from (
64
61
& mut self ,
65
- drive : D ,
66
- f : RawFd ,
62
+ f : Arc < dyn AsyncFileReadWriteVolatile > ,
67
63
count : usize ,
68
64
off : u64 ,
69
65
) -> io:: Result < usize > ;
@@ -72,7 +68,7 @@ pub trait AsyncZeroCopyWriter<D: AsyncDrive = AsyncDriver>: ZeroCopyWriter {
72
68
/// The main trait that connects a file system with a transport with asynchronous IO.
73
69
#[ allow( unused_variables) ]
74
70
#[ async_trait]
75
- pub trait AsyncFileSystem < D : AsyncDrive = AsyncDriver > : FileSystem {
71
+ pub trait AsyncFileSystem : FileSystem {
76
72
/// Look up a directory entry by name and get its attributes.
77
73
///
78
74
/// If this call is successful then the lookup count of the `Inode` associated with the returned
@@ -362,7 +358,7 @@ pub trait AsyncFileSystem<D: AsyncDrive = AsyncDriver>: FileSystem {
362
358
ctx : & Context ,
363
359
inode : Self :: Inode ,
364
360
handle : Self :: Handle ,
365
- w : & mut ( dyn AsyncZeroCopyWriter < D > + Send ) ,
361
+ w : & mut ( dyn AsyncZeroCopyWriter + Send ) ,
366
362
size : u32 ,
367
363
offset : u64 ,
368
364
lock_owner : Option < u64 > ,
@@ -394,7 +390,7 @@ pub trait AsyncFileSystem<D: AsyncDrive = AsyncDriver>: FileSystem {
394
390
ctx : & Context ,
395
391
inode : Self :: Inode ,
396
392
handle : Self :: Handle ,
397
- r : & mut ( dyn AsyncZeroCopyReader < D > + Send ) ,
393
+ r : & mut ( dyn AsyncZeroCopyReader + Send ) ,
398
394
size : u32 ,
399
395
offset : u64 ,
400
396
lock_owner : Option < u64 > ,
@@ -845,7 +841,7 @@ type OpenFuture<'async_trait, H> =
845
841
type CreateFuture < ' async_trait , H > =
846
842
Box < dyn Future < Output = io:: Result < ( Entry , Option < H > , OpenOptions ) > > + Send + ' async_trait > ;
847
843
848
- impl < FS : AsyncFileSystem < D > , D : AsyncDrive > AsyncFileSystem < D > for Arc < FS > {
844
+ impl < FS : AsyncFileSystem > AsyncFileSystem for Arc < FS > {
849
845
fn async_lookup < ' a , ' b , ' c , ' async_trait > (
850
846
& ' a self ,
851
847
ctx : & ' b Context ,
@@ -927,7 +923,7 @@ impl<FS: AsyncFileSystem<D>, D: AsyncDrive> AsyncFileSystem<D> for Arc<FS> {
927
923
ctx : & ' b Context ,
928
924
inode : Self :: Inode ,
929
925
handle : Self :: Handle ,
930
- w : & ' c mut ( dyn AsyncZeroCopyWriter < D > + Send ) ,
926
+ w : & ' c mut ( dyn AsyncZeroCopyWriter + Send ) ,
931
927
size : u32 ,
932
928
offset : u64 ,
933
929
lock_owner : Option < u64 > ,
@@ -948,7 +944,7 @@ impl<FS: AsyncFileSystem<D>, D: AsyncDrive> AsyncFileSystem<D> for Arc<FS> {
948
944
ctx : & ' b Context ,
949
945
inode : Self :: Inode ,
950
946
handle : Self :: Handle ,
951
- r : & ' c mut ( dyn AsyncZeroCopyReader < D > + Send ) ,
947
+ r : & ' c mut ( dyn AsyncZeroCopyReader + Send ) ,
952
948
size : u32 ,
953
949
offset : u64 ,
954
950
lock_owner : Option < u64 > ,
0 commit comments