aboutsummaryrefslogtreecommitdiff
path: root/internal/fusefrontend/node_xattr_linux.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2026-02-02 22:18:25 +0100
committerJakob Unterwurzacher2026-02-03 20:28:10 +0100
commit14045511d3d91f36845a138359718c0fe7dff21c (patch)
tree66bcc155f68e7c284a2179a0ff582e06e001209c /internal/fusefrontend/node_xattr_linux.go
parent6ac778beb0c962e0c2413c1bd91595a9bbccd25b (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/node_xattr_linux.go')
-rw-r--r--internal/fusefrontend/node_xattr_linux.go9
1 files changed, 3 insertions, 6 deletions
diff --git a/internal/fusefrontend/node_xattr_linux.go b/internal/fusefrontend/node_xattr_linux.go
index 9964212..d1747e8 100644
--- a/internal/fusefrontend/node_xattr_linux.go
+++ b/internal/fusefrontend/node_xattr_linux.go
@@ -57,7 +57,7 @@ func (n *Node) removeXAttr(cAttr string) (errno syscall.Errno) {
return fs.ToErrno(unix.Lremovexattr(procPath, cAttr))
}
-func (n *Node) listXAttr() (out []string, errno syscall.Errno) {
+func (n *Node) listXAttr(buf []byte) (sz int, errno syscall.Errno) {
dirfd, cName, errno := n.prepareAtSyscallMyself()
if errno != 0 {
return
@@ -65,9 +65,6 @@ func (n *Node) listXAttr() (out []string, errno syscall.Errno) {
defer syscall.Close(dirfd)
procPath := fmt.Sprintf("/proc/self/fd/%d/%s", dirfd, cName)
- cNames, err := syscallcompat.Llistxattr(procPath)
- if err != nil {
- return nil, fs.ToErrno(err)
- }
- return cNames, 0
+ sz, err := unix.Llistxattr(procPath, buf)
+ return sz, fs.ToErrno(err)
}