Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 108759b

Browse filesBrowse files
committed
[libfuse-fs]: Add Rename fuse-api Support for OverlayFS
Signed-off-by: Han Xiaoyang <lux1an@qq.com>
1 parent 262388b commit 108759b
Copy full SHA for 108759b

File tree

Expand file treeCollapse file tree

11 files changed

+314
-203
lines changed
Filter options
Expand file treeCollapse file tree

11 files changed

+314
-203
lines changed

‎project/libfuse-fs/Cargo.toml

Copy file name to clipboardExpand all lines: project/libfuse-fs/Cargo.toml
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "libfuse-fs"
3-
version = "0.1.1"
3+
version = "0.1.2"
44
edition = "2024"
55
description = "FUSE Filesystem Library"
66
homepage = "https://github.com/r2cn-dev/rk8s/tree/main/project/libfuse-fs"

‎project/libfuse-fs/overlay.md

Copy file name to clipboard
+19-19Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
```mermaid
22
graph LR
33
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
4-
4+
55
OverlayFs([OverlayFs]):::process
66
OverlayInode([OverlayInode]):::process
77
RealInode([RealInode]):::process
@@ -10,23 +10,23 @@ graph LR
1010
InodeStore([InodeStore]):::process
1111
Config([Config]):::process
1212
PassthroughFs([PassthroughFs]):::process
13-
14-
OverlayFs -->|包含| Config
15-
OverlayFs -->|包含多个| lower_layers(PassthroughFs)
16-
OverlayFs -->|包含一个| upper_layer(PassthroughFs)
17-
OverlayFs -->|管理| InodeStore
18-
OverlayFs -->|管理| handles(HandleData)
19-
20-
OverlayInode -->|包含多个| RealInode
21-
OverlayInode -->|父节点| OverlayInode
22-
OverlayInode -->|子节点| OverlayInode
23-
24-
RealInode -->|关联| PassthroughFs
25-
RealHandle -->|关联| PassthroughFs
26-
HandleData -->|包含| OverlayInode
27-
HandleData -->|包含| RealHandle
28-
29-
OverlayFs -->|操作涉及| OverlayInode
30-
InodeStore -->|存储| OverlayInode
13+
14+
OverlayFs -->|including| Config
15+
OverlayFs -->|includes multiple| lower_layers(PassthroughFs)
16+
OverlayFs -->|includes one| upper_layer(PassthroughFs)
17+
OverlayFs -->|manages| InodeStore
18+
OverlayFs -->|manages| handles(HandleData)
19+
20+
OverlayInode -->|includes multiple| RealInode
21+
OverlayInode -->|parent| OverlayInode
22+
OverlayInode -->|child| OverlayInode
23+
24+
RealInode -->|associated with| PassthroughFs
25+
RealHandle -->|associated with| PassthroughFs
26+
HandleData -->|includes| OverlayInode
27+
HandleData -->|includes| RealHandle
28+
29+
OverlayFs -->|operations involve| OverlayInode
30+
InodeStore -->|stores| OverlayInode
3131
3232
```

‎project/libfuse-fs/src/overlayfs/async_io.rs

Copy file name to clipboardExpand all lines: project/libfuse-fs/src/overlayfs/async_io.rs
+10-15Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -243,20 +243,15 @@ impl Filesystem for OverlayFs {
243243
/// rename a file or directory.
244244
async fn rename(
245245
&self,
246-
_req: Request,
247-
_parent: Inode,
248-
_name: &OsStr,
249-
_new_parent: Inode,
250-
_new_name: &OsStr,
246+
req: Request,
247+
parent: Inode,
248+
name: &OsStr,
249+
new_parent: Inode,
250+
new_name: &OsStr,
251251
) -> Result<()> {
252-
// let inode = self.lookup_node(req, parent, name.to_str().unwrap()).await?;
253-
// if inode.in_upper_layer().await {
254-
// todo!();
255-
// }
256-
257-
// self.get_active_inode(inode).await;
258-
// complex, implement it later
259-
Err(Error::from_raw_os_error(libc::EXDEV).into())
252+
self.do_rename(req, parent, name, new_parent, new_name)
253+
.await
254+
.map_err(|e| e.into())
260255
}
261256

262257
/// create a hard link.
@@ -650,7 +645,7 @@ impl Filesystem for OverlayFs {
650645
return Err(Error::from_raw_os_error(libc::ENOTDIR).into());
651646
}
652647
let entries = self
653-
.do_readdir(req, parent, fh, offset.try_into().unwrap(), false)
648+
.do_readdir(req, parent, fh, offset.try_into().unwrap())
654649
.await?;
655650
Ok(ReplyDirectory { entries })
656651
}
@@ -669,7 +664,7 @@ impl Filesystem for OverlayFs {
669664
info!("fuse: readdir is not supported.");
670665
return Err(Error::from_raw_os_error(libc::ENOTDIR).into());
671666
}
672-
let entries = self.do_readdirplus(req, parent, fh, offset, false).await?;
667+
let entries = self.do_readdirplus(req, parent, fh, offset).await?;
673668
Ok(ReplyDirectoryPlus { entries })
674669
}
675670
/// release an open directory. For every [`opendir`][Filesystem::opendir] call there will

