@@ -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