{"id":20673701,"url":"https://github.com/cpg314/fuser-async","last_synced_at":"2026-02-25T09:36:03.563Z","repository":{"id":255083469,"uuid":"597701045","full_name":"cpg314/fuser-async","owner":"cpg314","description":"Building FUSE filesystems where the system calls are directed to async functions. With an example S3 implementation","archived":false,"fork":false,"pushed_at":"2025-02-26T07:56:35.000Z","size":47,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-10T16:54:13.671Z","etag":null,"topics":["async","filesystem","fuse","rust","tokio"],"latest_commit_sha":null,"homepage":"https://c.pgdm.ch/code/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cpg314.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-02-05T11:28:18.000Z","updated_at":"2025-08-09T06:27:13.000Z","dependencies_parsed_at":"2025-02-26T08:29:01.929Z","dependency_job_id":"a40e43f3-7cba-41ce-9271-97d919e60bf3","html_url":"https://github.com/cpg314/fuser-async","commit_stats":null,"previous_names":["cpg314/fuser-async"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/cpg314/fuser-async","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg314%2Ffuser-async","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg314%2Ffuser-async/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg314%2Ffuser-async/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg314%2Ffuser-async/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cpg314","download_url":"https://codeload.github.com/cpg314/fuser-async/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg314%2Ffuser-async/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29816189,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T05:36:42.804Z","status":"ssl_error","status_checked_at":"2026-02-25T05:36:31.934Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","filesystem","fuse","rust","tokio"],"created_at":"2024-11-16T20:42:18.149Z","updated_at":"2026-02-25T09:36:03.545Z","avatar_url":"https://github.com/cpg314.png","language":"Rust","readme":"This crate, based on the [fuser crate](https://crates.io/crates/fuser), allows building FUSE filesystems where the system calls are directed to `async` functions.\n\nThis can be particularly useful when the syscalls benefit from (or require) async IO.\nWhen using a multi-threaded [`tokio`] runtime, this can also be useful for CPU-bound code\n(although one should be careful with the [interactions between IO- and CPU-bound tasks](https://docs.rs/tokio/latest/tokio/#cpu-bound-tasks-and-blocking-code)).\n\nMore precisely, this crate provides:\n\n- a [`Filesystem`] trait, analogous to the fuser [`fuser::Filesystem`] trait, which has all\n  its methods returning futures.\n- a [`FilesystemFUSE`] struct, which can be constructed from any implementor of the [`Filesystem`]\n  trait, and which implements the [`fuser::Filesystem`] trait, allowing to mount the filesystem\n  using the [fuser crate](https://crates.io/crates/fuser) crate.\n\n\u003csmall\u003eBehind the scenes, [`FilesystemFUSE`] wraps the inner filesystem into an [`std::sync::Arc\u003ctokio::sync::RwLock\u003e`] and stores a handle on the [`tokio`] runtime. \u003c/small\u003e\n\n## Usage\n\n1. Implement the [`Filesystem`] trait.\n2. Instantiate a [`FilesystemFUSE`] object from a instance implementing [`Filesystem`],\n   with [`FilesystemFUSE::new`].\n3. Mount the filesystem using [`fuser`], or use file handles programmatically with [`FileHandle`] (which implements [`tokio::io::AsyncRead`])\n\n```rust,ignore\nlet fs = TestFs::new();\nlet fuse = FilesystemFUSE::new(fs);\nlet _mount = fuser::spawn_mount2(\n    fuse,\n    mountpoint,\n    \u0026[fuser::MountOption::RO, fuser::MountOption::Async],\n  )?;\ntokio::signal::ctrl_c().await?;\n\n```\n\n## Implementations\n\nTwo example implementations are provided:\n\n- [Local filesystem passthrough](fuser-async-local).\n- [S3 object storage](fuser-async-s3), using the [`rusty_s3`](https://docs.rs/rusty-s3/latest/rusty_s3/) crate.\n\nSee the `demo` binary crate for a binary running these.\n\n```console\n$ cargo run -r --features s3,demo --bin demo -- --help\nUSAGE:\n    demo [OPTIONS] \u003cMOUNTPOINT\u003e \u003cSUBCOMMAND\u003e\n\nARGS:\n    \u003cMOUNTPOINT\u003e    Mountpoint\n\nOPTIONS:\n    -d, --debug\n    -h, --help     Print help information\n\nSUBCOMMANDS:\n    local\n    s3\n```\n\n## Difference with other solutions\n\n## `fuse_mt`\n\nSee \u003chttps://github.com/wfraser/fuse-mt/issues/3\u003e. The implementation of this crate is fairly similar to the prototype linked in this issue,\nexcept that we use a recent [`tokio`] version and support different syscalls.\n\n## Limitations/TODO\n\n- Not all methods from [`fuser::Filesystem`] are supported (they are however easy to add). In particular, the current focus of is on read operations.\n- No tests yet beyond the demo and the dependent crates.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcpg314%2Ffuser-async","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcpg314%2Ffuser-async","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcpg314%2Ffuser-async/lists"}