projects
/
platform
/
adaptation
/
renesas_rcar
/
renesas_kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fuse: handle large user and group ID
[platform/adaptation/renesas_rcar/renesas_kernel.git]
/
fs
/
fuse
/
inode.c
diff --git
a/fs/fuse/inode.c
b/fs/fuse/inode.c
index
a8ce6da
..
73f6bcb
100644
(file)
--- a/
fs/fuse/inode.c
+++ b/
fs/fuse/inode.c
@@
-461,6
+461,17
@@
static const match_table_t tokens = {
{OPT_ERR, NULL}
};
{OPT_ERR, NULL}
};
+static int fuse_match_uint(substring_t *s, unsigned int *res)
+{
+ int err = -ENOMEM;
+ char *buf = match_strdup(s);
+ if (buf) {
+ err = kstrtouint(buf, 10, res);
+ kfree(buf);
+ }
+ return err;
+}
+
static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev)
{
char *p;
static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev)
{
char *p;
@@
-471,6
+482,7
@@
static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev)
while ((p = strsep(&opt, ",")) != NULL) {
int token;
int value;
while ((p = strsep(&opt, ",")) != NULL) {
int token;
int value;
+ unsigned uv;
substring_t args[MAX_OPT_ARGS];
if (!*p)
continue;
substring_t args[MAX_OPT_ARGS];
if (!*p)
continue;
@@
-494,18
+506,18
@@
static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev)
break;
case OPT_USER_ID:
break;
case OPT_USER_ID:
- if (
match_int(&args[0], &value
))
+ if (
fuse_match_uint(&args[0], &uv
))
return 0;
return 0;
- d->user_id = make_kuid(current_user_ns(),
value
);
+ d->user_id = make_kuid(current_user_ns(),
uv
);
if (!uid_valid(d->user_id))
return 0;
d->user_id_present = 1;
break;
case OPT_GROUP_ID:
if (!uid_valid(d->user_id))
return 0;
d->user_id_present = 1;
break;
case OPT_GROUP_ID:
- if (
match_int(&args[0], &value
))
+ if (
fuse_match_uint(&args[0], &uv
))
return 0;
return 0;
- d->group_id = make_kgid(current_user_ns(),
value
);
+ d->group_id = make_kgid(current_user_ns(),
uv
);
if (!gid_valid(d->group_id))
return 0;
d->group_id_present = 1;
if (!gid_valid(d->group_id))
return 0;
d->group_id_present = 1;
@@
-565,7
+577,6
@@
void fuse_conn_init(struct fuse_conn *fc)
{
memset(fc, 0, sizeof(*fc));
spin_lock_init(&fc->lock);
{
memset(fc, 0, sizeof(*fc));
spin_lock_init(&fc->lock);
- mutex_init(&fc->inst_mutex);
init_rwsem(&fc->killsb);
atomic_set(&fc->count, 1);
init_waitqueue_head(&fc->waitq);
init_rwsem(&fc->killsb);
atomic_set(&fc->count, 1);
init_waitqueue_head(&fc->waitq);
@@
-596,7
+607,6
@@
void fuse_conn_put(struct fuse_conn *fc)
if (atomic_dec_and_test(&fc->count)) {
if (fc->destroy_req)
fuse_request_free(fc->destroy_req);
if (atomic_dec_and_test(&fc->count)) {
if (fc->destroy_req)
fuse_request_free(fc->destroy_req);
- mutex_destroy(&fc->inst_mutex);
fc->release(fc);
}
}
fc->release(fc);
}
}
@@
-920,7
+930,7
@@
static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)
static void fuse_free_conn(struct fuse_conn *fc)
{
static void fuse_free_conn(struct fuse_conn *fc)
{
- kfree
(fc
);
+ kfree
_rcu(fc, rcu
);
}
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
}
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)