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:
parent
7db196c4db
commit
8655fb7248
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue