Skip to content

Commit b1b04df

Browse files
Merge branch 'release/0.2.1'
2 parents 1f54357 + 184d161 commit b1b04df

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+840
-891
lines changed

.github/workflows/build.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
- uses: actions/checkout@v2
1313
- uses: actions/setup-java@v2
1414
with:
15-
java-version: 19-ea
15+
java-version: 19
1616
distribution: 'zulu'
1717
cache: 'maven'
1818
- name: Setup fuse
@@ -35,7 +35,7 @@ jobs:
3535
- uses: actions/checkout@v2
3636
- uses: actions/setup-java@v2
3737
with:
38-
java-version: 19-ea
38+
java-version: 19
3939
distribution: 'zulu'
4040
cache: 'maven'
4141
- name: Setup fuse
@@ -56,7 +56,7 @@ jobs:
5656
- uses: actions/checkout@v2
5757
- uses: actions/setup-java@v2
5858
with:
59-
java-version: 19-ea
59+
java-version: 19
6060
distribution: 'zulu'
6161
cache: 'maven'
6262
- name: Setup fuse
@@ -79,7 +79,7 @@ jobs:
7979
fetch-depth: 0
8080
- uses: actions/setup-java@v2
8181
with:
82-
java-version: 19-ea
82+
java-version: 19
8383
distribution: 'zulu'
8484
cache: 'maven'
8585
- name: Cache SonarCloud packages

.github/workflows/publish-central.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
ref: "refs/tags/${{ github.event.inputs.tag }}"
1616
- uses: actions/setup-java@v2
1717
with:
18-
java-version: 19-ea
18+
java-version: 19
1919
distribution: 'zulu'
2020
cache: 'maven'
2121
server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml

.github/workflows/publish-github.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
- uses: actions/checkout@v2
1111
- uses: actions/setup-java@v2
1212
with:
13-
java-version: 19-ea
13+
java-version: 19
1414
distribution: 'zulu'
1515
cache: 'maven'
1616
gpg-private-key: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} # Value of the GPG private key to import

.idea/misc.xml

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jfuse-api/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.cryptomator</groupId>
77
<artifactId>jfuse</artifactId>
8-
<version>0.2.0</version>
8+
<version>0.2.1</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111
<artifactId>jfuse-api</artifactId>

jfuse-examples/pom.xml

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.cryptomator</groupId>
77
<artifactId>jfuse</artifactId>
8-
<version>0.2.0</version>
8+
<version>0.2.1</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111
<artifactId>jfuse-examples</artifactId>
@@ -24,7 +24,7 @@
2424
<dependency>
2525
<groupId>org.slf4j</groupId>
2626
<artifactId>slf4j-simple</artifactId>
27-
<version>2.0.0-alpha6</version>
27+
<version>2.0.3</version>
2828
</dependency>
2929
</dependencies>
3030

@@ -51,8 +51,8 @@
5151
<activation>
5252
<os>
5353
<family>unix</family>
54-
<name>Linux</name>
55-
<arch>x86_64</arch>
54+
<name>linux</name>
55+
<arch>amd64</arch>
5656
</os>
5757
</activation>
5858
<dependencies>
@@ -69,7 +69,7 @@
6969
<activation>
7070
<os>
7171
<family>unix</family>
72-
<name>Linux</name>
72+
<name>linux</name>
7373
<arch>aarch64</arch>
7474
</os>
7575
</activation>

jfuse-examples/src/main/java/org/cryptomator/jfuse/examples/AbstractMirrorFileSystem.java

