Skip to content

Commit 10dc721

Browse files
mihalicynMiklos Szeredi
authored andcommitted
fuse: add an idmap argument to fuse_simple_request
If idmap == NULL *and* filesystem daemon declared idmapped mounts support, then uid/gid values in a fuse header will be -1. No functional changes intended. Signed-off-by: Alexander Mikhalitsyn <[email protected]> Signed-off-by: Miklos Szeredi <[email protected]>
1 parent aa16880 commit 10dc721

File tree

9 files changed

+47
-44
lines changed

9 files changed

+47
-44
lines changed

fs/fuse/dax.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ static int fuse_setup_one_mapping(struct inode *inode, unsigned long start_idx,
207207
args.in_numargs = 1;
208208
args.in_args[0].size = sizeof(inarg);
209209
args.in_args[0].value = &inarg;
210-
err = fuse_simple_request(fm, &args);
210+
err = fuse_simple_request(NULL, fm, &args);
211211
if (err < 0)
212212
return err;
213213
dmap->writable = writable;
@@ -245,7 +245,7 @@ static int fuse_send_removemapping(struct inode *inode,
245245
args.in_args[0].value = inargp;
246246
args.in_args[1].size = inargp->count * sizeof(*remove_one);
247247
args.in_args[1].value = remove_one;
248-
return fuse_simple_request(fm, &args);
248+
return fuse_simple_request(NULL, fm, &args);
249249
}
250250

251251
static int dmap_removemapping_list(struct inode *inode, unsigned int num,

fs/fuse/dev.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,9 @@ static void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args)
539539
__set_bit(FR_ASYNC, &req->flags);
540540
}
541541

542-
ssize_t fuse_simple_request(struct fuse_mount *fm, struct fuse_args *args)
542+
ssize_t fuse_simple_request(struct mnt_idmap *idmap,
543+
struct fuse_mount *fm,
544+
struct fuse_args *args)
543545
{
544546
struct fuse_conn *fc = fm->fc;
545547
struct fuse_req *req;
@@ -556,7 +558,7 @@ ssize_t fuse_simple_request(struct fuse_mount *fm, struct fuse_args *args)
556558
__set_bit(FR_FORCE, &req->flags);
557559
} else {
558560
WARN_ON(args->nocreds);
559-
req = fuse_get_req(NULL, fm, false);
561+
req = fuse_get_req(idmap, fm, false);
560562
if (IS_ERR(req))
561563
return PTR_ERR(req);
562564
}

fs/fuse/dir.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
230230
parent = dget_parent(entry);
231231
fuse_lookup_init(fm->fc, &args, get_node_id(d_inode(parent)),
232232
&entry->d_name, &outarg);
233-
ret = fuse_simple_request(fm, &args);
233+
ret = fuse_simple_request(NULL, fm, &args);
234234
dput(parent);
235235
/* Zero nodeid is same as -ENOENT */
236236
if (!ret && !outarg.nodeid)
@@ -383,7 +383,7 @@ int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name
383383
attr_version = fuse_get_attr_version(fm->fc);
384384

385385
fuse_lookup_init(fm->fc, &args, nodeid, name, outarg);
386-
err = fuse_simple_request(fm, &args);
386+
err = fuse_simple_request(NULL, fm, &args);
387387
/* Zero nodeid is same as -ENOENT, but with valid timeout */
388388
if (err || !outarg->nodeid)
389389
goto out_put_forget;
@@ -672,7 +672,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
672672
if (err)
673673
goto out_free_ff;
674674

675-
err = fuse_simple_request(fm, &args);
675+
err = fuse_simple_request(NULL, fm, &args);
676676
free_ext_value(&args);
677677
if (err)
678678
goto out_free_ff;
@@ -803,7 +803,7 @@ static int create_new_entry(struct fuse_mount *fm, struct fuse_args *args,
803803
goto out_put_forget_req;
804804
}
805805

