Skip to content

Commit 2bd05da

Browse files
committed
Merge branch 'gvfs-pr2' into gvfs-pr3
2 parents 37a46d6 + df48db4 commit 2bd05da

8 files changed

+69
-74
lines changed

clients/filesystem-fuse/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ libc = "0.2.168"
4242
log = "0.4.22"
4343
tokio = { version = "1.38.0", features = ["full"] }
4444
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
45+
once_cell = "1.20.2"

clients/filesystem-fuse/src/default_raw_filesystem.rs

+59-64
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* under the License.
1818
*/
1919
use crate::filesystem::{
20-
FileStat, PathFileSystem, RawFileSystem, INITIAL_FILE_ID, ROOT_DIR_FILE_ID,
20+
FileStat, PathFileSystem, RawFileSystem, Result, INITIAL_FILE_ID, ROOT_DIR_FILE_ID,
2121
ROOT_DIR_PARENT_FILE_ID, ROOT_DIR_PATH,
2222
};
2323
use crate::opened_file::{FileHandle, OpenFileFlags};
@@ -61,7 +61,7 @@ impl<T: PathFileSystem> DefaultRawFileSystem<T> {
6161
.fetch_add(1, std::sync::atomic::Ordering::SeqCst)
6262
}
6363

64-
async fn get_file_entry(&self, file_id: u64) -> crate::filesystem::Result<FileEntry> {
64+
async fn get_file_entry(&self, file_id: u64) -> Result<FileEntry> {
6565
self.file_entry_manager
6666
.read()
6767
.await
@@ -97,7 +97,7 @@ impl<T: PathFileSystem> DefaultRawFileSystem<T> {
9797
file_id: u64,
9898
flags: u32,
9999
kind: FileType,
100-
) -> crate::filesystem::Result<FileHandle> {
100+
) -> Result<FileHandle> {
101101
let file_entry = self.get_file_entry(file_id).await?;
102102

103103
let mut opened_file = {
@@ -121,28 +121,37 @@ impl<T: PathFileSystem> DefaultRawFileSystem<T> {
121121
let file = file.lock().await;
122122
Ok(file.file_handle())
123123
}
124+
125+
async fn remove_file_entry_locked(&self, path: &Path) {
126+
let mut file_manager = self.file_entry_manager.write().await;
127+
file_manager.remove(path);
128+
}
129+
130+
async fn insert_file_entry_locked(&self, parent_file_id: u64, file_id: u64, path: &Path) {
131+
let mut file_manager = self.file_entry_manager.write().await;
132+
file_manager.insert(parent_file_id, file_id, path);
133+
}
124134
}
125135

126136
#[async_trait]
127137
impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
128-
async fn init(&self) -> crate::filesystem::Result<()> {
138+
async fn init(&self) -> Result<()> {
129139
// init root directory
130-
self.file_entry_manager.write().await.insert(
140+
self.insert_file_entry_locked(
131141
ROOT_DIR_PARENT_FILE_ID,
132142
ROOT_DIR_FILE_ID,
133143
Path::new(ROOT_DIR_PATH),
134-
);
144+
)
145+
.await;
135146
self.fs.init().await
136147
}
137148

138-
async fn get_file_path(&self, file_id: u64) -> String {
139-
let file_entry = self.get_file_entry(file_id).await;
140-
file_entry
141-
.map(|x| x.path.to_string_lossy().to_string())
142-
.unwrap_or_else(|_| "".to_string())
149+
async fn get_file_path(&self, file_id: u64) -> Result<String> {
150+
let file_entry = self.get_file_entry(file_id).await?;
151+
Ok(file_entry.path.to_string_lossy().to_string())
143152
}
144153

145-
async fn valid_file_handle_id(&self, file_id: u64, fh: u64) -> crate::filesystem::Result<()> {
154+
async fn valid_file_handle_id(&self, file_id: u64, fh: u64) -> Result<()> {
146155
let fh_file_id = self
147156
.opened_file_manager
148157
.get(fh)
@@ -157,7 +166,7 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
157166
.ok_or(Errno::from(libc::EBADF))
158167
}
159168

160-
async fn stat(&self, file_id: u64) -> crate::filesystem::Result<FileStat> {
169+
async fn stat(&self, file_id: u64) -> Result<FileStat> {
161170
let file_entry = self.get_file_entry(file_id).await?;
162171
let mut file_stat = self.fs.stat(&file_entry.path).await?;
163172
file_stat.set_file_id(file_entry.parent_file_id, file_entry.file_id);
@@ -181,21 +190,22 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
181190
Ok(file_stat)
182191
}
183192

184-
async fn read_dir(&self, file_id: u64) -> crate::filesystem::Result<Vec<FileStat>> {
193+
async fn read_dir(&self, file_id: u64) -> Result<Vec<FileStat>> {
185194
let file_entry = self.get_file_entry(file_id).await?;
186195
let mut child_filestats = self.fs.read_dir(&file_entry.path).await?;
187-
for file in child_filestats.iter_mut() {
188-
self.resolve_file_id_to_filestat(file, file_id).await;
196+
for file_stat in child_filestats.iter_mut() {
197+
self.resolve_file_id_to_filestat(file_stat, file_stat.file_id)
198+
.await;
189199
}
190200
Ok(child_filestats)
191201
}
192202

193-
async fn open_file(&self, file_id: u64, flags: u32) -> crate::filesystem::Result<FileHandle> {
203+
async fn open_file(&self, file_id: u64, flags: u32) -> Result<FileHandle> {
194204
self.open_file_internal(file_id, flags, FileType::RegularFile)
195205
.await
196206
}
197207

198-
async fn open_dir(&self, file_id: u64, flags: u32) -> crate::filesystem::Result<FileHandle> {
208+
async fn open_dir(&self, file_id: u64, flags: u32) -> Result<FileHandle> {
199209
self.open_file_internal(file_id, flags, FileType::Directory)
200210
.await
201211
}
@@ -205,84 +215,70 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
205215
parent_file_id: u64,
206216
name: &OsStr,
207217
flags: u32,
208-
) -> crate::filesystem::Result<FileHandle> {
218+
) -> Result<FileHandle> {
209219
let parent_file_entry = self.get_file_entry(parent_file_id).await?;
210-
let path = parent_file_entry.path.join(name);
211-
let mut opened_file = self.fs.create_file(&path, OpenFileFlags(flags)).await?;
220+
let mut file_without_id = self
221+
.fs
222+
.create_file(&parent_file_entry.path.join(name), OpenFileFlags(flags))
223+
.await?;
212224

213-
opened_file.set_file_id(parent_file_id, self.next_file_id());
225+
file_without_id.set_file_id(parent_file_id, self.next_file_id());
214226

215227
// insert the new file to file entry manager
216-
{
217-
let mut file_manager = self.file_entry_manager.write().await;
218-
file_manager.insert(
219-
parent_file_id,
220-
opened_file.file_stat.file_id,
221-
&opened_file.file_stat.path,
222-
);
223-
}
224-
225-
// put the file to the opened file manager
226-
let opened_file = self.opened_file_manager.put(opened_file);
227-
let opened_file = opened_file.lock().await;
228-
Ok(opened_file.file_handle())
228+
self.insert_file_entry_locked(
229+
parent_file_id,
230+
file_without_id.file_stat.file_id,
231+
&file_without_id.file_stat.path,
232+
)
233+
.await;
234+
235+
// put the openfile to the opened file manager and allocate a file handle id
236+
let file_with_id = self.opened_file_manager.put(file_without_id);
237+
let opened_file_with_file_handle_id = file_with_id.lock().await;
238+
Ok(opened_file_with_file_handle_id.file_handle())
229239
}
230240

231-
async fn create_dir(
232-
&self,
233-
parent_file_id: u64,
234-
name: &OsStr,
235-
) -> crate::filesystem::Result<u64> {
241+
async fn create_dir(&self, parent_file_id: u64, name: &OsStr) -> Result<u64> {
236242
let parent_file_entry = self.get_file_entry(parent_file_id).await?;
237243
let path = parent_file_entry.path.join(name);
238244
let mut filestat = self.fs.create_dir(&path).await?;
239245

240246
filestat.set_file_id(parent_file_id, self.next_file_id());
241247

242248
// insert the new file to file entry manager
243-
{
244-
let mut file_manager = self.file_entry_manager.write().await;
245-
file_manager.insert(filestat.parent_file_id, filestat.file_id, &filestat.path);
246-
}
249+
self.insert_file_entry_locked(parent_file_id, filestat.file_id, &filestat.path)
250+
.await;
247251
Ok(filestat.file_id)
248252
}
249253

250-
async fn set_attr(&self, file_id: u64, file_stat: &FileStat) -> crate::filesystem::Result<()> {
254+
async fn set_attr(&self, file_id: u64, file_stat: &FileStat) -> Result<()> {
251255
let file_entry = self.get_file_entry(file_id).await?;
252256
self.fs.set_attr(&file_entry.path, file_stat, true).await
253257
}
254258

255-
async fn remove_file(
256-
&self,
257-
parent_file_id: u64,
258-
name: &OsStr,
259-
) -> crate::filesystem::Result<()> {
259+
async fn remove_file(&self, parent_file_id: u64, name: &OsStr) -> Result<()> {
260260
let parent_file_entry = self.get_file_entry(parent_file_id).await?;
261261
let path = parent_file_entry.path.join(name);
262262
self.fs.remove_file(&path).await?;
263263

264264
// remove the file from file entry manager
265-
{
266-
let mut file_manager = self.file_entry_manager.write().await;
267-
file_manager.remove(&path);
268-
}
265+
self.remove_file_entry_locked(&parent_file_entry.path.join(name))
266+
.await;
269267
Ok(())
270268
}
271269

272-
async fn remove_dir(&self, parent_file_id: u64, name: &OsStr) -> crate::filesystem::Result<()> {
270+
async fn remove_dir(&self, parent_file_id: u64, name: &OsStr) -> Result<()> {
273271
let parent_file_entry = self.get_file_entry(parent_file_id).await?;
274272
let path = parent_file_entry.path.join(name);
275273
self.fs.remove_dir(&path).await?;
276274

277275
// remove the dir from file entry manager
278-
{
279-
let mut file_manager = self.file_entry_manager.write().await;
280-
file_manager.remove(&path);
281-
}
276+
self.remove_file_entry_locked(&parent_file_entry.path.join(name))
277+
.await;
282278
Ok(())
283279
}
284280

285-
async fn close_file(&self, _file_id: u64, fh: u64) -> crate::filesystem::Result<()> {
281+
async fn close_file(&self, _file_id: u64, fh: u64) -> Result<()> {
286282
let opened_file = self
287283
.opened_file_manager
288284
.remove(fh)
@@ -298,15 +294,14 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
298294
offset: u64,
299295
size: u32,
300296
) -> crate::filesystem::Result<Bytes> {
301-
let file_stat: FileStat;
302-
let data = {
297+
let (data, file_stat) = {
303298
let opened_file = self
304299
.opened_file_manager
305300
.get(fh)
306301
.ok_or(Errno::from(libc::EBADF))?;
307302
let mut opened_file = opened_file.lock().await;
308-
file_stat = opened_file.file_stat.clone();
309-
opened_file.read(offset, size).await
303+
let data = opened_file.read(offset, size).await;
304+
(data, opened_file.file_stat.clone())
310305
};
311306

312307
// update the file atime

clients/filesystem-fuse/src/filesystem.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub(crate) trait RawFileSystem: Send + Sync {
4545
async fn init(&self) -> Result<()>;
4646

4747
/// Get the file path by file id, if the file id is valid, return the file path
48-
async fn get_file_path(&self, file_id: u64) -> String;
48+
async fn get_file_path(&self, file_id: u64) -> Result<String>;
4949

5050
/// Validate the file id and file handle, if file id and file handle is valid and it associated, return Ok
5151
async fn valid_file_handle_id(&self, file_id: u64, fh: u64) -> Result<()>;

clients/filesystem-fuse/src/fuse_api_handle.rs

-4
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ impl<T: RawFileSystem> FuseApiHandle<T> {
5252
}
5353
}
5454

55-
pub async fn get_file_path(&self, file_id: u64) -> String {
56-
self.fs.get_file_path(file_id).await
57-
}
58-
5955
async fn get_modified_file_stat(
6056
&self,
6157
file_id: u64,

clients/filesystem-fuse/src/memory_filesystem.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ impl PathFileSystem for MemoryFileSystem {
7373
data: Arc::new(Mutex::new(Vec::new())),
7474
};
7575
let meta_file_path = Path::new(Self::FS_META_FILE_NAME).to_path_buf();
76-
self.file_map.write().unwrap().insert(meta_file_path, meta_file);
76+
self.file_map
77+
.write()
78+
.unwrap()
79+
.insert(meta_file_path, meta_file);
7780
Ok(())
7881
}
7982

clients/filesystem-fuse/src/mount.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ use crate::fuse_server::FuseServer;
2323
use crate::memory_filesystem::MemoryFileSystem;
2424
use fuse3::raw::Filesystem;
2525
use log::info;
26-
use std::sync::{Arc, LazyLock};
26+
use once_cell::sync::Lazy;
27+
use std::sync::Arc;
2728
use tokio::sync::Mutex;
2829

29-
static SERVER: LazyLock<Mutex<Option<Arc<FuseServer>>>> = LazyLock::new(|| Mutex::new(None));
30+
static SERVER: Lazy<Mutex<Option<Arc<FuseServer>>>> = Lazy::new(|| Mutex::new(None));
3031

3132
pub async fn mount(mount_point: &str) -> fuse3::Result<()> {
3233
info!("Starting gvfs-fuse server...");

clients/filesystem-fuse/src/opened_file_manager.rs

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ impl OpenedFileManager {
4545
}
4646

4747
pub(crate) fn put(&self, mut file: OpenedFile) -> Arc<Mutex<OpenedFile>> {
48+
// Put the file into the file handle map, and allocate a file handle id for the file.
4849
let file_handle_id = self.next_handle_id();
4950
file.handle_id = file_handle_id;
5051
let file_handle = Arc::new(Mutex::new(file));

clients/filesystem-fuse/tests/fuse_test.rs

-2
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,6 @@ fn test_fuse_filesystem(mount_point: &str) {
140140
assert!(!file_exists(&test_dir));
141141

142142
info!("Success test");
143-
144-
sleep(Duration::from_secs(15));
145143
}
146144

147145
fn file_exists<P: AsRef<Path>>(path: P) -> bool {

0 commit comments

Comments
 (0)