-13
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ protected Path resolvePath(String absolutePath) {
7171
public Set<FuseOperations.Operation> supportedOperations() {
7272
return EnumSet.of(
7373
FuseOperations.Operation.ACCESS,
74-
FuseOperations.Operation.CHMOD,
7574
FuseOperations.Operation.CREATE,
7675
FuseOperations.Operation.DESTROY,
7776
FuseOperations.Operation.GET_ATTR,
@@ -216,18 +215,6 @@ private long countSubDirs(Path dir) throws IOException {
216215
}
217216
}
218217

219-
@Override
220-
public int chmod(String path, int mode, FileInfo fi) {
221-
LOG.trace("chmod {}", path);
222-
Path node = resolvePath(path);
223-
try {
224-
Files.setPosixFilePermissions(node, FileModes.toPermissions(mode));
225-
return 0;
226-
} catch (IOException e) {
227-
return -errno.eio();
228-
}
229-
}
230-
231218
@Override
232219
public int utimens(String path, TimeSpec atime, TimeSpec mtime, FileInfo fi) {
233220
LOG.trace("utimens {}", path);

jfuse-linux-aarch64/pom.xml

+10-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>jfuse</artifactId>
77
<groupId>org.cryptomator</groupId>
8-
<version>0.2.0</version>
8+
<version>0.2.1</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111
<artifactId>jfuse-linux-aarch64</artifactId>
@@ -91,14 +91,19 @@
9191
<headerClassName>fuse_h</headerClassName>
9292
<cPreprocessorMacros>
9393
<cPreprocessorMacro>_FILE_OFFSET_BITS=64</cPreprocessorMacro>
94-
<cPreprocessorMacro>FUSE_USE_VERSION=35</cPreprocessorMacro>
94+
<cPreprocessorMacro>FUSE_USE_VERSION=312</cPreprocessorMacro>
9595
</cPreprocessorMacros>
9696
<includeFunctions>
97+
<includeFunction>fuse_version</includeFunction>
9798
<includeFunction>fuse_lib_help</includeFunction>
9899
<includeFunction>fuse_new</includeFunction>
99100
<includeFunction>fuse_mount</includeFunction>
100101
<includeFunction>fuse_get_session</includeFunction>
101102
<includeFunction>fuse_loop</includeFunction>
103+
<includeFunction>fuse_loop_cfg_create</includeFunction>
104+
<includeFunction>fuse_loop_cfg_set_clone_fd</includeFunction>
105+
<includeFunction>fuse_loop_cfg_set_max_threads</includeFunction>
106+
<includeFunction>fuse_loop_cfg_destroy</includeFunction>
102107
<includeFunction>fuse_loop_mt</includeFunction>
103108
<includeFunction>fuse_exit</includeFunction>
104109
<includeFunction>fuse_unmount</includeFunction>
@@ -115,7 +120,7 @@
115120
<includeStruct>timespec</includeStruct>
116121
<includeStruct>fuse_conn_info</includeStruct>
117122
<includeStruct>fuse_args</includeStruct>
118-
<includeStruct>fuse_loop_config</includeStruct>
123+
<includeStruct>fuse_loop_config_v1</includeStruct>
119124
</includeStructs>
120125
</configuration>
121126
</execution>
@@ -126,15 +131,12 @@
126131
</goals>
127132
<configuration>
128133
<headerFile>${project.parent.basedir}/libfuse3/include/fuse_lowlevel.h</headerFile>
129-
<targetPackage>org.cryptomator.jfuse.linux.aarch64.extr.ll</targetPackage>
134+
<targetPackage>org.cryptomator.jfuse.linux.aarch64.extr</targetPackage>
130135
<headerClassName>fuse_lowlevel_h</headerClassName>
131136
<cPreprocessorMacros>
132137
<cPreprocessorMacro>_FILE_OFFSET_BITS=64</cPreprocessorMacro>
133-
<cPreprocessorMacro>FUSE_USE_VERSION=35</cPreprocessorMacro>
138+
<cPreprocessorMacro>FUSE_USE_VERSION=312</cPreprocessorMacro>
134139
</cPreprocessorMacros>
135-
<includeFunctions>
136-
<includeFunction>fuse_parse_cmdline</includeFunction>
137-
</includeFunctions>
138140
<includeStructs>
139141
<includeStruct>fuse_cmdline_opts</includeStruct>
140142
</includeStructs>

jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/FuseArgs.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.cryptomator.jfuse.linux.aarch64;
22

33
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_args;
4-
import org.cryptomator.jfuse.linux.aarch64.extr.ll.fuse_cmdline_opts;
4+
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_cmdline_opts;
55

66
import java.lang.foreign.MemoryAddress;
77
import java.lang.foreign.MemorySegment;
@@ -31,4 +31,16 @@ public MemoryAddress mountPoint() {
3131
public boolean multithreaded() {
3232
return fuse_cmdline_opts.singlethread$get(cmdLineOpts) == 0;
3333
}
34+
35+
public int cloneFd() {
36+
return fuse_cmdline_opts.clone_fd$get(cmdLineOpts);
37+
}
38+
39+
public int maxIdleThreads() {
40+
return fuse_cmdline_opts.max_idle_threads$get(cmdLineOpts);
41+
}
42+
43+
public int maxThreads() {
44+
return fuse_cmdline_opts.max_threads$get(cmdLineOpts);
45+
}
3446
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.cryptomator.jfuse.linux.aarch64;
2+
3+
import java.lang.foreign.Addressable;
4+
import java.lang.foreign.FunctionDescriptor;
5+
import java.lang.foreign.Linker;
6+
import java.lang.foreign.SymbolLookup;
7+
import java.lang.invoke.MethodHandle;
8+
9+
import static java.lang.foreign.ValueLayout.ADDRESS;
10+
import static java.lang.foreign.ValueLayout.JAVA_INT;
11+
12+
/**
13+
* These method references can not be jextract'ed, partly due to jextract not being able to understand {@code #define},
14+
* partly due to slight differences in the FUSE API, which applies a versioning scheme via dlvsym, that Panama's default
15+
* {@link java.lang.foreign.SymbolLookup} doesn't support.
16+
*/
17+
class FuseFunctions {
18+
19+
// see https://github.com/libfuse/libfuse/blob/fuse-3.12.0/include/fuse_lowlevel.h#L1892-L1923
20+
private static final FunctionDescriptor FUSE_PARSE_CMDLINE = FunctionDescriptor.of(JAVA_INT, ADDRESS, ADDRESS);
21+
22+
private final MethodHandle fuse_parse_cmdline;
23+
24+
private FuseFunctions() {
25+
var lookup = SymbolLookup.loaderLookup();
26+
var linker = Linker.nativeLinker();
27+
this.fuse_parse_cmdline = lookup.lookup("fuse_parse_cmdline")
28+
.map(symbol -> linker.downcallHandle(symbol, FUSE_PARSE_CMDLINE))
29+
.orElseThrow(() -> new UnsatisfiedLinkError("unresolved symbol fuse_parse_cmdline"));
30+
}
31+
32+
private static class Holder {
33+
private static final FuseFunctions INSTANCE = new FuseFunctions();
34+
}
35+
36+
public static int fuse_parse_cmdline(Addressable args, Addressable opts) {
37+
try {
38+
return (int) Holder.INSTANCE.fuse_parse_cmdline.invokeExact(args, opts);
39+
} catch (Throwable e) {
40+
throw new AssertionError("should not reach here", e);
41+
}
42+
}
43+
44+
}

jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/FuseImpl.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_args;
99
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_h;
1010
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_operations;
11-
import org.cryptomator.jfuse.linux.aarch64.extr.ll.fuse_cmdline_opts;
12-
import org.cryptomator.jfuse.linux.aarch64.extr.ll.fuse_lowlevel_h;
11+
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_cmdline_opts;
1312
import org.cryptomator.jfuse.linux.aarch64.extr.stat_h;
1413
import org.cryptomator.jfuse.linux.aarch64.extr.timespec;
1514
import org.jetbrains.annotations.VisibleForTesting;
@@ -61,7 +60,7 @@ FuseArgs parseArgs(List<String> cmdLineArgs) throws IllegalArgumentException {
6160
fuse_args.allocated$set(args, 0);
6261

6362
var opts = fuse_cmdline_opts.allocate(fuseScope);
64-
int parseResult = fuse_lowlevel_h.fuse_parse_cmdline(args, opts);
63+
int parseResult = FuseFunctions.fuse_parse_cmdline(args, opts);
6564
if (parseResult != 0) {
6665
throw new IllegalArgumentException("fuse_parse_cmdline failed to parse " + String.join(" ", cmdLineArgs));
6766
}

jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/FuseMountImpl.java

+22-6
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,40 @@
22

33
import org.cryptomator.jfuse.api.FuseMount;
44
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_h;
5-
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_loop_config;
5+
import org.cryptomator.jfuse.linux.aarch64.extr.fuse_loop_config_v1;
66

77
import java.lang.foreign.MemoryAddress;
88
import java.lang.foreign.MemorySession;
99

1010
record FuseMountImpl(MemoryAddress fuse, FuseArgs fuseArgs) implements FuseMount {
1111

12+
private static final int FUSE_3_2 = 32;
13+
private static final int FUSE_3_12 = 312;
14+
1215
@Override
1316
public int loop() {
14-
if (fuseArgs.multithreaded()) {
17+
// depends on fuse version: https://github.com/libfuse/libfuse/blob/fuse-3.12.0/include/fuse.h#L1011-L1050
18+
if (!fuseArgs.multithreaded() || fuse_h.fuse_version() < FUSE_3_2) {
19+
// FUSE 3.1: to keep things simple, we just don't support fuse_loop_mt
20+
return fuse_h.fuse_loop(fuse);
21+
} else if (fuse_h.fuse_version() < FUSE_3_12) {
22+
// FUSE 3.2
1523
try (var scope = MemorySession.openConfined()) {
16-
var loopCfg = fuse_loop_config.allocate(scope);
17-
fuse_loop_config.clone_fd$set(loopCfg, 0);
18-
fuse_loop_config.max_idle_threads$set(loopCfg, 10);
24+
var loopCfg = fuse_loop_config_v1.allocate(scope);
25+
fuse_loop_config_v1.clone_fd$set(loopCfg, fuseArgs.cloneFd());
26+
fuse_loop_config_v1.max_idle_threads$set(loopCfg, fuseArgs.maxIdleThreads());
1927
return fuse_h.fuse_loop_mt(fuse, loopCfg);
2028
}
2129
} else {
22-
return fuse_h.fuse_loop(fuse);
30+
// FUSE 3.12
31+
var loopCfg = fuse_h.fuse_loop_cfg_create();
32+
try {
33+
fuse_h.fuse_loop_cfg_set_clone_fd(loopCfg, fuseArgs.cloneFd());
34+
fuse_h.fuse_loop_cfg_set_max_threads(loopCfg, fuseArgs.maxThreads());
35+
return fuse_h.fuse_loop_mt(fuse, loopCfg);
36+
} finally {
37+
fuse_h.fuse_loop_cfg_destroy(loopCfg);
38+
}
2339
}
2440
}
2541

0 commit comments

Comments
 (0)