diff --git a/go.mod b/go.mod index 6b5e3a2fd..2802a9e18 100644 --- a/go.mod +++ b/go.mod @@ -148,7 +148,7 @@ require ( github.com/rdleal/intervalst v1.5.0 github.com/redis/go-redis/v9 v9.21.0 github.com/schollz/progressbar/v3 v3.19.1 - github.com/seaweedfs/go-fuse/v2 v2.9.3 + github.com/seaweedfs/go-fuse/v2 v2.9.4-0.20260803074752-bd46d45ccb3b github.com/shirou/gopsutil/v4 v4.26.6 github.com/tarantool/go-option v1.1.0 github.com/tarantool/go-tarantool/v3 v3.0.0 diff --git a/go.sum b/go.sum index a2f0226dc..f75ec7bfb 100644 --- a/go.sum +++ b/go.sum @@ -1810,6 +1810,10 @@ github.com/seaweedfs/cockroachdb-parser v0.0.0-20260225204133-2f342c5ea564 h1:Tg github.com/seaweedfs/cockroachdb-parser v0.0.0-20260225204133-2f342c5ea564/go.mod h1:JSKCh6uCHBz91lQYFYHCyTrSVIPge4SUFVn28iwMNB0= github.com/seaweedfs/go-fuse/v2 v2.9.3 h1:rJufGrHImTx7yoGUmetUi+To4LrmTQJROJnBHWt92ic= github.com/seaweedfs/go-fuse/v2 v2.9.3/go.mod h1:zABdmWEa6A0bwaBeEOBUeUkGIZlxUhcdv+V1Dcc/U/I= +github.com/seaweedfs/go-fuse/v2 v2.9.4-0.20260803073934-cb95bfebced6 h1:Kn79NPV77uc3bEat4RWi6vpNYNacYfjXcWBLNv3RZ2A= +github.com/seaweedfs/go-fuse/v2 v2.9.4-0.20260803073934-cb95bfebced6/go.mod h1:zABdmWEa6A0bwaBeEOBUeUkGIZlxUhcdv+V1Dcc/U/I= +github.com/seaweedfs/go-fuse/v2 v2.9.4-0.20260803074752-bd46d45ccb3b h1:ECjScJHzIATk8CTdlP+yfPY4W5bLxeoy1Mma8rd0dRA= +github.com/seaweedfs/go-fuse/v2 v2.9.4-0.20260803074752-bd46d45ccb3b/go.mod h1:zABdmWEa6A0bwaBeEOBUeUkGIZlxUhcdv+V1Dcc/U/I= github.com/seaweedfs/goexif v1.0.3 h1:ve/OjI7dxPW8X9YQsv3JuVMaxEyF9Rvfd04ouL+Bz30= github.com/seaweedfs/goexif v1.0.3/go.mod h1:Oni780Z236sXpIQzk1XoJlTwqrJ02smEin9zQeff7Fk= github.com/seaweedfs/raft v1.2.0 h1:Ez4Hw9ifBbTT7wg54DvGHBjw1vRlTb4roH0TKl0Oj9Y= diff --git a/weed/mount/posix_file_lock.go b/weed/mount/posix_file_lock.go index abe5f6fd9..425083f5e 100644 --- a/weed/mount/posix_file_lock.go +++ b/weed/mount/posix_file_lock.go @@ -4,7 +4,6 @@ import ( "math" "sort" "sync" - "syscall" "github.com/seaweedfs/go-fuse/v2/fuse" ) @@ -13,7 +12,7 @@ import ( type lockRange struct { Start uint64 // inclusive byte offset End uint64 // inclusive; math.MaxUint64 means "to EOF" - Typ uint32 // syscall.F_RDLCK or syscall.F_WRLCK + Typ uint32 // f_RDLCK or f_WRLCK Owner uint64 // FUSE lock owner (from LkIn.Owner) Pid uint32 // PID of lock holder (for GetLk reporting) // flock and fcntl locks have different ownership and close semantics. @@ -127,7 +126,7 @@ func findConflict(locks []lockRange, proposed lockRange) (lockRange, bool) { if !rangesOverlap(h.Start, h.End, proposed.Start, proposed.End) { continue } - if h.Typ == syscall.F_RDLCK && proposed.Typ == syscall.F_RDLCK { + if h.Typ == f_RDLCK && proposed.Typ == f_RDLCK { continue } return h, true @@ -304,7 +303,7 @@ func (plt *PosixLockTable) GetLk(inode uint64, proposed lockRange, out *fuse.LkO for { il := plt.getInodeLocks(inode) if il == nil { - out.Lk.Typ = syscall.F_UNLCK + out.Lk.Typ = f_UNLCK return } il.mu.Lock() @@ -324,7 +323,7 @@ func (plt *PosixLockTable) GetLk(inode uint64, proposed lockRange, out *fuse.LkO out.Lk.Typ = conflict.Typ out.Lk.Pid = conflict.Pid } else { - out.Lk.Typ = syscall.F_UNLCK + out.Lk.Typ = f_UNLCK } return } @@ -334,7 +333,7 @@ func (plt *PosixLockTable) GetLk(inode uint64, proposed lockRange, out *fuse.LkO // For unlock (F_UNLCK): removes locks in the given range for the owner. // For lock: returns fuse.EAGAIN if a conflict exists, fuse.OK on success. func (plt *PosixLockTable) SetLk(inode uint64, lk lockRange) fuse.Status { - if lk.Typ == syscall.F_UNLCK { + if lk.Typ == f_UNLCK { il := plt.getInodeLocks(inode) if il == nil { return fuse.OK @@ -376,7 +375,7 @@ func (plt *PosixLockTable) SetLk(inode uint64, lk lockRange) fuse.Status { // SetLkw attempts a blocking lock. It waits until the lock can be acquired // or the cancel channel is closed. func (plt *PosixLockTable) SetLkw(inode uint64, lk lockRange, cancel <-chan struct{}) fuse.Status { - if lk.Typ == syscall.F_UNLCK { + if lk.Typ == f_UNLCK { return plt.SetLk(inode, lk) } diff --git a/weed/mount/syscall_shim_unix.go b/weed/mount/syscall_shim_unix.go new file mode 100644 index 000000000..acb5f1d77 --- /dev/null +++ b/weed/mount/syscall_shim_unix.go @@ -0,0 +1,19 @@ +//go:build !windows + +package mount + +import ( + "syscall" + + sys "golang.org/x/sys/unix" +) + +const ( + f_RDLCK = syscall.F_RDLCK + f_WRLCK = syscall.F_WRLCK + f_UNLCK = syscall.F_UNLCK + o_ACCMODE = syscall.O_ACCMODE + + xattr_CREATE = sys.XATTR_CREATE + xattr_REPLACE = sys.XATTR_REPLACE +) diff --git a/weed/mount/syscall_shim_windows.go b/weed/mount/syscall_shim_windows.go new file mode 100644 index 000000000..aa4e29b53 --- /dev/null +++ b/weed/mount/syscall_shim_windows.go @@ -0,0 +1,14 @@ +package mount + +// Windows has no fcntl lock types and no access-mode mask. The Linux values +// stand in: nothing on Windows feeds these, and the lock table only ever +// compares them against each other. +const ( + f_RDLCK = 0 + f_WRLCK = 1 + f_UNLCK = 2 + o_ACCMODE = 0x3 + + xattr_CREATE = 1 + xattr_REPLACE = 2 +) diff --git a/weed/mount/weedfs_access.go b/weed/mount/weedfs_access.go index 90890d823..27fa83132 100644 --- a/weed/mount/weedfs_access.go +++ b/weed/mount/weedfs_access.go @@ -155,7 +155,7 @@ func checkStickyBit(dirMode, dirUid, targetUid, callerUid uint32) fuse.Status { // openFlagsToAccessMask converts open(2) flags to an access permission mask. func openFlagsToAccessMask(flags uint32) uint32 { - switch flags & uint32(syscall.O_ACCMODE) { + switch flags & uint32(o_ACCMODE) { case syscall.O_WRONLY: return fuse.W_OK case syscall.O_RDWR: diff --git a/weed/mount/weedfs_attr_windows.go b/weed/mount/weedfs_attr_windows.go new file mode 100644 index 000000000..044cc5fff --- /dev/null +++ b/weed/mount/weedfs_attr_windows.go @@ -0,0 +1,8 @@ +package mount + +import ( + "github.com/seaweedfs/go-fuse/v2/fuse" +) + +func setBlksize(out *fuse.Attr, size uint32) { +} diff --git a/weed/mount/weedfs_file_lock.go b/weed/mount/weedfs_file_lock.go index 0e67d2fd5..b593bf72a 100644 --- a/weed/mount/weedfs_file_lock.go +++ b/weed/mount/weedfs_file_lock.go @@ -1,8 +1,6 @@ package mount import ( - "syscall" - "github.com/seaweedfs/go-fuse/v2/fuse" ) @@ -56,7 +54,7 @@ func (wfs *WFS) SetLkw(cancel <-chan struct{}, in *fuse.LkIn) fuse.Status { Pid: in.Lk.Pid, IsFlock: in.LkFlags&fuse.FUSE_LK_FLOCK != 0, } - if lk.Typ == syscall.F_UNLCK { + if lk.Typ == f_UNLCK { return wfs.posixLocks.SetLk(in.NodeId, lk) } return wfs.posixLocks.SetLkw(in.NodeId, lk, cancel) diff --git a/weed/mount/weedfs_posix_lock_routed.go b/weed/mount/weedfs_posix_lock_routed.go index 502ec8f3b..17c47b4b3 100644 --- a/weed/mount/weedfs_posix_lock_routed.go +++ b/weed/mount/weedfs_posix_lock_routed.go @@ -6,7 +6,6 @@ import ( "encoding/hex" "math/rand/v2" "sync" - "syscall" "time" "github.com/seaweedfs/go-fuse/v2/fuse" @@ -103,9 +102,9 @@ func (wfs *WFS) posixLockKeyForInode(inode uint64) (string, bool) { func posixLockTypeToWire(typ uint32) uint32 { switch typ { - case syscall.F_RDLCK: + case f_RDLCK: return posixlock.Read - case syscall.F_WRLCK: + case f_WRLCK: return posixlock.Write default: return posixlock.Unlock @@ -115,11 +114,11 @@ func posixLockTypeToWire(typ uint32) uint32 { func posixLockTypeFromWire(typ uint32) uint32 { switch typ { case posixlock.Read: - return syscall.F_RDLCK + return f_RDLCK case posixlock.Write: - return syscall.F_WRLCK + return f_WRLCK default: - return syscall.F_UNLCK + return f_UNLCK } } @@ -186,7 +185,7 @@ func (wfs *WFS) routedGetLk(cancel <-chan struct{}, in *fuse.LkIn, out *fuse.LkO out.Lk.Start, out.Lk.End, out.Lk.Pid = c.GetStart(), c.GetEnd(), c.GetPid() out.Lk.Typ = posixLockTypeFromWire(c.GetType()) } else { - out.Lk.Typ = syscall.F_UNLCK + out.Lk.Typ = f_UNLCK } return fuse.OK } diff --git a/weed/mount/weedfs_xattr.go b/weed/mount/weedfs_xattr.go index 8ae6eb6d5..a042c0e00 100644 --- a/weed/mount/weedfs_xattr.go +++ b/weed/mount/weedfs_xattr.go @@ -8,7 +8,6 @@ import ( "syscall" "github.com/seaweedfs/go-fuse/v2/fuse" - sys "golang.org/x/sys/unix" ) const ( @@ -123,11 +122,11 @@ func (wfs *WFS) SetXAttr(cancel <-chan struct{}, input *fuse.SetXAttrIn, attr st } _, exists := entry.Extended[XATTR_PREFIX+attr] switch input.Flags { - case sys.XATTR_CREATE: + case xattr_CREATE: if exists { return fuse.Status(syscall.EEXIST) } - case sys.XATTR_REPLACE: + case xattr_REPLACE: if !exists { return fuse.ENODATA }