‎project/libfuse-fs/src/overlayfs/inode_store.rs

Copy file name to clipboardExpand all lines: project/libfuse-fs/src/overlayfs/inode_store.rs
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub struct InodeStore {
2222
next_inode: u64,
2323
inode_limit: u64,
2424
}
25-
#[allow(unused)]
25+
2626
impl InodeStore {
2727
pub(crate) fn new() -> Self {
2828
Self {
@@ -119,7 +119,7 @@ impl InodeStore {
119119
#[allow(dead_code)]
120120
pub(crate) async fn debug_print_all_inodes(&self) {
121121
// Convert the HashMap to Vector<(inode, pathname)>
122-
let mut all_inodes_f = self
122+
let all_inodes_f = self
123123
.inodes
124124
.iter()
125125
.map(|(inode, ovi)| {
@@ -133,7 +133,7 @@ impl InodeStore {
133133
all_inodes.sort_by(|a, b| a.0.cmp(b.0));
134134
trace!("all active inodes: {:?}", all_inodes);
135135

136-
let mut to_delete = self
136+
let to_delete = self
137137
.deleted
138138
.iter()
139139
.map(|(inode, ovi)| async move { (inode, ovi.path.clone(), ovi.lookups.load().await) })

‎project/libfuse-fs/src/overlayfs/layer.rs

Copy file name to clipboardExpand all lines: project/libfuse-fs/src/overlayfs/layer.rs
+66-1Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,71 @@ mod test {
224224
panic!("{:?}", res);
225225
}
226226
let _ = fs.destroy(Request::default()).await;
227-
// Add your test assertions and logic here.
227+
}
228+
229+
#[tokio::test]
230+
async fn test_is_opaque_on_non_directory() {
231+
let temp_dir = "/tmp/test_opaque_non_dir/t2";
232+
let rootdir = PathBuf::from(temp_dir);
233+
std::fs::create_dir_all(&rootdir).unwrap();
234+
let fs = new_passthroughfs_layer(rootdir.to_str().unwrap())
235+
.await
236+
.unwrap();
237+
let _ = fs.init(Request::default()).await;
238+
239+
// Create a file
240+
let file_name = OsStr::new("not_a_dir");
241+
let _ = fs
242+
.create(Request::default(), 1, file_name, 0o644, 0)
243+
.await
244+
.unwrap();
245+
246+
// Lookup to get the inode of the file
247+
let entry = fs.lookup(Request::default(), 1, file_name).await.unwrap();
248+
let file_inode = entry.attr.ino;
249+
250+
// is_opaque should return ENOTDIR error
251+
let res = fs.is_opaque(Request::default(), file_inode).await;
252+
assert!(res.is_err());
253+
let err = res.err().unwrap();
254+
let ioerr: std::io::Error = err.into();
255+
assert_eq!(ioerr.raw_os_error(), Some(libc::ENOTDIR));
256+
257+
// Clean up
258+
let _ = fs.unlink(Request::default(), 1, file_name).await;
259+
let _ = fs.destroy(Request::default()).await;
260+
}
261+
262+
#[tokio::test]
263+
async fn test_set_opaque_on_non_directory() {
264+
let temp_dir = "/tmp/test_set_opaque_non_dir/t2";
265+
let rootdir = PathBuf::from(temp_dir);
266+
std::fs::create_dir_all(&rootdir).unwrap();
267+
let fs = new_passthroughfs_layer(rootdir.to_str().unwrap())
268+
.await
269+
.unwrap();
270+
let _ = fs.init(Request::default()).await;
271+
272+
// Create a file
273+
let file_name = OsStr::new("not_a_dir2");
274+
let _ = fs
275+
.create(Request::default(), 1, file_name, 0o644, 0)
276+
.await
277+
.unwrap();
278+
279+
// Lookup to get the inode of the file
280+
let entry = fs.lookup(Request::default(), 1, file_name).await.unwrap();
281+
let file_inode = entry.attr.ino;
282+
283+
// set_opaque should return ENOTDIR error
284+
let res = fs.set_opaque(Request::default(), file_inode).await;
285+
assert!(res.is_err());
286+
let err = res.err().unwrap();
287+
let ioerr: std::io::Error = err.into();
288+
assert_eq!(ioerr.raw_os_error(), Some(libc::ENOTDIR));
289+
290+
// Clean up
291+
let _ = fs.unlink(Request::default(), 1, file_name).await;
292+
let _ = fs.destroy(Request::default()).await;
228293
}
229294
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.