Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

vfs: add try_break_deleg calls for parents to vfs_{link,rename,unlink}

In order to add directory delegation support, we need to break
delegations on the parent whenever there is going to be a change in the
directory.

vfs_link, vfs_unlink, and vfs_rename all have existing delegation break
handling for the children in the rename. Add the necessary calls for
breaking delegations in the parent(s) as well.

Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20251111-dir-deleg-ro-v6-5-52f3feebb2f2@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Jeff Layton and committed by
Christian Brauner
b46ebf9a e6d28ebc

+14 -1
+14 -1
fs/namei.c
··· 4667 4667 else { 4668 4668 error = security_inode_unlink(dir, dentry); 4669 4669 if (!error) { 4670 + error = try_break_deleg(dir, delegated_inode); 4671 + if (error) 4672 + goto out; 4670 4673 error = try_break_deleg(target, delegated_inode); 4671 4674 if (error) 4672 4675 goto out; ··· 4939 4936 else if (max_links && inode->i_nlink >= max_links) 4940 4937 error = -EMLINK; 4941 4938 else { 4942 - error = try_break_deleg(inode, delegated_inode); 4939 + error = try_break_deleg(dir, delegated_inode); 4940 + if (!error) 4941 + error = try_break_deleg(inode, delegated_inode); 4943 4942 if (!error) 4944 4943 error = dir->i_op->link(old_dentry, dir, new_dentry); 4945 4944 } ··· 5206 5201 goto out; 5207 5202 if ((flags & RENAME_EXCHANGE) && !is_dir && new_is_dir && 5208 5203 old_dir->i_nlink >= max_links) 5204 + goto out; 5205 + } 5206 + error = try_break_deleg(old_dir, delegated_inode); 5207 + if (error) 5208 + goto out; 5209 + if (new_dir != old_dir) { 5210 + error = try_break_deleg(new_dir, delegated_inode); 5211 + if (error) 5209 5212 goto out; 5210 5213 } 5211 5214 if (!is_dir) {