mbox series

[v2,0/3] Fix shmem_rename2 directory offset calculation

Message ID 20240415152057.4605-1-cel@kernel.org (mailing list archive)
Headers show
Series Fix shmem_rename2 directory offset calculation | expand

Message

Chuck Lever April 15, 2024, 3:20 p.m. UTC
From: Chuck Lever <chuck.lever@oracle.com>

The existing code in shmem_rename2() allocates a fresh directory
offset value when renaming over an existing destination entry. User
space does not expect this behavior. In particular, applications
that rename while walking a directory can loop indefinitely because
they never reach the end of the directory.

The only test that is problematic at the moment is generic/449,
which live-locks (interruptibly). I don't have a baseline yet, so
I can't say whether the fix introduces this behavior or pre-dates
the shmem conversion to simple_offset.


--
Changes since v1:
- Patches reorganized for easier review and backport
- Passes git regression and fstests (with scratch device)
- Dropped the API clean-up patch for now

Chuck Lever (3):
  libfs: Fix simple_offset_rename_exchange()
  libfs: Add simple_offset_rename() API
  shmem: Fix shmem_rename2()

 fs/libfs.c         | 55 +++++++++++++++++++++++++++++++++++++++++-----
 include/linux/fs.h |  2 ++
 mm/shmem.c         |  3 +--
 3 files changed, 52 insertions(+), 8 deletions(-)


base-commit: fec50db7033ea478773b159e0e2efb135270e3b7

Comments

Chuck Lever April 16, 2024, 2:49 p.m. UTC | #1
On Mon, Apr 15, 2024 at 11:20:53AM -0400, cel@kernel.org wrote:
> From: Chuck Lever <chuck.lever@oracle.com>
> 
> The existing code in shmem_rename2() allocates a fresh directory
> offset value when renaming over an existing destination entry. User
> space does not expect this behavior. In particular, applications
> that rename while walking a directory can loop indefinitely because
> they never reach the end of the directory.
> 
> The only test that is problematic at the moment is generic/449,
> which live-locks (interruptibly). I don't have a baseline yet, so
> I can't say whether the fix introduces this behavior or pre-dates
> the shmem conversion to simple_offset.

v6.5 exhibits the same behavior, so this fix did not introduce this
issue. IMO these patches are ready.


> --
> Changes since v1:
> - Patches reorganized for easier review and backport
> - Passes git regression and fstests (with scratch device)
> - Dropped the API clean-up patch for now
> 
> Chuck Lever (3):
>   libfs: Fix simple_offset_rename_exchange()
>   libfs: Add simple_offset_rename() API
>   shmem: Fix shmem_rename2()
> 
>  fs/libfs.c         | 55 +++++++++++++++++++++++++++++++++++++++++-----
>  include/linux/fs.h |  2 ++
>  mm/shmem.c         |  3 +--
>  3 files changed, 52 insertions(+), 8 deletions(-)
> 
> 
> base-commit: fec50db7033ea478773b159e0e2efb135270e3b7
> -- 
> 2.44.0
Christian Brauner April 17, 2024, 3:26 p.m. UTC | #2
On Mon, 15 Apr 2024 11:20:53 -0400, cel@kernel.org wrote:
> From: Chuck Lever <chuck.lever@oracle.com>
> 
> The existing code in shmem_rename2() allocates a fresh directory
> offset value when renaming over an existing destination entry. User
> space does not expect this behavior. In particular, applications
> that rename while walking a directory can loop indefinitely because
> they never reach the end of the directory.
> 
> [...]

Thanks for fixing this!

---

Applied to the vfs.misc branch of the vfs/vfs.git tree.
Patches in the vfs.misc branch should appear in linux-next soon.

Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.

It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.

Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs.misc

[1/3] libfs: Fix simple_offset_rename_exchange()
      https://git.kernel.org/vfs/vfs/c/23cdd0eed3f1
[2/3] libfs: Add simple_offset_rename() API
      https://git.kernel.org/vfs/vfs/c/5a1a25be995e
[3/3] shmem: Fix shmem_rename2()
      https://git.kernel.org/vfs/vfs/c/ad191eb6d694