On Thu, Oct 30, 2025 at 10:31:11AM +1100, NeilBrown wrote:

> +++ b/fs/debugfs/inode.c

Why does debugfs_change_name() need any of that horror?  Seriously, WTF?
This is strictly a name change on a filesystem that never, ever moves
anything from one directory to another.

IMO struct renamedata is a fucking eyesore, but that aside, this:

> @@ -539,22 +540,30 @@ static int sel_make_policy_nodes(struct selinux_fs_info 
> *fsi,
>       if (ret)
>               goto out;
>  
> -     lock_rename(tmp_parent, fsi->sb->s_root);
> +     rd.old_parent = tmp_parent;
> +     rd.new_parent = fsi->sb->s_root;
>  
>       /* booleans */
> -     d_exchange(tmp_bool_dir, fsi->bool_dir);
> +     ret = start_renaming_two_dentries(&rd, tmp_bool_dir, fsi->bool_dir);
> +     if (!ret) {
> +             d_exchange(tmp_bool_dir, fsi->bool_dir);
>  
> -     swap(fsi->bool_num, bool_num);
> -     swap(fsi->bool_pending_names, bool_names);
> -     swap(fsi->bool_pending_values, bool_values);
> +             swap(fsi->bool_num, bool_num);
> +             swap(fsi->bool_pending_names, bool_names);
> +             swap(fsi->bool_pending_values, bool_values);
>  
> -     fsi->bool_dir = tmp_bool_dir;
> +             fsi->bool_dir = tmp_bool_dir;
> +             end_renaming(&rd);
> +     }
>  
>       /* classes */
> -     d_exchange(tmp_class_dir, fsi->class_dir);
> -     fsi->class_dir = tmp_class_dir;
> +     ret = start_renaming_two_dentries(&rd, tmp_class_dir, fsi->class_dir);
> +     if (ret == 0) {
> +             d_exchange(tmp_class_dir, fsi->class_dir);
> +             fsi->class_dir = tmp_class_dir;
>  
> -     unlock_rename(tmp_parent, fsi->sb->s_root);
> +             end_renaming(&rd);
> +     }
>  
>  out:
>       sel_remove_old_bool_data(bool_num, bool_names, bool_values);

is very interesting - suddenly you get two non-overlapping scopes instead of 
one.
Why is that OK?

Reply via email to