summaryrefslogtreecommitdiff
path: root/internal/syscallcompat
diff options
context:
space:
mode:
authorJakob Unterwurzacher2018-07-15 14:14:12 +0200
committerJakob Unterwurzacher2018-07-15 15:12:55 +0200
commitc70df522d2a78f3152fa61511bed9fafa7c495a3 (patch)
tree0ce081f2454a8e6da923355d11e5ed832ad7e302 /internal/syscallcompat
parent55bb22bad6c196f363ad27fbedad4f5360c4879f (diff)
fusefrontend: doWrite: delete file header if first write fails
xfstests generic/083 fills the filesystem almost completely while running fsstress in parallel. In fsck, these would show up: readFileID 2580: incomplete file, got 18 instead of 19 bytes This could happen when writing the file header works, but writing the actual data fails. Now we kill the header again by truncating the file to zero.
Diffstat (limited to 'internal/syscallcompat')
-rw-r--r--internal/syscallcompat/helpers.go21
1 files changed, 21 insertions, 0 deletions
diff --git a/internal/syscallcompat/helpers.go b/internal/syscallcompat/helpers.go
new file mode 100644
index 0000000..e2a2215
--- /dev/null
+++ b/internal/syscallcompat/helpers.go
@@ -0,0 +1,21 @@
+package syscallcompat
+
+import (
+ "os"
+ "syscall"
+)
+
+// IsENOSPC tries to find out if "err" is a (potentially wrapped) ENOSPC error.
+func IsENOSPC(err error) bool {
+ // syscallcompat.EnospcPrealloc returns the naked syscall error
+ if err == syscall.ENOSPC {
+ return true
+ }
+ // os.File.WriteAt returns &PathError
+ if err2, ok := err.(*os.PathError); ok {
+ if err2.Err == syscall.ENOSPC {
+ return true
+ }
+ }
+ return false
+}