diff options
| author | Shakeel Butt <shakeel.butt@linux.dev> | 2026-09-11 11:28:12 -0700 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-09-17 12:08:52 +0200 |
| commit | 5ebcb578adeec7407dd501108ab2f423ca8e3e55 (patch) | |
| tree | 6dce11ed0492c86afd3ef1352157adf491cc1155 /tools/lib/python | |
| parent | 23985e2b1f31623468244a2149b2388cda4925eb (diff) | |
| download | linux-next-5ebcb578adeec7407dd501108ab2f423ca8e3e55.tar.gz linux-next-5ebcb578adeec7407dd501108ab2f423ca8e3e55.zip | |
kernfs: don't repeat or skip an entry when readdir resumes
readdir keeps its place as a name hash in ctx->pos and pins the entry in
file->private_data. If that entry is gone when the listing comes back,
kernfs_dir_pos() searches the rbtree for the hash and keeps whatever
node the descent stopped on. That is the entry before or after the
missing one, depending on the shape of the tree.
Landing before it repeats an entry the previous getdents(2) call already
reported. Landing after it, kernfs_dir_next_pos() calls rb_next() and
steps over an unreported entry.
With children A(10), B(20), C(30):
report A, ctx->pos = 10
A removed
kernfs_dir_next_pos(10, A)
A is gone, the search for 10 stops at B
rb_next(B) -> C, so B is never reported
Only the repeat happens today, between two getdents(2) calls. The skip
needs the pinned entry to go away inside one call, which the next patch
allows when it drops kernfs_rwsem around dir_emit().
Before the commit 4e4d6d860b93 the descent kept a node only on the way
left, which is a search for the first entry at or after the hash. That
commit moved the assignment to the top of the loop, where it runs on
right turns too. Restore that search, and step forward only when the
pinned entry is still there rather than when the hash matches, since two
entries in one directory can share a hash.
While here, kernfs_dir_next_pos() called the hash @ino. It is never an
inode number, so name it @hash.
Fixes: 4e4d6d860b93 ("sysfs: Add s_hash to sysfs_dirent and order directory entries by hash")
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev>
Link: https://patch.msgid.link/20260911182815.1992483-2-shakeel.butt@linux.dev
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'tools/lib/python')
0 files changed, 0 insertions, 0 deletions
