summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/syscallcompat/quirks.go2
-rw-r--r--internal/syscallcompat/quirks_linux.go4
-rw-r--r--tests/root_test/root_test.go31
3 files changed, 37 insertions, 0 deletions
diff --git a/internal/syscallcompat/quirks.go b/internal/syscallcompat/quirks.go
index 110c00d..858f16d 100644
--- a/internal/syscallcompat/quirks.go
+++ b/internal/syscallcompat/quirks.go
@@ -13,6 +13,8 @@ const (
// On MacOS ExFAT, all empty files share inode number 1:
// https://github.com/rfjakob/gocryptfs/issues/585
QuirkDuplicateIno1
+ // QuirkNoUserXattr means that user.* xattrs are not supported
+ QuirkNoUserXattr
)
func logQuirk(s string) {
diff --git a/internal/syscallcompat/quirks_linux.go b/internal/syscallcompat/quirks_linux.go
index bcdcf07..5ef2d8a 100644
--- a/internal/syscallcompat/quirks_linux.go
+++ b/internal/syscallcompat/quirks_linux.go
@@ -27,5 +27,9 @@ func DetectQuirks(cipherdir string) (q uint64) {
q |= QuirkBrokenFalloc
}
+ if uint32(st.Type) == unix.TMPFS_MAGIC {
+ logQuirk("tmpfs detected, no extended attributes except acls will work.")
+ }
+
return q
}
diff --git a/tests/root_test/root_test.go b/tests/root_test/root_test.go
index fe38cfa..462aaeb 100644
--- a/tests/root_test/root_test.go
+++ b/tests/root_test/root_test.go
@@ -362,3 +362,34 @@ func TestBtrfsQuirks(t *testing.T) {
t.Errorf("wrong quirk: %v", quirk)
}
}
+
+func TestOverlay(t *testing.T) {
+ if os.Getuid() != 0 {
+ t.Skip("must run as root")
+ }
+ cDir := test_helpers.InitFS(t)
+ if syscallcompat.DetectQuirks(cDir)|syscallcompat.QuirkNoUserXattr != 0 {
+ t.Logf("No user xattrs! overlay mount will likely fail.")
+ }
+ os.Chmod(cDir, 0755)
+ pDir := cDir + ".mnt"
+ test_helpers.MountOrFatal(t, cDir, pDir, "-allow_other", "-extpass=echo test")
+ defer test_helpers.UnmountPanic(pDir)
+
+ for _, d := range []string{"lower", "upper", "work", "merged"} {
+ err := os.Mkdir(pDir+"/"+d, 0700)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+ ovlMnt := pDir + "/merged"
+ cmd := exec.Command("mount", "-t", "overlay", "overlay",
+ "-o", "lowerdir="+pDir+"/lower,upperdir="+pDir+"/upper,workdir="+pDir+"/work",
+ ovlMnt)
+ out, err := cmd.CombinedOutput()
+ if err != nil {
+ t.Log(string(out))
+ t.Fatal(err)
+ }
+ defer syscall.Unmount(ovlMnt, 0)
+}