diff options
| author | Jakob Unterwurzacher | 2026-02-02 22:18:25 +0100 |
|---|---|---|
| committer | Jakob Unterwurzacher | 2026-02-03 20:28:10 +0100 |
| commit | 14045511d3d91f36845a138359718c0fe7dff21c (patch) | |
| tree | 66bcc155f68e7c284a2179a0ff582e06e001209c /internal/fusefrontend_reverse/node_xattr.go | |
| parent | 6ac778beb0c962e0c2413c1bd91595a9bbccd25b (diff) | |
Use user-provided Listxattr buffer sizexattr_user_buffer
This huge buffer showed up big time in ./profiling/ls.bash
and caused a 2x LS benchmark slowdown.
Instead of the fixed-size buffer, use the buffer size
hint the user has provided us.
We return inaccurate (larger than actual, which should be safe)
numbers when the user has provided no buffer (size probe).
Diffstat (limited to 'internal/fusefrontend_reverse/node_xattr.go')
| -rw-r--r-- | internal/fusefrontend_reverse/node_xattr.go | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/internal/fusefrontend_reverse/node_xattr.go b/internal/fusefrontend_reverse/node_xattr.go index f22764a..9e99cfa 100644 --- a/internal/fusefrontend_reverse/node_xattr.go +++ b/internal/fusefrontend_reverse/node_xattr.go @@ -7,6 +7,7 @@ import ( "syscall" "github.com/rfjakob/gocryptfs/v2/internal/pathiv" + "github.com/rfjakob/gocryptfs/v2/internal/syscallcompat" ) // We store encrypted xattrs under this prefix plus the base64-encoded @@ -65,10 +66,18 @@ func (n *Node) Listxattr(ctx context.Context, dest []byte) (uint32, syscall.Errn if rn.args.NoXattr { return 0, 0 } - pNames, errno := n.listXAttr() + // Can use dest as a temporary buffer + sz, errno := n.listXAttr(dest) if errno != 0 { return 0, errno } + // If dest empty, return the required size + if len(dest) == 0 { + // Asssume ciphertext expansion by a factor of 2 + // TODO: double-check max expansion factor + return uint32(sz * 2), 0 + } + pNames := syscallcompat.ParseListxattrBlob(dest[:sz]) var buf bytes.Buffer for _, pName := range pNames { // ACLs are passed through without encryption |
