Unverified Commit b46ebf9a authored by Jeff Layton's avatar Jeff Layton Committed by Christian Brauner
Browse files

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: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarNeilBrown <neil@brown.name>
Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20251111-dir-deleg-ro-v6-5-52f3feebb2f2@kernel.org


Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent e6d28ebc
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -4667,6 +4667,9 @@ int vfs_unlink(struct mnt_idmap *idmap, struct inode *dir,
	else {
		error = security_inode_unlink(dir, dentry);
		if (!error) {
			error = try_break_deleg(dir, delegated_inode);
			if (error)
				goto out;
			error = try_break_deleg(target, delegated_inode);
			if (error)
				goto out;
@@ -4936,6 +4939,8 @@ int vfs_link(struct dentry *old_dentry, struct mnt_idmap *idmap,
	else if (max_links && inode->i_nlink >= max_links)
		error = -EMLINK;
	else {
		error = try_break_deleg(dir, delegated_inode);
		if (!error)
			error = try_break_deleg(inode, delegated_inode);
		if (!error)
			error = dir->i_op->link(old_dentry, dir, new_dentry);
@@ -5203,6 +5208,14 @@ int vfs_rename(struct renamedata *rd)
		    old_dir->i_nlink >= max_links)
			goto out;
	}
	error = try_break_deleg(old_dir, delegated_inode);
	if (error)
		goto out;
	if (new_dir != old_dir) {
		error = try_break_deleg(new_dir, delegated_inode);
		if (error)
			goto out;
	}
	if (!is_dir) {
		error = try_break_deleg(source, delegated_inode);
		if (error)