806-
err = fuse_simple_request(fm, args);
806+
err = fuse_simple_request(NULL, fm, args);
807807
free_ext_value(args);
808808
if (err)
809809
goto out_put_forget_req;
@@ -987,7 +987,7 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry)
987987
args.in_numargs = 1;
988988
args.in_args[0].size = entry->d_name.len + 1;
989989
args.in_args[0].value = entry->d_name.name;
990-
err = fuse_simple_request(fm, &args);
990+
err = fuse_simple_request(NULL, fm, &args);
991991
if (!err) {
992992
fuse_dir_changed(dir);
993993
fuse_entry_unlinked(entry);
@@ -1010,7 +1010,7 @@ static int fuse_rmdir(struct inode *dir, struct dentry *entry)
10101010
args.in_numargs = 1;
10111011
args.in_args[0].size = entry->d_name.len + 1;
10121012
args.in_args[0].value = entry->d_name.name;
1013-
err = fuse_simple_request(fm, &args);
1013+
err = fuse_simple_request(NULL, fm, &args);
10141014
if (!err) {
10151015
fuse_dir_changed(dir);
10161016
fuse_entry_unlinked(entry);
@@ -1040,7 +1040,7 @@ static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
10401040
args.in_args[1].value = oldent->d_name.name;
10411041
args.in_args[2].size = newent->d_name.len + 1;
10421042
args.in_args[2].value = newent->d_name.name;
1043-
err = fuse_simple_request(fm, &args);
1043+
err = fuse_simple_request(NULL, fm, &args);
10441044
if (!err) {
10451045
/* ctime changes */
10461046
fuse_update_ctime(d_inode(oldent));
@@ -1210,7 +1210,7 @@ static int fuse_do_statx(struct inode *inode, struct file *file,
12101210
args.out_numargs = 1;
12111211
args.out_args[0].size = sizeof(outarg);
12121212
args.out_args[0].value = &outarg;
1213-
err = fuse_simple_request(fm, &args);
1213+
err = fuse_simple_request(NULL, fm, &args);
12141214
if (err)
12151215
return err;
12161216

@@ -1268,7 +1268,7 @@ static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
12681268
args.out_numargs = 1;
12691269
args.out_args[0].size = sizeof(outarg);
12701270
args.out_args[0].value = &outarg;
1271-
err = fuse_simple_request(fm, &args);
1271+
err = fuse_simple_request(NULL, fm, &args);
12721272
if (!err) {
12731273
if (fuse_invalid_attr(&outarg.attr) ||
12741274
inode_wrong_type(inode, outarg.attr.mode)) {
@@ -1472,7 +1472,7 @@ static int fuse_access(struct inode *inode, int mask)
14721472
args.in_numargs = 1;
14731473
args.in_args[0].size = sizeof(inarg);
14741474
args.in_args[0].value = &inarg;
1475-
err = fuse_simple_request(fm, &args);
1475+
err = fuse_simple_request(NULL, fm, &args);
14761476
if (err == -ENOSYS) {
14771477
fm->fc->no_access = 1;
14781478
err = 0;
@@ -1584,7 +1584,7 @@ static int fuse_readlink_page(struct inode *inode, struct page *page)
15841584
ap.args.page_zeroing = true;
15851585
ap.args.out_numargs = 1;
15861586
ap.args.out_args[0].size = desc.length;
1587-
res = fuse_simple_request(fm, &ap.args);
1587+
res = fuse_simple_request(NULL, fm, &ap.args);
15881588

15891589
fuse_invalidate_atime(inode);
15901590

@@ -1857,7 +1857,7 @@ int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
18571857
}
18581858
fuse_setattr_fill(fm->fc, &args, inode, &inarg, &outarg);
18591859

1860-
return fuse_simple_request(fm, &args);
1860+
return fuse_simple_request(NULL, fm, &args);
18611861
}
18621862

18631863
/*
@@ -1970,7 +1970,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
19701970
inarg.valid |= FATTR_KILL_SUIDGID;
19711971
}
19721972
fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1973-
err = fuse_simple_request(fm, &args);
1973+
err = fuse_simple_request(NULL, fm, &args);
19741974
if (err) {
19751975
if (err == -EINTR)
19761976
fuse_invalidate_attr(inode);

fs/fuse/file.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ static int fuse_send_open(struct fuse_mount *fm, u64 nodeid,
4848
args.out_args[0].size = sizeof(*outargp);
4949
args.out_args[0].value = outargp;
5050

51-
return fuse_simple_request(fm, &args);
51+
return fuse_simple_request(NULL, fm, &args);
5252
}
5353

5454
struct fuse_file *fuse_file_alloc(struct fuse_mount *fm, bool release)
@@ -111,7 +111,7 @@ static void fuse_file_put(struct fuse_file *ff, bool sync)
111111
if (!args) {
112112
/* Do nothing when server does not implement 'open' */
113113
} else if (sync) {
114-
fuse_simple_request(ff->fm, args);
114+
fuse_simple_request(NULL, ff->fm, args);
115115
fuse_release_end(ff->fm, args, 0);
116116
} else {
117117
args->end = fuse_release_end;
@@ -539,7 +539,7 @@ static int fuse_flush(struct file *file, fl_owner_t id)
539539
args.in_args[0].value = &inarg;
540540
args.force = true;
541541

542-
err = fuse_simple_request(fm, &args);
542+
err = fuse_simple_request(NULL, fm, &args);
543543
if (err == -ENOSYS) {
544544
fm->fc->no_flush = 1;
545545
err = 0;
@@ -572,7 +572,7 @@ int fuse_fsync_common(struct file *file, loff_t start, loff_t end,
572572
args.in_numargs = 1;
573573
args.in_args[0].size = sizeof(inarg);
574574
args.in_args[0].value = &inarg;
575-
return fuse_simple_request(fm, &args);
575+
return fuse_simple_request(NULL, fm, &args);
576576
}
577577

578578
static int fuse_fsync(struct file *file, loff_t start, loff_t end,
@@ -814,7 +814,7 @@ static ssize_t fuse_send_read(struct fuse_io_args *ia, loff_t pos, size_t count,
814814
if (ia->io->async)
815815
return fuse_async_req_send(fm, ia, count);
816816

817-
return fuse_simple_request(fm, &ia->ap.args);
817+
return fuse_simple_request(NULL, fm, &ia->ap.args);
818818
}
819819

820820
static void fuse_read_update_size(struct inode *inode, loff_t size,
@@ -878,7 +878,7 @@ static int fuse_do_readpage(struct file *file, struct page *page)
878878
desc.length--;
879879

880880
fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
881-
res = fuse_simple_request(fm, &ia.ap.args);
881+
res = fuse_simple_request(NULL, fm, &ia.ap.args);
882882
if (res < 0)
883883
return res;
884884
/*
@@ -976,7 +976,7 @@ static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
976976
if (!err)
977977
return;
978978
} else {
979-
res = fuse_simple_request(fm, &ap->args);
979+
res = fuse_simple_request(NULL, fm, &ap->args);
980980
err = res < 0 ? res : 0;
981981
}
982982
fuse_readpages_end(fm, &ap->args, err);
@@ -1101,7 +1101,7 @@ static ssize_t fuse_send_write(struct fuse_io_args *ia, loff_t pos,
11011101
if (ia->io->async)
11021102
return fuse_async_req_send(fm, ia, count);
11031103

1104-
err = fuse_simple_request(fm, &ia->ap.args);
1104+
err = fuse_simple_request(NULL, fm, &ia->ap.args);
11051105
if (!err && ia->write.out.size > count)
11061106
err = -EIO;
11071107

@@ -1147,7 +1147,7 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
11471147
if (fm->fc->handle_killpriv_v2 && !capable(CAP_FSETID))
11481148
ia->write.in.write_flags |= FUSE_WRITE_KILL_SUIDGID;
11491149

1150-
err = fuse_simple_request(fm, &ap->args);
1150+
err = fuse_simple_request(NULL, fm, &ap->args);
11511151
if (!err && ia->write.out.size > count)
11521152
err = -EIO;
11531153

@@ -2661,7 +2661,7 @@ static int fuse_getlk(struct file *file, struct file_lock *fl)
26612661
args.out_numargs = 1;
26622662
args.out_args[0].size = sizeof(outarg);
26632663
args.out_args[0].value = &outarg;
2664-
err = fuse_simple_request(fm, &args);
2664+
err = fuse_simple_request(NULL, fm, &args);
26652665
if (!err)
26662666
err = convert_fuse_file_lock(fm->fc, &outarg.lk, fl);
26672667

@@ -2685,7 +2685,7 @@ static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
26852685
}
26862686

26872687
fuse_lk_fill(&args, file, fl, opcode, pid_nr, flock, &inarg);
2688-
err = fuse_simple_request(fm, &args);
2688+
err = fuse_simple_request(NULL, fm, &args);
26892689

26902690
/* locking is restartable */
26912691
if (err == -EINTR)
@@ -2759,7 +2759,7 @@ static sector_t fuse_bmap(struct address_space *mapping, sector_t block)
27592759
args.out_numargs = 1;
27602760
args.out_args[0].size = sizeof(outarg);
27612761
args.out_args[0].value = &outarg;
2762-
err = fuse_simple_request(fm, &args);
2762+
err = fuse_simple_request(NULL, fm, &args);
27632763
if (err == -ENOSYS)
27642764
fm->fc->no_bmap = 1;
27652765

@@ -2791,7 +2791,7 @@ static loff_t fuse_lseek(struct file *file, loff_t offset, int whence)
27912791
args.out_numargs = 1;
27922792
args.out_args[0].size = sizeof(outarg);
27932793
args.out_args[0].value = &outarg;
2794-
err = fuse_simple_request(fm, &args);
2794+
err = fuse_simple_request(NULL, fm, &args);
27952795
if (err) {
27962796
if (err == -ENOSYS) {
27972797
fm->fc->no_lseek = 1;
@@ -2924,7 +2924,7 @@ __poll_t fuse_file_poll(struct file *file, poll_table *wait)
29242924
args.out_numargs = 1;
29252925
args.out_args[0].size = sizeof(outarg);
29262926
args.out_args[0].value = &outarg;
2927-
err = fuse_simple_request(fm, &args);
2927+
err = fuse_simple_request(NULL, fm, &args);
29282928

29292929
if (!err)
29302930
return demangle_poll(outarg.revents);
@@ -3146,7 +3146,7 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
31463146
args.in_numargs = 1;
31473147
args.in_args[0].size = sizeof(inarg);
31483148
args.in_args[0].value = &inarg;
3149-
err = fuse_simple_request(fm, &args);
3149+
err = fuse_simple_request(NULL, fm, &args);
31503150
if (err == -ENOSYS) {
31513151
fm->fc->no_fallocate = 1;
31523152
err = -EOPNOTSUPP;
@@ -3258,7 +3258,7 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
32583258
args.out_numargs = 1;
32593259
args.out_args[0].size = sizeof(outarg);
32603260
args.out_args[0].value = &outarg;
3261-
err = fuse_simple_request(fm, &args);
3261+
err = fuse_simple_request(NULL, fm, &args);
32623262
if (err == -ENOSYS) {
32633263
fc->no_copy_file_range = 1;
32643264
err = -EOPNOTSUPP;

fs/fuse/fuse_i.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,8 @@ void __exit fuse_ctl_cleanup(void);
11471147
/**
11481148
* Simple request sending that does request allocation and freeing
11491149
*/
1150-
ssize_t fuse_simple_request(struct fuse_mount *fm, struct fuse_args *args);
1150+
ssize_t fuse_simple_request(struct mnt_idmap *idmap, struct fuse_mount *fm,
1151+
struct fuse_args *args);
11511152
int fuse_simple_background(struct fuse_mount *fm, struct fuse_args *args,
11521153
gfp_t gfp_flags);
11531154

fs/fuse/inode.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ static void fuse_send_destroy(struct fuse_mount *fm)
586586
args.opcode = FUSE_DESTROY;
587587
args.force = true;
588588
args.nocreds = true;
589-
fuse_simple_request(fm, &args);
589+
fuse_simple_request(NULL, fm, &args);
590590
}
591591
}
592592

@@ -624,7 +624,7 @@ static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf)
624624
args.out_numargs = 1;
625625
args.out_args[0].size = sizeof(outarg);
626626
args.out_args[0].value = &outarg;
627-
err = fuse_simple_request(fm, &args);
627+
err = fuse_simple_request(NULL, fm, &args);
628628
if (!err)
629629
convert_fuse_statfs(buf, &outarg.st);
630630
return err;
@@ -713,7 +713,7 @@ static int fuse_sync_fs(struct super_block *sb, int wait)
713713
args.nodeid = get_node_id(sb->s_root->d_inode);
714714
args.out_numargs = 0;
715715

716-
err = fuse_simple_request(fm, &args);
716+
err = fuse_simple_request(NULL, fm, &args);
717717
if (err == -ENOSYS) {
718718
fc->sync_fs = 0;
719719
err = 0;

fs/fuse/ioctl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ static ssize_t fuse_send_ioctl(struct fuse_mount *fm, struct fuse_args *args,
1818
args->out_args[0].size = sizeof(*outarg);
1919
args->out_args[0].value = outarg;
2020

21-
ret = fuse_simple_request(fm, args);
21+
ret = fuse_simple_request(NULL, fm, args);
2222

2323
/* Translate ENOSYS, which shouldn't be returned from fs */
2424
if (ret == -ENOSYS)

fs/fuse/readdir.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ static void fuse_force_forget(struct file *file, u64 nodeid)
279279
args.force = true;
280280
args.noreply = true;
281281

282-
fuse_simple_request(fm, &args);
282+
fuse_simple_request(NULL, fm, &args);
283283
/* ignore errors */
284284
}
285285

@@ -358,7 +358,7 @@ static int fuse_readdir_uncached(struct file *file, struct dir_context *ctx)
358358
FUSE_READDIR);
359359
}
360360
locked = fuse_lock_inode(inode);
361-
res = fuse_simple_request(fm, &ap->args);
361+
res = fuse_simple_request(NULL, fm, &ap->args);
362362
fuse_unlock_inode(inode, locked);
363363
if (res >= 0) {
364364
if (!res) {

fs/fuse/xattr.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ int fuse_setxattr(struct inode *inode, const char *name, const void *value,
3737
args.in_args[1].value = name;
3838
args.in_args[2].size = size;
3939
args.in_args[2].value = value;
40-
err = fuse_simple_request(fm, &args);
40+
err = fuse_simple_request(NULL, fm, &args);
4141
if (err == -ENOSYS) {
4242
fm->fc->no_setxattr = 1;
4343
err = -EOPNOTSUPP;
@@ -79,7 +79,7 @@ ssize_t fuse_getxattr(struct inode *inode, const char *name, void *value,
7979
args.out_args[0].size = sizeof(outarg);
8080
args.out_args[0].value = &outarg;
8181
}
82-
ret = fuse_simple_request(fm, &args);
82+
ret = fuse_simple_request(NULL, fm, &args);
8383
if (!ret && !size)
8484
ret = min_t(size_t, outarg.size, XATTR_SIZE_MAX);
8585
if (ret == -ENOSYS) {
@@ -141,7 +141,7 @@ ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
141141
args.out_args[0].size = sizeof(outarg);
142142
args.out_args[0].value = &outarg;
143143
}
144-
ret = fuse_simple_request(fm, &args);
144+
ret = fuse_simple_request(NULL, fm, &args);
145145
if (!ret && !size)
146146
ret = min_t(size_t, outarg.size, XATTR_LIST_MAX);
147147
if (ret > 0 && size)
@@ -167,7 +167,7 @@ int fuse_removexattr(struct inode *inode, const char *name)
167167
args.in_numargs = 1;
168168
args.in_args[0].size = strlen(name) + 1;
169169
args.in_args[0].value = name;
170-
err = fuse_simple_request(fm, &args);
170+
err = fuse_simple_request(NULL, fm, &args);
171171
if (err == -ENOSYS) {
172172
fm->fc->no_removexattr = 1;
173173
err = -EOPNOTSUPP;

0 commit comments

Comments
 (0)