9p: fix option parsing
Options pointer is being moved before calling kfree() which seems to cause problems. This uses a separate pointer to track and free original allocation. Signed-off-by: Venkateswararao Jujjuri <jvrao@us.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>w
This commit is contained in:
Родитель
7a4439c406
Коммит
d8c8a9e365
10
fs/9p/v9fs.c
10
fs/9p/v9fs.c
|
@ -84,7 +84,7 @@ static const match_table_t tokens = {
|
||||||
|
|
||||||
static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
||||||
{
|
{
|
||||||
char *options;
|
char *options, *tmp_options;
|
||||||
substring_t args[MAX_OPT_ARGS];
|
substring_t args[MAX_OPT_ARGS];
|
||||||
char *p;
|
char *p;
|
||||||
int option = 0;
|
int option = 0;
|
||||||
|
@ -102,9 +102,10 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
||||||
if (!opts)
|
if (!opts)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
options = kstrdup(opts, GFP_KERNEL);
|
tmp_options = kstrdup(opts, GFP_KERNEL);
|
||||||
if (!options)
|
if (!tmp_options)
|
||||||
goto fail_option_alloc;
|
goto fail_option_alloc;
|
||||||
|
options = tmp_options;
|
||||||
|
|
||||||
while ((p = strsep(&options, ",")) != NULL) {
|
while ((p = strsep(&options, ",")) != NULL) {
|
||||||
int token;
|
int token;
|
||||||
|
@ -194,7 +195,8 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kfree(options);
|
|
||||||
|
kfree(tmp_options);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
fail_option_alloc:
|
fail_option_alloc:
|
||||||
|
|
|
@ -69,7 +69,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...);
|
||||||
|
|
||||||
static int parse_opts(char *opts, struct p9_client *clnt)
|
static int parse_opts(char *opts, struct p9_client *clnt)
|
||||||
{
|
{
|
||||||
char *options;
|
char *options, *tmp_options;
|
||||||
char *p;
|
char *p;
|
||||||
substring_t args[MAX_OPT_ARGS];
|
substring_t args[MAX_OPT_ARGS];
|
||||||
int option;
|
int option;
|
||||||
|
@ -81,12 +81,13 @@ static int parse_opts(char *opts, struct p9_client *clnt)
|
||||||
if (!opts)
|
if (!opts)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
options = kstrdup(opts, GFP_KERNEL);
|
tmp_options = kstrdup(opts, GFP_KERNEL);
|
||||||
if (!options) {
|
if (!tmp_options) {
|
||||||
P9_DPRINTK(P9_DEBUG_ERROR,
|
P9_DPRINTK(P9_DEBUG_ERROR,
|
||||||
"failed to allocate copy of option string\n");
|
"failed to allocate copy of option string\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
options = tmp_options;
|
||||||
|
|
||||||
while ((p = strsep(&options, ",")) != NULL) {
|
while ((p = strsep(&options, ",")) != NULL) {
|
||||||
int token;
|
int token;
|
||||||
|
@ -125,7 +126,7 @@ static int parse_opts(char *opts, struct p9_client *clnt)
|
||||||
}
|
}
|
||||||
|
|
||||||
free_and_return:
|
free_and_return:
|
||||||
kfree(options);
|
kfree(tmp_options);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -714,7 +714,7 @@ static int parse_opts(char *params, struct p9_fd_opts *opts)
|
||||||
char *p;
|
char *p;
|
||||||
substring_t args[MAX_OPT_ARGS];
|
substring_t args[MAX_OPT_ARGS];
|
||||||
int option;
|
int option;
|
||||||
char *options;
|
char *options, *tmp_options;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
opts->port = P9_PORT;
|
opts->port = P9_PORT;
|
||||||
|
@ -724,12 +724,13 @@ static int parse_opts(char *params, struct p9_fd_opts *opts)
|
||||||
if (!params)
|
if (!params)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
options = kstrdup(params, GFP_KERNEL);
|
tmp_options = kstrdup(params, GFP_KERNEL);
|
||||||
if (!options) {
|
if (!tmp_options) {
|
||||||
P9_DPRINTK(P9_DEBUG_ERROR,
|
P9_DPRINTK(P9_DEBUG_ERROR,
|
||||||
"failed to allocate copy of option string\n");
|
"failed to allocate copy of option string\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
options = tmp_options;
|
||||||
|
|
||||||
while ((p = strsep(&options, ",")) != NULL) {
|
while ((p = strsep(&options, ",")) != NULL) {
|
||||||
int token;
|
int token;
|
||||||
|
@ -760,7 +761,8 @@ static int parse_opts(char *params, struct p9_fd_opts *opts)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kfree(options);
|
|
||||||
|
kfree(tmp_options);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
|
||||||
char *p;
|
char *p;
|
||||||
substring_t args[MAX_OPT_ARGS];
|
substring_t args[MAX_OPT_ARGS];
|
||||||
int option;
|
int option;
|
||||||
char *options;
|
char *options, *tmp_options;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
opts->port = P9_PORT;
|
opts->port = P9_PORT;
|
||||||
|
@ -177,12 +177,13 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
|
||||||
if (!params)
|
if (!params)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
options = kstrdup(params, GFP_KERNEL);
|
tmp_options = kstrdup(params, GFP_KERNEL);
|
||||||
if (!options) {
|
if (!tmp_options) {
|
||||||
P9_DPRINTK(P9_DEBUG_ERROR,
|
P9_DPRINTK(P9_DEBUG_ERROR,
|
||||||
"failed to allocate copy of option string\n");
|
"failed to allocate copy of option string\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
options = tmp_options;
|
||||||
|
|
||||||
while ((p = strsep(&options, ",")) != NULL) {
|
while ((p = strsep(&options, ",")) != NULL) {
|
||||||
int token;
|
int token;
|
||||||
|
@ -216,7 +217,7 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
|
||||||
}
|
}
|
||||||
/* RQ must be at least as large as the SQ */
|
/* RQ must be at least as large as the SQ */
|
||||||
opts->rq_depth = max(opts->rq_depth, opts->sq_depth);
|
opts->rq_depth = max(opts->rq_depth, opts->sq_depth);
|
||||||
kfree(options);
|
kfree(tmp_options);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче