mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 05:32:00 +00:00
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 <aleksandr.mikhalitsyn@canonical.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
aa16880d9f
commit
10dc721836
@ -207,7 +207,7 @@ static int fuse_setup_one_mapping(struct inode *inode, unsigned long start_idx,
|
||||
args.in_numargs = 1;
|
||||
args.in_args[0].size = sizeof(inarg);
|
||||
args.in_args[0].value = &inarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err < 0)
|
||||
return err;
|
||||
dmap->writable = writable;
|
||||
@ -245,7 +245,7 @@ static int fuse_send_removemapping(struct inode *inode,
|
||||
args.in_args[0].value = inargp;
|
||||
args.in_args[1].size = inargp->count * sizeof(*remove_one);
|
||||
args.in_args[1].value = remove_one;
|
||||
return fuse_simple_request(fm, &args);
|
||||
return fuse_simple_request(NULL, fm, &args);
|
||||
}
|
||||
|
||||
static int dmap_removemapping_list(struct inode *inode, unsigned int num,
|
||||
|
@ -539,7 +539,9 @@ static void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args)
|
||||
__set_bit(FR_ASYNC, &req->flags);
|
||||
}
|
||||
|
||||
ssize_t fuse_simple_request(struct fuse_mount *fm, struct fuse_args *args)
|
||||
ssize_t fuse_simple_request(struct mnt_idmap *idmap,
|
||||
struct fuse_mount *fm,
|
||||
struct fuse_args *args)
|
||||
{
|
||||
struct fuse_conn *fc = fm->fc;
|
||||
struct fuse_req *req;
|
||||
@ -556,7 +558,7 @@ ssize_t fuse_simple_request(struct fuse_mount *fm, struct fuse_args *args)
|
||||
__set_bit(FR_FORCE, &req->flags);
|
||||
} else {
|
||||
WARN_ON(args->nocreds);
|
||||
req = fuse_get_req(NULL, fm, false);
|
||||
req = fuse_get_req(idmap, fm, false);
|
||||
if (IS_ERR(req))
|
||||
return PTR_ERR(req);
|
||||
}
|
||||
|
@ -230,7 +230,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
|
||||
parent = dget_parent(entry);
|
||||
fuse_lookup_init(fm->fc, &args, get_node_id(d_inode(parent)),
|
||||
&entry->d_name, &outarg);
|
||||
ret = fuse_simple_request(fm, &args);
|
||||
ret = fuse_simple_request(NULL, fm, &args);
|
||||
dput(parent);
|
||||
/* Zero nodeid is same as -ENOENT */
|
||||
if (!ret && !outarg.nodeid)
|
||||
@ -383,7 +383,7 @@ int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name
|
||||
attr_version = fuse_get_attr_version(fm->fc);
|
||||
|
||||
fuse_lookup_init(fm->fc, &args, nodeid, name, outarg);
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
/* Zero nodeid is same as -ENOENT, but with valid timeout */
|
||||
if (err || !outarg->nodeid)
|
||||
goto out_put_forget;
|
||||
@ -672,7 +672,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
|
||||
if (err)
|
||||
goto out_free_ff;
|
||||
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
free_ext_value(&args);
|
||||
if (err)
|
||||
goto out_free_ff;
|
||||
@ -803,7 +803,7 @@ static int create_new_entry(struct fuse_mount *fm, struct fuse_args *args,
|
||||
goto out_put_forget_req;
|
||||
}
|
||||
|
||||
err = fuse_simple_request(fm, args);
|
||||
err = fuse_simple_request(NULL, fm, args);
|
||||
free_ext_value(args);
|
||||
if (err)
|
||||
goto out_put_forget_req;
|
||||
@ -987,7 +987,7 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry)
|
||||
args.in_numargs = 1;
|
||||
args.in_args[0].size = entry->d_name.len + 1;
|
||||
args.in_args[0].value = entry->d_name.name;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (!err) {
|
||||
fuse_dir_changed(dir);
|
||||
fuse_entry_unlinked(entry);
|
||||
@ -1010,7 +1010,7 @@ static int fuse_rmdir(struct inode *dir, struct dentry *entry)
|
||||
args.in_numargs = 1;
|
||||
args.in_args[0].size = entry->d_name.len + 1;
|
||||
args.in_args[0].value = entry->d_name.name;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (!err) {
|
||||
fuse_dir_changed(dir);
|
||||
fuse_entry_unlinked(entry);
|
||||
@ -1040,7 +1040,7 @@ static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
|
||||
args.in_args[1].value = oldent->d_name.name;
|
||||
args.in_args[2].size = newent->d_name.len + 1;
|
||||
args.in_args[2].value = newent->d_name.name;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (!err) {
|
||||
/* ctime changes */
|
||||
fuse_update_ctime(d_inode(oldent));
|
||||
@ -1210,7 +1210,7 @@ static int fuse_do_statx(struct inode *inode, struct file *file,
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -1268,7 +1268,7 @@ static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (!err) {
|
||||
if (fuse_invalid_attr(&outarg.attr) ||
|
||||
inode_wrong_type(inode, outarg.attr.mode)) {
|
||||
@ -1472,7 +1472,7 @@ static int fuse_access(struct inode *inode, int mask)
|
||||
args.in_numargs = 1;
|
||||
args.in_args[0].size = sizeof(inarg);
|
||||
args.in_args[0].value = &inarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS) {
|
||||
fm->fc->no_access = 1;
|
||||
err = 0;
|
||||
@ -1584,7 +1584,7 @@ static int fuse_readlink_page(struct inode *inode, struct page *page)
|
||||
ap.args.page_zeroing = true;
|
||||
ap.args.out_numargs = 1;
|
||||
ap.args.out_args[0].size = desc.length;
|
||||
res = fuse_simple_request(fm, &ap.args);
|
||||
res = fuse_simple_request(NULL, fm, &ap.args);
|
||||
|
||||
fuse_invalidate_atime(inode);
|
||||
|
||||
@ -1857,7 +1857,7 @@ int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
|
||||
}
|
||||
fuse_setattr_fill(fm->fc, &args, inode, &inarg, &outarg);
|
||||
|
||||
return fuse_simple_request(fm, &args);
|
||||
return fuse_simple_request(NULL, fm, &args);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1970,7 +1970,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
|
||||
inarg.valid |= FATTR_KILL_SUIDGID;
|
||||
}
|
||||
fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err) {
|
||||
if (err == -EINTR)
|
||||
fuse_invalidate_attr(inode);
|
||||
|
@ -48,7 +48,7 @@ static int fuse_send_open(struct fuse_mount *fm, u64 nodeid,
|
||||
args.out_args[0].size = sizeof(*outargp);
|
||||
args.out_args[0].value = outargp;
|
||||
|
||||
return fuse_simple_request(fm, &args);
|
||||
return fuse_simple_request(NULL, fm, &args);
|
||||
}
|
||||
|
||||
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)
|
||||
if (!args) {
|
||||
/* Do nothing when server does not implement 'open' */
|
||||
} else if (sync) {
|
||||
fuse_simple_request(ff->fm, args);
|
||||
fuse_simple_request(NULL, ff->fm, args);
|
||||
fuse_release_end(ff->fm, args, 0);
|
||||
} else {
|
||||
args->end = fuse_release_end;
|
||||
@ -539,7 +539,7 @@ static int fuse_flush(struct file *file, fl_owner_t id)
|
||||
args.in_args[0].value = &inarg;
|
||||
args.force = true;
|
||||
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS) {
|
||||
fm->fc->no_flush = 1;
|
||||
err = 0;
|
||||
@ -572,7 +572,7 @@ int fuse_fsync_common(struct file *file, loff_t start, loff_t end,
|
||||
args.in_numargs = 1;
|
||||
args.in_args[0].size = sizeof(inarg);
|
||||
args.in_args[0].value = &inarg;
|
||||
return fuse_simple_request(fm, &args);
|
||||
return fuse_simple_request(NULL, fm, &args);
|
||||
}
|
||||
|
||||
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,
|
||||
if (ia->io->async)
|
||||
return fuse_async_req_send(fm, ia, count);
|
||||
|
||||
return fuse_simple_request(fm, &ia->ap.args);
|
||||
return fuse_simple_request(NULL, fm, &ia->ap.args);
|
||||
}
|
||||
|
||||
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)
|
||||
desc.length--;
|
||||
|
||||
fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
|
||||
res = fuse_simple_request(fm, &ia.ap.args);
|
||||
res = fuse_simple_request(NULL, fm, &ia.ap.args);
|
||||
if (res < 0)
|
||||
return res;
|
||||
/*
|
||||
@ -976,7 +976,7 @@ static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
|
||||
if (!err)
|
||||
return;
|
||||
} else {
|
||||
res = fuse_simple_request(fm, &ap->args);
|
||||
res = fuse_simple_request(NULL, fm, &ap->args);
|
||||
err = res < 0 ? res : 0;
|
||||
}
|
||||
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,
|
||||
if (ia->io->async)
|
||||
return fuse_async_req_send(fm, ia, count);
|
||||
|
||||
err = fuse_simple_request(fm, &ia->ap.args);
|
||||
err = fuse_simple_request(NULL, fm, &ia->ap.args);
|
||||
if (!err && ia->write.out.size > count)
|
||||
err = -EIO;
|
||||
|
||||
@ -1147,7 +1147,7 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
|
||||
if (fm->fc->handle_killpriv_v2 && !capable(CAP_FSETID))
|
||||
ia->write.in.write_flags |= FUSE_WRITE_KILL_SUIDGID;
|
||||
|
||||
err = fuse_simple_request(fm, &ap->args);
|
||||
err = fuse_simple_request(NULL, fm, &ap->args);
|
||||
if (!err && ia->write.out.size > count)
|
||||
err = -EIO;
|
||||
|
||||
@ -2661,7 +2661,7 @@ static int fuse_getlk(struct file *file, struct file_lock *fl)
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (!err)
|
||||
err = convert_fuse_file_lock(fm->fc, &outarg.lk, fl);
|
||||
|
||||
@ -2685,7 +2685,7 @@ static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
|
||||
}
|
||||
|
||||
fuse_lk_fill(&args, file, fl, opcode, pid_nr, flock, &inarg);
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
|
||||
/* locking is restartable */
|
||||
if (err == -EINTR)
|
||||
@ -2759,7 +2759,7 @@ static sector_t fuse_bmap(struct address_space *mapping, sector_t block)
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS)
|
||||
fm->fc->no_bmap = 1;
|
||||
|
||||
@ -2791,7 +2791,7 @@ static loff_t fuse_lseek(struct file *file, loff_t offset, int whence)
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err) {
|
||||
if (err == -ENOSYS) {
|
||||
fm->fc->no_lseek = 1;
|
||||
@ -2924,7 +2924,7 @@ __poll_t fuse_file_poll(struct file *file, poll_table *wait)
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
|
||||
if (!err)
|
||||
return demangle_poll(outarg.revents);
|
||||
@ -3146,7 +3146,7 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
|
||||
args.in_numargs = 1;
|
||||
args.in_args[0].size = sizeof(inarg);
|
||||
args.in_args[0].value = &inarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS) {
|
||||
fm->fc->no_fallocate = 1;
|
||||
err = -EOPNOTSUPP;
|
||||
@ -3258,7 +3258,7 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS) {
|
||||
fc->no_copy_file_range = 1;
|
||||
err = -EOPNOTSUPP;
|
||||
|
@ -1147,7 +1147,8 @@ void __exit fuse_ctl_cleanup(void);
|
||||
/**
|
||||
* Simple request sending that does request allocation and freeing
|
||||
*/
|
||||
ssize_t fuse_simple_request(struct fuse_mount *fm, struct fuse_args *args);
|
||||
ssize_t fuse_simple_request(struct mnt_idmap *idmap, struct fuse_mount *fm,
|
||||
struct fuse_args *args);
|
||||
int fuse_simple_background(struct fuse_mount *fm, struct fuse_args *args,
|
||||
gfp_t gfp_flags);
|
||||
|
||||
|
@ -586,7 +586,7 @@ static void fuse_send_destroy(struct fuse_mount *fm)
|
||||
args.opcode = FUSE_DESTROY;
|
||||
args.force = true;
|
||||
args.nocreds = true;
|
||||
fuse_simple_request(fm, &args);
|
||||
fuse_simple_request(NULL, fm, &args);
|
||||
}
|
||||
}
|
||||
|
||||
@ -624,7 +624,7 @@ static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
args.out_numargs = 1;
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (!err)
|
||||
convert_fuse_statfs(buf, &outarg.st);
|
||||
return err;
|
||||
@ -713,7 +713,7 @@ static int fuse_sync_fs(struct super_block *sb, int wait)
|
||||
args.nodeid = get_node_id(sb->s_root->d_inode);
|
||||
args.out_numargs = 0;
|
||||
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS) {
|
||||
fc->sync_fs = 0;
|
||||
err = 0;
|
||||
|
@ -18,7 +18,7 @@ static ssize_t fuse_send_ioctl(struct fuse_mount *fm, struct fuse_args *args,
|
||||
args->out_args[0].size = sizeof(*outarg);
|
||||
args->out_args[0].value = outarg;
|
||||
|
||||
ret = fuse_simple_request(fm, args);
|
||||
ret = fuse_simple_request(NULL, fm, args);
|
||||
|
||||
/* Translate ENOSYS, which shouldn't be returned from fs */
|
||||
if (ret == -ENOSYS)
|
||||
|
@ -279,7 +279,7 @@ static void fuse_force_forget(struct file *file, u64 nodeid)
|
||||
args.force = true;
|
||||
args.noreply = true;
|
||||
|
||||
fuse_simple_request(fm, &args);
|
||||
fuse_simple_request(NULL, fm, &args);
|
||||
/* ignore errors */
|
||||
}
|
||||
|
||||
@ -358,7 +358,7 @@ static int fuse_readdir_uncached(struct file *file, struct dir_context *ctx)
|
||||
FUSE_READDIR);
|
||||
}
|
||||
locked = fuse_lock_inode(inode);
|
||||
res = fuse_simple_request(fm, &ap->args);
|
||||
res = fuse_simple_request(NULL, fm, &ap->args);
|
||||
fuse_unlock_inode(inode, locked);
|
||||
if (res >= 0) {
|
||||
if (!res) {
|
||||
|
@ -37,7 +37,7 @@ int fuse_setxattr(struct inode *inode, const char *name, const void *value,
|
||||
args.in_args[1].value = name;
|
||||
args.in_args[2].size = size;
|
||||
args.in_args[2].value = value;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS) {
|
||||
fm->fc->no_setxattr = 1;
|
||||
err = -EOPNOTSUPP;
|
||||
@ -79,7 +79,7 @@ ssize_t fuse_getxattr(struct inode *inode, const char *name, void *value,
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
}
|
||||
ret = fuse_simple_request(fm, &args);
|
||||
ret = fuse_simple_request(NULL, fm, &args);
|
||||
if (!ret && !size)
|
||||
ret = min_t(size_t, outarg.size, XATTR_SIZE_MAX);
|
||||
if (ret == -ENOSYS) {
|
||||
@ -141,7 +141,7 @@ ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
|
||||
args.out_args[0].size = sizeof(outarg);
|
||||
args.out_args[0].value = &outarg;
|
||||
}
|
||||
ret = fuse_simple_request(fm, &args);
|
||||
ret = fuse_simple_request(NULL, fm, &args);
|
||||
if (!ret && !size)
|
||||
ret = min_t(size_t, outarg.size, XATTR_LIST_MAX);
|
||||
if (ret > 0 && size)
|
||||
@ -167,7 +167,7 @@ int fuse_removexattr(struct inode *inode, const char *name)
|
||||
args.in_numargs = 1;
|
||||
args.in_args[0].size = strlen(name) + 1;
|
||||
args.in_args[0].value = name;
|
||||
err = fuse_simple_request(fm, &args);
|
||||
err = fuse_simple_request(NULL, fm, &args);
|
||||
if (err == -ENOSYS) {
|
||||
fm->fc->no_removexattr = 1;
|
||||
err = -EOPNOTSUPP;
|
||||
|
Loading…
Reference in New Issue
Block a user