From f32142f6f5ef42b1b70a2f2b207f6982b7f8c58f Mon Sep 17 00:00:00 2001 From: ningfd Date: Mon, 6 Jun 2022 11:27:12 +0800 Subject: [PATCH] add disableXAttr in mount option --- weed/command/mount.go | 2 ++ weed/command/mount_std.go | 3 ++- weed/mount/weedfs.go | 1 + weed/mount/weedfs_xattr.go | 18 ++++++++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/weed/command/mount.go b/weed/command/mount.go index 2569bc3dc..0e32a53e8 100644 --- a/weed/command/mount.go +++ b/weed/command/mount.go @@ -30,6 +30,7 @@ type MountOptions struct { debug *bool debugPort *int localSocket *string + disableXAttr *bool } var ( @@ -65,6 +66,7 @@ func init() { mountOptions.debug = cmdMount.Flag.Bool("debug", false, "serves runtime profiling data, e.g., http://localhost:/debug/pprof/goroutine?debug=2") mountOptions.debugPort = cmdMount.Flag.Int("debug.port", 6061, "http port for debugging") mountOptions.localSocket = cmdMount.Flag.String("localSocket", "", "default to /tmp/seaweedfs-mount-.sock") + mountOptions.disableXAttr = cmdMount.Flag.Bool("disableXAttr", false, "disable xattr") mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file") mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file") diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 1d929dc96..1aff3c5bb 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -175,7 +175,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { FsName: serverFriendlyName + ":" + filerMountRootPath, Name: "seaweedfs", SingleThreaded: false, - DisableXAttrs: false, + DisableXAttrs: *option.disableXAttr, Debug: *option.debug, EnableLocks: false, ExplicitDataCacheControl: false, @@ -238,6 +238,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { VolumeServerAccess: *mountOptions.volumeServerAccess, Cipher: cipher, UidGidMapper: uidGidMapper, + DisableXAttr: *option.disableXAttr, }) server, err := fuse.NewServer(seaweedFileSystem, dir, fuseMountOptions) diff --git a/weed/mount/weedfs.go b/weed/mount/weedfs.go index 6437499bf..584174202 100644 --- a/weed/mount/weedfs.go +++ b/weed/mount/weedfs.go @@ -40,6 +40,7 @@ type Option struct { DataCenter string Umask os.FileMode Quota int64 + DisableXAttr bool MountUid uint32 MountGid uint32 diff --git a/weed/mount/weedfs_xattr.go b/weed/mount/weedfs_xattr.go index 2fb2b0741..64cc0f6f0 100644 --- a/weed/mount/weedfs_xattr.go +++ b/weed/mount/weedfs_xattr.go @@ -20,6 +20,10 @@ const ( // with the required buffer size. func (wfs *WFS) GetXAttr(cancel <-chan struct{}, header *fuse.InHeader, attr string, dest []byte) (size uint32, code fuse.Status) { + if wfs.option.DisableXAttr { + return 0, fuse.Status(syscall.ENOTSUP) + } + //validate attr name if len(attr) > MAX_XATTR_NAME_SIZE { if runtime.GOOS == "darwin" { @@ -70,6 +74,10 @@ func (wfs *WFS) GetXAttr(cancel <-chan struct{}, header *fuse.InHeader, attr str // attribute does not already exist. func (wfs *WFS) SetXAttr(cancel <-chan struct{}, input *fuse.SetXAttrIn, attr string, data []byte) fuse.Status { + if wfs.option.DisableXAttr { + return fuse.Status(syscall.ENOTSUP) + } + if wfs.IsOverQuota { return fuse.Status(syscall.ENOSPC) } @@ -127,6 +135,11 @@ func (wfs *WFS) SetXAttr(cancel <-chan struct{}, input *fuse.SetXAttrIn, attr st // slice, and return the number of bytes. If the buffer is too // small, return ERANGE, with the required buffer size. func (wfs *WFS) ListXAttr(cancel <-chan struct{}, header *fuse.InHeader, dest []byte) (n uint32, code fuse.Status) { + + if wfs.option.DisableXAttr { + return 0, fuse.Status(syscall.ENOTSUP) + } + _, _, entry, status := wfs.maybeReadEntry(header.NodeId) if status != fuse.OK { return 0, status @@ -156,6 +169,11 @@ func (wfs *WFS) ListXAttr(cancel <-chan struct{}, header *fuse.InHeader, dest [] // RemoveXAttr removes an extended attribute. func (wfs *WFS) RemoveXAttr(cancel <-chan struct{}, header *fuse.InHeader, attr string) fuse.Status { + + if wfs.option.DisableXAttr { + return fuse.Status(syscall.ENOTSUP) + } + if len(attr) == 0 { return fuse.EINVAL }