mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-19 13:00:45 +02:00
* mount: drop the unused go-fuse fs package dependency WFS embedded fs.Inode but never used any of its methods, and the only other reference was RENAME_EXCHANGE, a constant sitting next to three literals. Removing both drops fs and five internal packages from the mount build graph. * mount: build the package on windows Windows has no fcntl lock types, no O_ACCMODE and no x/sys/unix, so a handful of constants kept weed/mount pinned to unix even though the code using them is portable in-memory logic. Route them through per-OS shims and give setBlksize a windows no-op. The POSIX lock table now compiles on windows but stays unreachable: WinFsp resolves byte-range locks in its own kernel driver, so nothing will feed it there. go.mod points at a go-fuse branch commit and needs repinning to a release tag once that lands. * ci: cross-compile for windows Nothing caught the unix-only constants creeping into weed/mount until a release build failed. * mount: let readdir feed a sink instead of the kernel buffer doReadDirectory wrote directly into fuse.DirEntryList, which is the kernel's wire format. A front end that is not the kernel would have to pack entries only to parse them straight back out. Route it through DirEntrySink instead. ReadDir and ReadDirPlus pass the reply buffer, so nothing changes for the FUSE server. * mount: pin go-fuse v2.9.4 for the windows build
38 lines
1.3 KiB
Go
38 lines
1.3 KiB
Go
package mount
|
|
|
|
import (
|
|
"github.com/seaweedfs/go-fuse/v2/fuse"
|
|
)
|
|
|
|
// DirEntrySink receives the entries a readdir produces. The FUSE server packs
|
|
// them straight into the kernel's reply buffer; a front end that is not the
|
|
// kernel reads them out instead of re-parsing that wire format.
|
|
type DirEntrySink interface {
|
|
// AddEntry reports one entry, returning false once the sink is full. A
|
|
// full sink ends the batch; the client resumes from the entry's Off.
|
|
AddEntry(entry fuse.DirEntry) bool
|
|
|
|
// AddEntryPlus is AddEntry for readdirplus, returning the attribute block
|
|
// to fill in, or nil once the sink is full.
|
|
AddEntryPlus(entry fuse.DirEntry) *fuse.EntryOut
|
|
}
|
|
|
|
// fuseDirEntryList adapts the kernel reply buffer to DirEntrySink.
|
|
type fuseDirEntryList struct {
|
|
*fuse.DirEntryList
|
|
}
|
|
|
|
func (l fuseDirEntryList) AddEntry(entry fuse.DirEntry) bool {
|
|
return l.AddDirEntry(entry)
|
|
}
|
|
|
|
func (l fuseDirEntryList) AddEntryPlus(entry fuse.DirEntry) *fuse.EntryOut {
|
|
return l.AddDirLookupEntry(entry)
|
|
}
|
|
|
|
// ReadDirectoryInto runs a readdir against sink. ReadDir and ReadDirPlus are
|
|
// this with the kernel reply buffer as the sink.
|
|
func (wfs *WFS) ReadDirectoryInto(input *fuse.ReadIn, sink DirEntrySink, isPlusMode bool) fuse.Status {
|
|
return wfs.doReadDirectory(input, sink, isPlusMode)
|
|
}
|