code: func (fs *Goofys) ReadDir(
  	ctx context.Context,
  	op *fuseops.ReadDirOp) (err error) {
  
  	// Find the handle.
  	fs.mu.Lock()
  	dh := fs.dirHandles[op.Handle]
  	fs.mu.Unlock()
  
  	if dh == nil {
  		panic(fmt.Sprintf("can't find dh=%v", op.Handle))
  	}
  
  	inode := dh.inode
  	inode.logFuse("ReadDir", op.Offset)
  
  	dh.mu.Lock()
  	defer dh.mu.Unlock()
  
  	readFromS3 := false
  
  	for i := op.Offset; ; i++ {
  		e, err := dh.ReadDir(i)
  		if err != nil {
  			return err
  		}
  		if e == nil {
  			// we've reached the end, if this was read
  			// from S3 then update the cache time
  			if readFromS3 {
  				inode.dir.DirTime = time.Now()
  				inode.Attributes.Mtime = inode.findChildMaxTime()
  			}
  			break
  		}
  
  		if e.Inode == 0 {
  			readFromS3 = true
  			fs.insertInodeFromDirEntry(inode, e)
  		}
  
  		n := fuseutil.WriteDirent(op.Dst[op.BytesRead:], makeDirEntry(e))
  		if n == 0 {
  			break
  		}
  
  		dh.inode.logFuse("<-- ReadDir", *e.Name, e.Offset)
  
  		op.BytesRead += n
  	}
  
  	return
  }
docs: // LOCKS_EXCLUDED(fs.mu)