Skip to content

Commit 4be75ff

Browse files
mihalicynMiklos Szeredi
authored andcommitted
fuse: support idmapped ->rename op
RENAME_WHITEOUT is a special case of ->rename and we need to take idmappings into account there. Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
1 parent d395d0a commit 4be75ff

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

fs/fuse/dir.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,7 @@ static int fuse_rmdir(struct inode *dir, struct dentry *entry)
10261026
return err;
10271027
}
10281028

1029-
static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
1029+
static int fuse_rename_common(struct mnt_idmap *idmap, struct inode *olddir, struct dentry *oldent,
10301030
struct inode *newdir, struct dentry *newent,
10311031
unsigned int flags, int opcode, size_t argsize)
10321032
{
@@ -1047,7 +1047,7 @@ static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
10471047
args.in_args[1].value = oldent->d_name.name;
10481048
args.in_args[2].size = newent->d_name.len + 1;
10491049
args.in_args[2].value = newent->d_name.name;
1050-
err = fuse_simple_request(NULL, fm, &args);
1050+
err = fuse_simple_request(idmap, fm, &args);
10511051
if (!err) {
10521052
/* ctime changes */
10531053
fuse_update_ctime(d_inode(oldent));
@@ -1093,15 +1093,16 @@ static int fuse_rename2(struct mnt_idmap *idmap, struct inode *olddir,
10931093
if (fc->no_rename2 || fc->minor < 23)
10941094
return -EINVAL;
10951095

1096-
err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
1096+
err = fuse_rename_common((flags & RENAME_WHITEOUT) ? idmap : NULL,
1097+
olddir, oldent, newdir, newent, flags,
10971098
FUSE_RENAME2,
10981099
sizeof(struct fuse_rename2_in));
10991100
if (err == -ENOSYS) {
11001101
fc->no_rename2 = 1;
11011102
err = -EINVAL;
11021103
}
11031104
} else {
1104-
err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
1105+
err = fuse_rename_common(NULL, olddir, oldent, newdir, newent, 0,
11051106
FUSE_RENAME,
11061107
sizeof(struct fuse_rename_in));
11071108
}

0 commit comments

Comments
 (0)