]> www.infradead.org Git - users/jedix/linux-maple.git/commit
afs: Fix missing subdir edit when renamed between parent dirs
authorDavid Howells <dhowells@redhat.com>
Wed, 23 Oct 2024 10:40:10 +0000 (11:40 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 24 Oct 2024 11:50:27 +0000 (13:50 +0200)
commit247d65fb122ad560be1c8c4d87d7374fb28b0770
treea349806c437e44c8e602c3eb865d07594853effa
parent6b51b9f65cec2c5246b06eec0334ba465ba357a8
afs: Fix missing subdir edit when renamed between parent dirs

When rename moves an AFS subdirectory between parent directories, the
subdir also needs a bit of editing: the ".." entry needs updating to point
to the new parent (though I don't make use of the info) and the DV needs
incrementing by 1 to reflect the change of content.  The server also sends
a callback break notification on the subdirectory if we have one, but we
can take care of recovering the promise next time we access the subdir.

This can be triggered by something like:

    mount -t afs %example.com:xfstest.test20 /xfstest.test/
    mkdir /xfstest.test/{aaa,bbb,aaa/ccc}
    touch /xfstest.test/bbb/ccc/d
    mv /xfstest.test/{aaa/ccc,bbb/ccc}
    touch /xfstest.test/bbb/ccc/e

When the pathwalk for the second touch hits "ccc", kafs spots that the DV
is incorrect and downloads it again (so the fix is not critical).

Fix this, if the rename target is a directory and the old and new
parents are different, by:

 (1) Incrementing the DV number of the target locally.

 (2) Editing the ".." entry in the target to refer to its new parent's
     vnode ID and uniquifier.

Link: https://lore.kernel.org/r/3340431.1729680010@warthog.procyon.org.uk
Fixes: 63a4681ff39c ("afs: Locally edit directory data for mkdir/create/unlink/...")
cc: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/afs/dir.c
fs/afs/dir_edit.c
fs/afs/internal.h
include/trace/events/afs.h