- 18 Jul, 2020 1 commit
-
-
Jakob Unterwurzacher authored
Also add a test if "ro" works directly in the fs package. Currently fails like this (will be fixed later): --- FAIL: TestRoMount (0.01s) simple_test.go:116: read-only file syste Change-Id: I8194360b1d092268784b9c2b17de274b86633aa2
-
- 06 Jun, 2020 2 commits
-
-
Jakob Unterwurzacher authored
Regression test for https://github.com/hanwen/go-fuse/issues/344 "[v2 API] xfstests generic/257 fails (getdents seek trouble)" Change-Id: Icefab07f6762f8e56de525713facf992797d4435
-
Jakob Unterwurzacher authored
"seeking" works by skipping forward to the requested offset, first rewinding to zero if seeking back. The performance is obviously bad, however, seeking inside a directory does not seem to be too common. I think the solution is good enough until we see a use case where this causes performance issues. Fixes https://github.com/hanwen/go-fuse/issues/344 Change-Id: Ia7f7fbffaf932c16919eafede6b70f4aff245c25
-
- 03 Apr, 2020 3 commits
-
-
Han-Wen Nienhuys authored
Change-Id: Ie2aeb012346b2fbcc32de09ea05b39069291d803
-
Han-Wen Nienhuys authored
Change-Id: Ife141f38f2b7598223935963e2916b0b9a609cca
-
Kirill Smelkov authored
Commit d0fca860 introduced big lookup lock with the idea to "make sure we don't return forgotten nodes to the kernel". However this way it also started to prevent several Lookup handlers to be running simultaneously, which can deadlock if e.g. Lookup handler somehow synchronizes with other thread which caused the lookup: https://github.com/hanwen/go-fuse/commit/d0fca860#commitcomment-37772099 On the surface the fix is easy: if we need to prevent lookups running in parallel to forget, we can turn lookupLock into shared one wrt Lookup, but exclusive wrt Forget. However a more correct fix would be to review nodefs locking completely: there is already per-filesystem treeLock RWMutex, which is _already_ used to synchronize for forgets and lookups. From this point of view lookupLock is unneeded and the correct fix that d0fca860 should have been doing is to correct the scope of treeLock to be used more precisely. However that would be a more intrusive change, and given that nodefs is considered deprecated today, imho it is better to proceed with making lookupLock a shared one. The test that is added deadlocks without provided fix. I suggest not to reject this patch based on rationale that "nodefs is deprecated" as there still are real filesystems that use nodefs. I had not reviewed v2 go-fuse/fs locking yet. Change-Id: I18e01457f474dea31dc17186dfe6db582c2e6337
-
- 24 Feb, 2020 4 commits
-
-
Jakob Unterwurzacher authored
This used to create a hidden folder in the user's home directory to avoid /tmp, which is on tmpfs on modern distros. Use /var/tmp instead, which is also a real filesystem, and avoid cluttering the home dir. Change-Id: Ifa0a1dbdf7a2c4b08e53d20e28f287207ff8ef47
-
Jakob Unterwurzacher authored
Per default, "go test ./..." tests multiple packages in parallel. From "go help build": -p n the number of programs, such as build commands or test binaries, that can be run in parallel. The default is the number of CPUs available. This seems rather innocent, but a consequence of tests running in parallel is that the all the output of each test is buffered until it completes. This prevents multiple tests interleaving their output. This also means that when a test hangs, we get no output at all, which is pretty bad. Disable parallelization and trade test time for better debugability of hung tests. Change-Id: I4c670b65baa2df3bef70bce622b830530a316ee7
-
Jakob Unterwurzacher authored
This gets added on every build and every test run, dirtying the git tree again and again. Give in and let Go 1.13 have it's entry in go.mod. Change-Id: I13679e54fca09ab818bc0167dff3f1ad851e763e
-
Jakob Unterwurzacher authored
Running `go test ./... -race` showed a data race at `rootNode.deleted`. This race cannot really happen, but the race detector does not know that as the calls go through FUSE an appear to not be synchronized. Use atomic loads and stores to make the race detector happy. Change-Id: I26bd3e7d8efdd5b967fdb360eb17d7f71a8005c8
-
- 02 Feb, 2020 1 commit
-
-
Jakob Unterwurzacher authored
If "dist" is not specified, Travis uses Ubuntu 16.04 with kernel 4.15.0-1028-gcp. This kernel misses fixes to FUSE which cause hangs in TestParallelDiropsHang. Specifying "dist: bionic" makes Travis use kernel 5.0.0-1026-gcp. Fixes https://github.com/hanwen/go-fuse/issues/281 Change-Id: Ic0f9987726eb11c608ec0cf42b73e089ec1cd2db Change-Id: If158380a909a6bf78212c75c8dddc57e8c955448
-
- 20 Jan, 2020 1 commit
-
-
Han-Wen Nienhuys authored
The server.Serve routine can be called both inline and as goroutine. In the latter case, it is a synchronization error for Serve to call serve.loops.Add() by itself, leading to a detected race. Change-Id: I36f24bd36d1ae77d71e7d69a54ebdf5dbee9bd62
-
- 03 Jan, 2020 11 commits
-
-
Jakob Unterwurzacher authored
The loopback example is usually used to debug and develop. Enable the new diagnostics logging facility, unless -q (quiet) is passed. Change-Id: I9ae5214fc33616656832a219fc1470f421786b8c
-
Jakob Unterwurzacher authored
Some ".deleted" logic was in place, but did not work properly when the Inode was in the root directory. Fix that by introducing the `found` variable and add a test that verifies that it works. Also, return `.go-fuse.$RANDOM/deleted` to make it very unlikely that the placeholder name matches an actual file or directory. Introducing the `/deleted` subdir makes sure operations creating a file or directory fail reliably with ENOENT. Tests now look like this: $ go test ./fs -run TestPosix/RenameOpenDir -count 1 -v === RUN TestPosix === RUN TestPosix/RenameOpenDir [...] --- PASS: TestPosix (0.01s) --- SKIP: TestPosix/RenameOpenDir (0.01s) test.go:383: Fstat failed: no such file or directory. Known limitation - see https://github.com/hanwen/go-fuse/issues/55 PASS ok github.com/hanwen/go-fuse/v2/fs 0.014s Change-Id: I2eb6fd48a11df543c9b7daf62647cb9d8a892568
-
Jakob Unterwurzacher authored
The test seemed to pass because the inode number is overridden in rawBridge.getattr, but looking at the permissions shows that the wrong directory is stat()ed: $ go test ./fs -run TestPosix/RenameOpenDir -count 1 -v [...] 17:49:46.454077 received ENODEV (unmount request), thread exiting 17:49:46.454343 received ENODEV (unmount request), thread exiting --- PASS: TestPosix (0.01s) --- SKIP: TestPosix/RenameOpenDir (0.01s) test.go:392: got permissions 0755, want 0700. Known limitation - see https://github.com/hanwen/go-fuse/issues/55 PASS ok github.com/hanwen/go-fuse/v2/fs 0.016s Also, add a log message whenever the inode number is overridden, this should (probably) not happen during normal operation. And it actually only happens once in the test suite (in RenameOpenDir): $ go test ./... -count 1 -v 2>&1 | grep "overriding ino" 14:48:44.143694 warning: rawBridge.getattr: overriding ino 188663 with 186314 See https://github.com/hanwen/go-fuse/issues/55 Change-Id: I8b2ddb84c35a3b28b4f5e032e7113f8d484a5981
-
Han-Wen Nienhuys authored
Change-Id: I4fabf222a306e5d3abdfda28422b046cd75c9a8c
-
Jakob Unterwurzacher authored
The type assertion was meant to operate on `f.file`, not on `n.ops` again. Fixes xfstests generic/228. Change-Id: I8f8ca0cead91a512a6d7826dd7e7e5d1887ae627
-
Jakob Unterwurzacher authored
Set `opts.NullPermissions = true` to stop us from falsifying file permissions on "000" files. Fixes xfstests generic/088. Change-Id: Ibabbdc97b1ae2531ca093bae6bb441ae15d3238e
-
Jakob Unterwurzacher authored
With -allow-other, other users can access the mountpoint. However, without default_permissions, nobody checks file permissions. Make loopback behave more like a regular filesystem by enabling default_permissions if -allow-other is passed. Fixes xfstests generic/087: $ sudo ./check-loopback generic/087 fuse-xfstests gocryptfs-2018-08-18/67408ac7 Thu 26 Dec 2019 03:08:54 PM UTC loopback is /usr/local/bin/loopback FSTYP -- fuse.loopback PLATFORM -- Linux/x86_64 brikett 5.3.12-300.fc31.x86_64 MKFS_OPTIONS -- /var/tmp/fuse-xfstests/check-loopback/scratchdev MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /var/tmp/fuse-xfstests/check-loopback/scratchdev /var/tmp/fuse-xfstests/check-loopback/scratchdir generic/087 1s Ran: generic/087 Passed all 1 tests Runtime was 1 seconds, exit code 0 Change-Id: Ifa8ac38a3775c3cacf20d37638a95887c9c24f93
-
Jakob Unterwurzacher authored
When the default_permissions option is passed to the kernel, it issues a extra GETATTR on the .go-fuse-epoll-hack node. Rejecting that with EIO makes `syscall.Creat` in `pollHack` fail, ultimately erroring out during mount. $ loopback -allow-other -debug b a 16:06:39.576856 rx 2: INIT i0 {7.31 Ra 0x20000 NO_OPEN_SUPPORT,PARALLEL_DIROPS,ABORT_ERROR,EXPLICIT_INVAL_DATA,SPLICE_WRITE,READDIRPLUS,ASYNC_DIO,DONT_MASK,NO_OPENDIR_SUPPORT,AUTO_INVAL_DATA,READDIRPLUS_AUTO,POSIX_ACL,HANDLE_KILLPRIV,MAX_PAGES,ATOMIC_O_TRUNC,EXPORT_SUPPORT,SPLICE_MOVE,BIG_WRITES,SPLICE_READ,FLOCK_LOCKS,IOCTL_DIR,WRITEBACK_CACHE,ASYNC_READ,POSIX_LOCKS,CACHE_SYMLINKS} 16:06:39.576999 tx 2: OK, {7.28 Ra 0x20000 AUTO_INVAL_DATA,BIG_WRITES,ASYNC_READ,NO_OPEN_SUPPORT,PARALLEL_DIROPS,READDIRPLUS 0/0 Wr 0x10000 Tg 0x0} 16:06:39.578670 rx 4: GETATTR i1 {Fh 0} 16:06:39.578717 rx 6: GETATTR i1 {Fh 0} 16:06:39.578735 tx 4: OK, {tA=1s {M040755 SZ=40 L=2 1026:1026 B0*4096 i0:1 A 1577370827.990394 M 1577370827.990394 C 1577370827.990394}} 16:06:39.578765 tx 6: OK, {tA=1s {M040755 SZ=40 L=2 1026:1026 B0*4096 i0:1 A 1577370827.990394 M 1577370827.990394 C 1577370827.990394}} 16:06:39.579028 rx 8: LOOKUP i1 [".go-fuse-epoll-hack"] 20b 16:06:39.579053 tx 8: 2=no such file or directory, {i0 g0 tE=0s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}} 16:06:39.579087 rx 10: CREATE i1 {0100100 [WRONLY,TRUNC,CREAT,0x8000] (022)} [".go-fuse-epoll-hack"] 20b 16:06:39.579113 tx 10: OK, {i18446744073709551615 g0 {M0100644 SZ=0 L=1 0:0 B0*0 i0:18446744073709551615 A 0.000000 M 0.000000 C 0.000000} &{18446744073709551615 0 0}} 16:06:39.579199 rx 14: GETATTR i1 {Fh 0} 16:06:39.579205 rx 12: GETATTR i18446744073709551615 {Fh 0} 16:06:39.579216 tx 14: OK, {tA=1s {M040755 SZ=40 L=2 1026:1026 B0*4096 i0:1 A 1577370827.990394 M 1577370827.990394 C 1577370827.990394}} 16:06:39.579237 rx 16: LOOKUP i1 [".go-fuse-epoll-hack"] 20b 16:06:39.579242 tx 12: 5=input/output error, {tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}} 16:06:39.579247 tx 16: 2=no such file or directory, {i0 g0 tE=0s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}} 16:06:39.579270 Mount fail: input/output error 16:06:39.579271 rx 20: LOOKUP i1 [".Trash"] 7b Change-Id: I20024baf2e8f386b637abbd236b188bfdfa8579f
-
Jakob Unterwurzacher authored
If we are running as root have caller information from the context, try to set the owner of newly created files and directories. Lays the foundation for fixing xfstests generic/087 (xfstests always run as root). Change-Id: Ib8d768153f3ec82ce572021a433a6398560efd44
-
Jakob Unterwurzacher authored
Excercises the fd-finding logic in rawBridge.GetAttr. No issues found, tests pass, logic works fine. Change-Id: I49731b8ec5b41344d58409c8ca615f466bd95f29
-
Jakob Unterwurzacher authored
Stop following symlinks when working with extended attributes, and add a test for it. Problem found by xfstests generic/062. Change-Id: I67f94451322cdfebdcbcc3af21679ccd4e2800d7
-
- 19 Dec, 2019 2 commits
-
-
Han-Wen Nienhuys authored
Change-Id: I87f5ff47daeb64412ff877038619d6cdf5e6ec92
-
Han-Wen Nienhuys authored
Document MvChild failure condition. Change-Id: I928335eb79c73bdedb14c9f7544c3b15e3862af8
-
- 11 Dec, 2019 2 commits
-
-
Han-Wen Nienhuys authored
Change-Id: I15d31de59b4c34caff132bdc7d09ad520d0e68cb
-
Han-Wen Nienhuys authored
Change-Id: I3bce0eee02e0f8d1a2d02c4a4f065bb023179ab1
-
- 10 Dec, 2019 2 commits
-
-
Han-Wen Nienhuys authored
Any subsequent attempt to remove the mountdir will fail if the unmount does not succeed. Use syscall.Rmdir rather than os.Remove. We know the mount point is a directory, and Go's cleverness can only complicate matters here. Change-Id: I62cfad63f34af17b78c3184884a2972673f631a3
-
Han-Wen Nienhuys authored
Change-Id: I4d77ac9194ca9caedf7b0418386e22ae57b90b9b
-
- 09 Dec, 2019 3 commits
-
-
Han-Wen Nienhuys authored
In TestBridgeReaddirPlusVirtualEntries we test that "." comes first, and then "..". This ordering is not reliable. On 4.19.67-2rodete2-amd64, I see ".." before "." Adapt the test to accept either ordering. Change-Id: Ifc003dca6c2b19d9df3045ac30569ee27f78fc52
-
Han-Wen Nienhuys authored
Change-Id: I59a1f187ff4c88bcefdb1e70c6461ca4b2a79c3b
-
Jakob Unterwurzacher authored
After running the test suite, `df` used to report this: df: /tmp/TestReaddirTypeFixup090721515: Transport endpoint is not connected To catch problems like this earlier, testMount() now reports failures to umount cleanly, and catches the problem with TestReaddirTypeFixup: $ go test ./fs -run TestReaddirTypeFixup [...] mem_test.go:37: testMount: Unmount failed: /usr/bin/fusermount: failed to unmount /tmp/TestReaddirTypeFixup175482633: Device or resource busy TestReaddirTypeFixup was missing ds.Close(), which was also added, tests pass now and don't leave broken mounts behind. Change-Id: Ib5d96c8531b11080cf8da526b917446388537956
-
- 08 Dec, 2019 1 commit
-
-
Jakob Unterwurzacher authored
Tests that openat(2) works as expected when the parent directory is renamed (it does). Originally written to get a FUSE log about what happens when userspace calls openat, but it might make sense to just keep it as a test. Change-Id: I3fac815a7c0f713b4f859f6876d60380df9bc953
-
- 04 Dec, 2019 1 commit
-
-
Jakob Unterwurzacher authored
I have suddenly seen TestTypeChange hang forever, waiting for the FORGET that never arrives. The first concern was that the assumption that the FORGET always follows the delete was wrong. Checking the kernel source code, the FORGET should really, actually always follow the delete. Looking more closely on the debug trace showed this: LOOKUP i1 [".Trash-1026"] 12b OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} This is the desktop environment looking for the trash folder. And because the test is stupid, it returned the same dummy inode i1234. This means the kernel had one extra reference to this inode and, of course, did not send a FORGET when "file" was deleted. I made testTypeChangeIno only react to expected file names now, and added a log output should we wait more than ~5 seconds for the FORGET. The log message then repeats indefinitely every 5 seconds. ~/go/src/github.com/hanwen/go-fuse/fs$ go test -v -run TestTypeChange === RUN TestTypeChange 20:50:18.491584 rx 2: INIT i0 {7.31 Ra 0x20000 CACHE_SYMLINKS,POSIX_LOCKS,SPLICE_MOVE,SPLICE_READ,READDIRPLUS,READDIRPLUS_AUTO,PARALLEL_DIROPS,ABORT_ERROR,EXPLICIT_INVAL_DATA,ASYNC_READ,EXPORT_SUPPORT,DONT_MASK,NO_OPENDIR_SUPPORT,SPLICE_WRITE,FLOCK_LOCKS,AUTO_INVAL_DATA,HANDLE_KILLPRIV,MAX_PAGES,POSIX_ACL,ATOMIC_O_TRUNC,BIG_WRITES,IOCTL_DIR,ASYNC_DIO,WRITEBACK_CACHE,NO_OPEN_SUPPORT} 20:50:18.491728 tx 2: OK, {7.28 Ra 0x20000 NO_OPEN_SUPPORT,BIG_WRITES,PARALLEL_DIROPS,READDIRPLUS,ASYNC_READ,AUTO_INVAL_DATA 0/0 Wr 0x10000 Tg 0x0} 20:50:18.491857 rx 4: ACCESS i1 {u=1026 g=1026 r} 20:50:18.491873 tx 4: OK 20:50:18.492028 rx 6: LOOKUP i1 [".go-fuse-epoll-hack"] 20b 20:50:18.492110 tx 6: 2=no such file or directory, {i0 g0 tE=0s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492147 rx 8: CREATE i1 {0100100 [TRUNC,WRONLY,CREAT,0x8000] (00)} [".go-fuse-epoll-hack"] 20b 20:50:18.492207 tx 8: OK, {i18446744073709551615 g0 {M0100644 SZ=0 L=1 0:0 B0*0 i0:18446744073709551615 A 0.000000 M 0.000000 C 0.000000} &{18446744073709551615 0 0}} 20:50:18.492291 rx 10: LOOKUP i1 [".Trash"] 7b 20:50:18.492340 tx 10: OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492354 rx 12: POLL i18446744073709551615 20:50:18.492359 tx 12: 38=function not implemented 20:50:18.492370 rx 14: LOOKUP i1 [".go-fuse-epoll-hack"] 20b 20:50:18.492378 tx 14: 2=no such file or directory, {i0 g0 tE=0s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492389 rx 16: GETATTR i1234 {Fh 0} 20:50:18.492398 tx 16: OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492412 rx 18: FLUSH i18446744073709551615 {Fh 18446744073709551615} 20:50:18.492417 tx 18: 5=input/output error 20:50:18.492427 rx 20: LOOKUP i1 [".go-fuse-epoll-hack"] 20b 20:50:18.492435 tx 20: 2=no such file or directory, {i0 g0 tE=0s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492450 rx 22: RELEASE i18446744073709551615 {Fh 18446744073709551615 WRONLY,0x8000 L0} 20:50:18.492456 tx 22: 5=input/output error 20:50:18.492469 rx 24: LOOKUP i1 ["file"] 5b 20:50:18.492477 tx 24: OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492489 rx 26: LOOKUP i1 [".Trash-1026"] 12b 20:50:18.492497 tx 26: OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492506 rx 28: GETATTR i1234 {Fh 0} 20:50:18.492513 tx 28: OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492521 rx 30: GETATTR i1234 {Fh 0} 20:50:18.492528 tx 30: OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492537 rx 32: LOOKUP i1 ["file"] 5b 20:50:18.492545 tx 32: OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 20:50:18.492555 rx 34: FORGET i18446744073709551615 {Nlookup=1} 20:50:18.492575 rx 36: UNLINK i1 ["file"] 5b 20:50:18.492588 tx 36: OK 20:50:18.492621 rx 38: LOOKUP i1 ["dir"] 4b [hangs here] Change-Id: Ibee48faf09c5a8993dfc7bb75251551f699cd63e
-
- 03 Dec, 2019 2 commits
-
-
Han-Wen Nienhuys authored
Options.ServerCallbacks can set the callbacks used when not mounting the filesystem. Change-Id: I51bf875a816c23e587ec8b575110221bdfcdaffe
-
Han-Wen Nienhuys authored
This provides more fidelity for reproducing file system behavior. Case in point, it lets us rename a directory on top of an existing directory Fixes #55. Change-Id: I82572aae32ee225b1629303c448a09f1066eb4ed
-
- 26 Nov, 2019 2 commits
-
-
Jakob Unterwurzacher authored
ListXAttr called with an empty buffer returns the current size of the list but does not touch the buffer (see man 2 listxattr). Fixes the xfstests generic/020 crash. Fixes https://github.com/hanwen/go-fuse/issues/337 . Add test Co-authored-by: Han-Wen Nienhuys <hanwen@google.com> Change-Id: I94c94bc56fdf506d2eb924b246336b787fa2976a
-
Jakob Unterwurzacher authored
The tests sometimes hang in a way that "go test -timeout" does not work anymore. Example: https://travis-ci.org/hanwen/go-fuse/jobs/609260654 Use the external "timeout" command as backup, triggering 1 minute later. Also, the test that seems to hang is "fs", run it alone first in the hope of getting more info. Add "set -e" so executing stops if the first step fails ( https://github.com/travis-ci/travis-ci/issues/1066 ) Also add "-failfast" to "go test" so the failures are not buried in later output. All failure modes are easier to analyze now in my opinion, as you just have to scroll to the bottom to see what is going on. Examples: * https://travis-ci.com/rfjakob/go-fuse/jobs/254766675 TestStatFs failure due to non-deterministic test, stopped by -failfast) * https://travis-ci.com/rfjakob/go-fuse/jobs/254766676 Hang in TestParallelDiropsHang, stopped by -timeout, backtrace available * https://travis-ci.com/rfjakob/go-fuse/jobs/254766677 Hang somewhere in "go test ./...", killed by "timeout -k 10". No backtrace, unfortunately, but at least it took 6 minutes instead of 10. Change-Id: I8069d22863c178b5c9c4d0c40f13dccfdfd0873d
-
- 25 Nov, 2019 2 commits
-
-
Jakob Unterwurzacher authored
When a inode is deleted and recreated, the inode number may be reused, and it may appear that it has changed type. A simple solution is to wait for the FORGET that *always* follows the deletion. This is what this patch does. Makes fsstress happy (tested with fsstress-loopback.bash from gocryptfs, which is similar to xfstests generic/013). Also fixes the test that was introduced in the last commit (TestTypeChange). fsstress-loopback.bash before: ~/go/src/github.com/rfjakob/gocryptfs/tests/stress_tests$ ./fsstress-loopback.bash Recompile go-fuse loopback Waiting for mount: ok Starting fsstress loop 1 fsstress.1 seed = 1572931176 fsstress.2 seed = 1572919573 fsstress.3 seed = 1573005097 rm rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.2/p4/d1XXXX': Is a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.2/p6/d0/d44XXXXXXXXXXXX/d4cXXXX': Is a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p1/d11/d124/d12f/d154/d15a/d143/df1/d100/d135/d123/d3a': Is a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p1/d11/f22': Not a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p3/d0/d7e/d4b/d102/d157/d134/d12f/d14b/d17a/d130': Is a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p3/d0/d7e/d4b/d102/d157/d158/df2/ff5': Not a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p3/d0/d1c': Is a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p0/d0/d4': Is a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p2/d6/dfd/da6/df2/d124/dea/d100/d120/d131/d13e/d13b/d149/d13a/f9c': Not a directory rm: cannot remove '/var/tmp/fsstress-loopback.bash.qgK.mnt/fsstress.3/p2/d6/dfd/da6/df2/d124/dea/dd5/dfa/d127/d129/d14a/d117/d14c/d82': Is a directory ./fsstress-loopback.bash: line 1: kill: %1: no such job After (with typechangeDebug = true): $ ./fsstress-loopback.bash Recompile go-fuse loopback Waiting for mount: ok Starting fsstress loop 1 fsstress.1 seed = 1574198874 fsstress.2 seed = 1574016238 17:51:25.770396 Ino:13634604 typechange 0x8000 -> 0xa000, sleep=0s 17:51:25.890382 Ino:13899580 typechange 0xa000 -> 0x8000, sleep=0s 17:51:25.890400 Ino:13899580 typechange 0xa000 -> 0x8000, sleep=1µs 17:51:25.890412 Ino:13899580 typechange 0xa000 -> 0x8000, sleep=1.41µs fsstress.3 seed = 1574847533 17:51:27.472057 Ino:14158985 typechange 0x4000 -> 0x8000, sleep=0s 17:51:27.472070 Ino:14158985 typechange 0x4000 -> 0x8000, sleep=1µs 17:51:27.472304 Ino:14158985 typechange 0x8000 -> 0x4000, sleep=0s 17:51:27.478628 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=0s 17:51:27.478640 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=1µs 17:51:27.478700 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=1.051µs 17:51:27.478747 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=1.817µs 17:51:27.478796 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=3.18µs 17:51:27.478840 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=5.718µs 17:51:27.478884 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=8.396µs 17:51:27.478976 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=10.784µs 17:51:27.479024 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=13.017µs 17:51:27.479067 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=16.065µs 17:51:27.479108 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=19.767µs 17:51:27.479145 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=27.427µs 17:51:27.479240 Ino:14159000 typechange 0x8000 -> 0x4000, sleep=36.272µs 17:51:27.500756 Ino:14291431 typechange 0x4000 -> 0x8000, sleep=0s 17:51:27.500770 Ino:14291431 typechange 0x4000 -> 0x8000, sleep=1µs 17:51:27.500779 Ino:14291431 typechange 0x4000 -> 0x8000, sleep=1.873µs 17:51:27.521194 Ino:14291506 typechange 0x4000 -> 0x8000, sleep=0s 17:51:27.521207 Ino:14291506 typechange 0x4000 -> 0x8000, sleep=1µs rm 2 fsstress.1 seed = 1574600636 fsstress.2 seed = 1574203490 17:51:29.009666 Ino:12209562 typechange 0x4000 -> 0xa000, sleep=0s 17:51:29.010068 Ino:12209562 typechange 0x4000 -> 0xa000, sleep=1µs 17:51:29.010078 Ino:12209562 typechange 0x4000 -> 0xa000, sleep=1.79µs 17:51:29.010179 Ino:12209562 typechange 0x4000 -> 0xa000, sleep=3.331µs 17:51:29.010255 Ino:12209562 typechange 0x4000 -> 0xa000, sleep=4.537µs 17:51:29.010364 Ino:12209562 typechange 0x4000 -> 0xa000, sleep=8.354µs 17:51:29.010416 Ino:12209562 typechange 0x4000 -> 0xa000, sleep=8.897µs fsstress.3 seed = 1573917850 17:51:33.623359 Ino:14291439 typechange 0x8000 -> 0x4000, sleep=0s 17:51:33.623378 Ino:14291439 typechange 0x8000 -> 0x4000, sleep=1µs 17:51:33.623392 Ino:14291439 typechange 0x8000 -> 0x4000, sleep=1.378µs 17:51:33.644130 Ino:14291494 typechange 0x8000 -> 0x4000, sleep=0s 17:51:33.644151 Ino:14291494 typechange 0x8000 -> 0x4000, sleep=1µs 17:51:33.644159 Ino:14291494 typechange 0x8000 -> 0x4000, sleep=1.072µs 17:51:33.654370 Ino:14291501 typechange 0x8000 -> 0x4000, sleep=0s 17:51:33.654384 Ino:14291501 typechange 0x8000 -> 0x4000, sleep=1µs 17:51:33.654393 Ino:14291501 typechange 0x8000 -> 0x4000, sleep=1.588µs 17:51:33.654399 Ino:14291501 typechange 0x8000 -> 0x4000, sleep=2.639µs 17:51:33.655098 Ino:14291476 typechange 0x4000 -> 0x8000, sleep=0s 17:51:33.667216 Ino:14291504 typechange 0x4000 -> 0x8000, sleep=0s 17:51:33.667228 Ino:14291504 typechange 0x4000 -> 0x8000, sleep=1µs 17:51:33.667236 Ino:14291504 typechange 0x4000 -> 0x8000, sleep=1.443µs 17:51:33.667242 Ino:14291504 typechange 0x4000 -> 0x8000, sleep=2.286µs rm 3 fsstress.1 seed = 1574749722 fsstress.2 seed = 1574328972 17:51:35.220180 Ino:13771167 typechange 0x8000 -> 0xa000, sleep=0s 17:51:35.220205 Ino:13771167 typechange 0x8000 -> 0xa000, sleep=1µs 17:51:35.514144 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=0s 17:51:35.514165 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=1µs 17:51:35.514172 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=1.739µs 17:51:35.515875 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=1.969µs 17:51:35.516021 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=3.744µs 17:51:35.516094 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=4.308µs 17:51:35.516514 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=5.112µs 17:51:35.516765 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=5.299µs 17:51:35.516870 Ino:13771355 typechange 0x4000 -> 0xa000, sleep=8.169µs 17:51:36.429950 Ino:13771381 typechange 0x8000 -> 0xa000, sleep=0s 17:51:36.430068 Ino:13771381 typechange 0x8000 -> 0xa000, sleep=1µs 17:51:36.430082 Ino:13771381 typechange 0x8000 -> 0xa000, sleep=1.071µs 17:51:36.547108 Ino:13899567 typechange 0x8000 -> 0x4000, sleep=0s 17:51:36.547121 Ino:13899567 typechange 0x8000 -> 0x4000, sleep=1µs 17:51:36.547158 Ino:13899567 typechange 0x8000 -> 0x4000, sleep=1.907µs 17:51:36.547181 Ino:13899567 typechange 0x8000 -> 0x4000, sleep=2.358µs 17:51:38.112588 Ino:13771503 typechange 0x8000 -> 0xa000, sleep=0s 17:51:38.112602 Ino:13771503 typechange 0x8000 -> 0xa000, sleep=1µs 17:51:38.112611 Ino:13771503 typechange 0x8000 -> 0xa000, sleep=1.11µs 17:51:38.524020 Ino:13899675 typechange 0xa000 -> 0x8000, sleep=0s 17:51:38.524042 Ino:13899675 typechange 0xa000 -> 0x8000, sleep=1µs Change-Id: I6120ce76730018d22898127290f492fa9f85a957
-
Jakob Unterwurzacher authored
TestTypeChange simulates inode number reuse that happens on real filesystems. For go-fuse, inode number reuse can look like a file changing to a directory or vice versa. Acutally, the old inode does not exist anymore, we just have not received the FORGET yet. The test fails reliably with iteration count 100. Will be fixed in the next commit. Test failure looks like this: ~/go/src/github.com/hanwen/go-fuse/fs$ go test -run TestTypeChange -v === RUN TestTypeChange 21:43:36.065494 rx 2: INIT i0 {7.31 Ra 0x20000 MAX_PAGES,SPLICE_READ,FLOCK_LOCKS,READDIRPLUS,READDIRPLUS_AUTO,ASYNC_DIO,WRITEBACK_CACHE,HANDLE_KILLPRIV,SPLICE_WRITE,PARALLEL_DIROPS,ABORT_ERROR,EXPLICIT_INVAL_DATA,NO_OPENDIR_SUPPORT,ASYNC_READ,BIG_WRITES,DONT_MASK,IOCTL_DIR,AUTO_INVAL_DATA,POSIX_ACL,CACHE_SYMLINKS,POSIX_LOCKS,ATOMIC_O_TRUNC,EXPORT_SUPPORT,SPLICE_MOVE,NO_OPEN_SUPPORT} 21:43:36.065573 tx 2: OK, {7.28 Ra 0x20000 PARALLEL_DIROPS,AUTO_INVAL_DATA,ASYNC_READ,BIG_WRITES,NO_OPEN_SUPPORT,READDIRPLUS 0/0 Wr 0x10000 Tg 0x0} 21:43:36.065742 rx 4: LOOKUP i1 [".go-fuse-epoll-hack"] 20b 21:43:36.065798 tx 4: 2=no such file or directory, {i0 g0 tE=0s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}} 21:43:36.065837 rx 6: CREATE i1 {0100100 [WRONLY,CREAT,TRUNC,0x8000] (00)} [".go-fuse-epoll-hack"] 20b 21:43:36.065861 tx 6: OK, {i18446744073709551615 g0 {M0100644 SZ=0 L=1 0:0 B0*0 i0:18446744073709551615 A 0.000000 M 0.000000 C 0.000000} &{18446744073709551615 0 0}} 21:43:36.065945 rx 8: POLL i18446744073709551615 21:43:36.065954 tx 8: 38=function not implemented 21:43:36.066009 rx 10: FLUSH i18446744073709551615 {Fh 18446744073709551615} 21:43:36.066046 tx 10: 5=input/output error 21:43:36.066065 rx 12: RELEASE i18446744073709551615 {Fh 18446744073709551615 WRONLY,0x8000 L0} 21:43:36.066071 tx 12: 5=input/output error 21:43:36.066107 rx 14: LOOKUP i1 ["file"] 5b 21:43:36.066181 tx 14: OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 21:43:36.066217 rx 16: GETATTR i1234 {Fh 0} 21:43:36.066240 tx 16: OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 21:43:36.066264 rx 18: LOOKUP i1 ["file"] 5b 21:43:36.066285 tx 18: OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 21:43:36.066301 rx 20: UNLINK i1 ["file"] 5b 21:43:36.066321 tx 20: OK 21:43:36.066361 rx 24: LOOKUP i1 ["dir"] 4b 21:43:36.066371 tx 24: OK, {i1234 g0 tE=0s tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 21:43:36.066383 rx 22: FORGET i1234 {Nlookup=2} 21:43:36.066390 rx 26: GETATTR i1234 {Fh 0} 21:43:36.068259 tx 26: OK, {tA=0s {M0100644 SZ=0 L=0 0:0 B0*4096 i0:1234 A 0.000000 M 0.000000 C 0.000000}} 21:43:36.069664 received ENODEV (unmount request), thread exiting 21:43:36.073309 received ENODEV (unmount request), thread exiting 21:43:36.073396 received ENODEV (unmount request), thread exiting --- FAIL: TestTypeChange (0.01s) bridge_test.go:96: should be a dir now FAIL exit status 1 FAIL github.com/hanwen/go-fuse/v2/fs 0.017s Change-Id: I7a1a10303ecc0a8c008d29d5d81079868fc2cc43
-