diff options
author | Matthew Wilcox <willy@infradead.org> | 2018-07-11 17:02:21 -0400 |
---|---|---|
committer | Dominique Martinet <dominique.martinet@cea.fr> | 2018-08-12 20:21:44 -0400 |
commit | b5303be2bee3c8b29de3f7f4ea8ae00c4e816760 (patch) | |
tree | ec2fe0f66140706c972f18502459d868aa2ec3a5 /net/9p | |
parent | 2d58f63f72f28ba297a9ae344a5b5f0cf75bcd94 (diff) |
9p: Change p9_fid_create calling convention
Return NULL instead of ERR_PTR when we can't allocate a FID. The ENOSPC
return value was getting all the way back to userspace, and that's
confusing for a userspace program which isn't expecting read() to tell it
there's no space left on the filesystem. The best error we can return to
indicate a temporary failure caused by lack of client resources is ENOMEM.
Maybe it would be better to sleep until a FID is available, but that's
not a change I'm comfortable making.
Link: http://lkml.kernel.org/r/20180711210225.19730-3-willy@infradead.org
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Reviewed-by: Jun Piao <piaojun@huawei.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Yiwen Jiang <jiangyiwen@huwei.com>
Cc: Eric Van Hensbergen <ericvh@gmail.com>
Cc: Ron Minnich <rminnich@sandia.gov>
Cc: Latchesar Ionkov <lucho@ionkov.net>
Signed-off-by: Dominique Martinet <dominique.martinet@cea.fr>
Diffstat (limited to 'net/9p')
-rw-r--r-- | net/9p/client.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index cae1fb43bd16..7c317d39bf62 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -914,13 +914,11 @@ static struct p9_fid *p9_fid_create(struct p9_client *clnt) | |||
914 | p9_debug(P9_DEBUG_FID, "clnt %p\n", clnt); | 914 | p9_debug(P9_DEBUG_FID, "clnt %p\n", clnt); |
915 | fid = kmalloc(sizeof(struct p9_fid), GFP_KERNEL); | 915 | fid = kmalloc(sizeof(struct p9_fid), GFP_KERNEL); |
916 | if (!fid) | 916 | if (!fid) |
917 | return ERR_PTR(-ENOMEM); | 917 | return NULL; |
918 | 918 | ||
919 | ret = p9_idpool_get(clnt->fidpool); | 919 | ret = p9_idpool_get(clnt->fidpool); |
920 | if (ret < 0) { | 920 | if (ret < 0) |
921 | ret = -ENOSPC; | ||
922 | goto error; | 921 | goto error; |
923 | } | ||
924 | fid->fid = ret; | 922 | fid->fid = ret; |
925 | 923 | ||
926 | memset(&fid->qid, 0, sizeof(struct p9_qid)); | 924 | memset(&fid->qid, 0, sizeof(struct p9_qid)); |
@@ -936,7 +934,7 @@ static struct p9_fid *p9_fid_create(struct p9_client *clnt) | |||
936 | 934 | ||
937 | error: | 935 | error: |
938 | kfree(fid); | 936 | kfree(fid); |
939 | return ERR_PTR(ret); | 937 | return NULL; |
940 | } | 938 | } |
941 | 939 | ||
942 | static void p9_fid_destroy(struct p9_fid *fid) | 940 | static void p9_fid_destroy(struct p9_fid *fid) |
@@ -1138,9 +1136,8 @@ struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, | |||
1138 | p9_debug(P9_DEBUG_9P, ">>> TATTACH afid %d uname %s aname %s\n", | 1136 | p9_debug(P9_DEBUG_9P, ">>> TATTACH afid %d uname %s aname %s\n", |
1139 | afid ? afid->fid : -1, uname, aname); | 1137 | afid ? afid->fid : -1, uname, aname); |
1140 | fid = p9_fid_create(clnt); | 1138 | fid = p9_fid_create(clnt); |
1141 | if (IS_ERR(fid)) { | 1139 | if (!fid) { |
1142 | err = PTR_ERR(fid); | 1140 | err = -ENOMEM; |
1143 | fid = NULL; | ||
1144 | goto error; | 1141 | goto error; |
1145 | } | 1142 | } |
1146 | fid->uid = n_uname; | 1143 | fid->uid = n_uname; |
@@ -1189,9 +1186,8 @@ struct p9_fid *p9_client_walk(struct p9_fid *oldfid, uint16_t nwname, | |||
1189 | clnt = oldfid->clnt; | 1186 | clnt = oldfid->clnt; |
1190 | if (clone) { | 1187 | if (clone) { |
1191 | fid = p9_fid_create(clnt); | 1188 | fid = p9_fid_create(clnt); |
1192 | if (IS_ERR(fid)) { | 1189 | if (!fid) { |
1193 | err = PTR_ERR(fid); | 1190 | err = -ENOMEM; |
1194 | fid = NULL; | ||
1195 | goto error; | 1191 | goto error; |
1196 | } | 1192 | } |
1197 | 1193 | ||
@@ -2019,9 +2015,8 @@ struct p9_fid *p9_client_xattrwalk(struct p9_fid *file_fid, | |||
2019 | err = 0; | 2015 | err = 0; |
2020 | clnt = file_fid->clnt; | 2016 | clnt = file_fid->clnt; |
2021 | attr_fid = p9_fid_create(clnt); | 2017 | attr_fid = p9_fid_create(clnt); |
2022 | if (IS_ERR(attr_fid)) { | 2018 | if (!attr_fid) { |
2023 | err = PTR_ERR(attr_fid); | 2019 | err = -ENOMEM; |
2024 | attr_fid = NULL; | ||
2025 | goto error; | 2020 | goto error; |
2026 | } | 2021 | } |
2027 | p9_debug(P9_DEBUG_9P, | 2022 | p9_debug(P9_DEBUG_9P, |