Skip to content

Commit f5abfdf

Browse files
authored
windows: Changed Readdir to read the whole directory in a loop, fixing the bug that the WinFsp only show at most 4096(DirBatchNum) files in a directory. (#6547)
1 parent 353aceb commit f5abfdf

File tree

1 file changed

+37
-27
lines changed

1 file changed

+37
-27
lines changed

pkg/winfsp/winfs.go

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -781,38 +781,48 @@ func (j *juice) Readdir(path string,
781781
return
782782
}
783783
ctx := j.newContext()
784-
entries, readAt, err := j.vfs.Readdir(ctx, ino, 100000, int(ofst), fh, true)
785-
if err != 0 {
786-
e = errorconv(err)
787-
return
788-
}
789-
var st fuse.Stat_t
790-
var ok bool
791-
var full = true
792-
// all the entries should have same format
793-
for _, e := range entries {
794-
if !e.Attr.Full {
795-
full = false
784+
785+
const batchSize = 10000
786+
currentOffset := int(ofst)
787+
788+
for {
789+
entries, readAt, err := j.vfs.Readdir(ctx, ino, batchSize, currentOffset, fh, true)
790+
if err != 0 {
791+
e = errorconv(err)
792+
return
793+
}
794+
if len(entries) == 0 {
796795
break
797796
}
798-
}
799-
for _, e := range entries {
800-
name := string(e.Name)
801-
if full {
802-
if j.vfs.ModifiedSince(e.Inode, readAt) {
803-
if e2, err := j.vfs.GetAttr(ctx, e.Inode, 0); err == 0 {
804-
e.Attr = e2.Attr
805-
}
797+
var st fuse.Stat_t
798+
var ok bool
799+
var full = true
800+
// all the entries should have same format
801+
for _, e := range entries {
802+
if !e.Attr.Full {
803+
full = false
804+
break
806805
}
807-
j.vfs.UpdateLength(e.Inode, e.Attr)
808-
attrToStat(e.Inode, e.Attr, &st)
809-
ok = fill(name, &st, 0)
810-
} else {
811-
ok = fill(name, nil, 0)
812806
}
813-
if !ok {
814-
break
807+
for _, e := range entries {
808+
name := string(e.Name)
809+
if full {
810+
if j.vfs.ModifiedSince(e.Inode, readAt) {
811+
if e2, err := j.vfs.GetAttr(ctx, e.Inode, 0); err == 0 {
812+
e.Attr = e2.Attr
813+
}
814+
}
815+
j.vfs.UpdateLength(e.Inode, e.Attr)
816+
attrToStat(e.Inode, e.Attr, &st)
817+
ok = fill(name, &st, 0)
818+
} else {
819+
ok = fill(name, nil, 0)
820+
}
821+
if !ok {
822+
break
823+
}
815824
}
825+
currentOffset += len(entries)
816826
}
817827
return
818828
}

0 commit comments

Comments
 (0)