Skip to content

Commit ad191eb

Browse files
chuckleverbrauner
authored andcommitted
shmem: Fix shmem_rename2()
When renaming onto an existing directory entry, user space expects the replacement entry to have the same directory offset as the original one. Link: https://gitlab.alpinelinux.org/alpine/aports/-/issues/15966 Fixes: a2e4595 ("shmem: stable directory offsets") Signed-off-by: Chuck Lever <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Christian Brauner <[email protected]>
1 parent 5a1a25b commit ad191eb

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

fs/libfs.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,15 +366,24 @@ int simple_offset_empty(struct dentry *dentry)
366366
*
367367
* Caller provides appropriate serialization.
368368
*
369+
* User space expects the directory offset value of the replaced
370+
* (new) directory entry to be unchanged after a rename.
371+
*
369372
* Returns zero on success, a negative errno value on failure.
370373
*/
371374
int simple_offset_rename(struct inode *old_dir, struct dentry *old_dentry,
372375
struct inode *new_dir, struct dentry *new_dentry)
373376
{
374377
struct offset_ctx *old_ctx = old_dir->i_op->get_offset_ctx(old_dir);
375378
struct offset_ctx *new_ctx = new_dir->i_op->get_offset_ctx(new_dir);
379+
long new_offset = dentry2offset(new_dentry);
376380

377381
simple_offset_remove(old_ctx, old_dentry);
382+
383+
if (new_offset) {
384+
offset_set(new_dentry, 0);
385+
return simple_offset_replace(new_ctx, old_dentry, new_offset);
386+
}
378387
return simple_offset_add(new_ctx, old_dentry);
379388
}
380389

0 commit comments

Comments
 (0)