mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
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: a2e459555c
("shmem: stable directory offsets")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Link: https://lore.kernel.org/r/20240415152057.4605-4-cel@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
5a1a25be99
commit
ad191eb6d6
1 changed files with 9 additions and 0 deletions
|
@ -366,6 +366,9 @@ int simple_offset_empty(struct dentry *dentry)
|
|||
*
|
||||
* Caller provides appropriate serialization.
|
||||
*
|
||||
* User space expects the directory offset value of the replaced
|
||||
* (new) directory entry to be unchanged after a rename.
|
||||
*
|
||||
* Returns zero on success, a negative errno value on failure.
|
||||
*/
|
||||
int simple_offset_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
|
@ -373,8 +376,14 @@ int simple_offset_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
{
|
||||
struct offset_ctx *old_ctx = old_dir->i_op->get_offset_ctx(old_dir);
|
||||
struct offset_ctx *new_ctx = new_dir->i_op->get_offset_ctx(new_dir);
|
||||
long new_offset = dentry2offset(new_dentry);
|
||||
|
||||
simple_offset_remove(old_ctx, old_dentry);
|
||||
|
||||
if (new_offset) {
|
||||
offset_set(new_dentry, 0);
|
||||
return simple_offset_replace(new_ctx, old_dentry, new_offset);
|
||||
}
|
||||
return simple_offset_add(new_ctx, old_dentry);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue