Fix vfs2 proc/self/fd dirent iteration.

Make proc/self/fd iteration work properly. Also, the comment on
kernfs.Inode.IterDirents did not accurately reflect how parameters should be
used/were used in kernfs.Inode impls other than fdDir.

Updates #2923.

PiperOrigin-RevId: 317370325
This commit is contained in:
Dean Deng 2020-06-19 13:35:02 -07:00 committed by gVisor bot
parent 7db196c4db
commit 8655fb7248
2 changed files with 5 additions and 6 deletions

View File

@ -425,10 +425,10 @@ type inodeDynamicLookup interface {
// IterDirents is used to iterate over dynamically created entries. It invokes // IterDirents is used to iterate over dynamically created entries. It invokes
// cb on each entry in the directory represented by the FileDescription. // cb on each entry in the directory represented by the FileDescription.
// 'offset' is the offset for the entire IterDirents call, which may include // 'offset' is the offset for the entire IterDirents call, which may include
// results from the caller. 'relOffset' is the offset inside the entries // results from the caller (e.g. "." and ".."). 'relOffset' is the offset
// returned by this IterDirents invocation. In other words, // inside the entries returned by this IterDirents invocation. In other words,
// 'offset+relOffset+1' is the value that should be set in vfs.Dirent.NextOff, // 'offset' should be used to calculate each vfs.Dirent.NextOff as well as
// while 'relOffset' is the place where iteration should start from. // the return value, while 'relOffset' is the place to start iteration.
IterDirents(ctx context.Context, callback vfs.IterDirentsCallback, offset, relOffset int64) (newOffset int64, err error) IterDirents(ctx context.Context, callback vfs.IterDirentsCallback, offset, relOffset int64) (newOffset int64, err error)
} }

View File

@ -64,7 +64,7 @@ type fdDir struct {
} }
// IterDirents implements kernfs.inodeDynamicLookup. // IterDirents implements kernfs.inodeDynamicLookup.
func (i *fdDir) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback, absOffset, relOffset int64) (int64, error) { func (i *fdDir) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback, offset, relOffset int64) (int64, error) {
var fds []int32 var fds []int32
i.task.WithMuLocked(func(t *kernel.Task) { i.task.WithMuLocked(func(t *kernel.Task) {
if fdTable := t.FDTable(); fdTable != nil { if fdTable := t.FDTable(); fdTable != nil {
@ -72,7 +72,6 @@ func (i *fdDir) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback, abs
} }
}) })
offset := absOffset + relOffset
typ := uint8(linux.DT_REG) typ := uint8(linux.DT_REG)
if i.produceSymlink { if i.produceSymlink {
typ = linux.DT_LNK typ = linux.DT_LNK