|
@@ -450,32 +450,43 @@ static int p9_check_errors(struct p9_client *c, struct p9_req_t *req)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
- if (type == P9_RERROR) {
|
|
|
+ if (type == P9_RERROR || type == P9_RLERROR) {
|
|
|
int ecode;
|
|
|
- char *ename;
|
|
|
|
|
|
- err = p9pdu_readf(req->rc, c->proto_version, "s?d",
|
|
|
- &ename, &ecode);
|
|
|
- if (err) {
|
|
|
- P9_DPRINTK(P9_DEBUG_ERROR, "couldn't parse error%d\n",
|
|
|
- err);
|
|
|
- return err;
|
|
|
- }
|
|
|
+ if (!p9_is_proto_dotl(c)) {
|
|
|
+ char *ename;
|
|
|
|
|
|
- if (p9_is_proto_dotu(c) ||
|
|
|
- p9_is_proto_dotl(c))
|
|
|
- err = -ecode;
|
|
|
+ err = p9pdu_readf(req->rc, c->proto_version, "s?d",
|
|
|
+ &ename, &ecode);
|
|
|
+ if (err)
|
|
|
+ goto out_err;
|
|
|
|
|
|
- if (!err || !IS_ERR_VALUE(err))
|
|
|
- err = p9_errstr2errno(ename, strlen(ename));
|
|
|
+ if (p9_is_proto_dotu(c))
|
|
|
+ err = -ecode;
|
|
|
|
|
|
- P9_DPRINTK(P9_DEBUG_9P, "<<< RERROR (%d) %s\n", -ecode, ename);
|
|
|
+ if (!err || !IS_ERR_VALUE(err)) {
|
|
|
+ err = p9_errstr2errno(ename, strlen(ename));
|
|
|
+
|
|
|
+ P9_DPRINTK(P9_DEBUG_9P, "<<< RERROR (%d) %s\n", -ecode, ename);
|
|
|
+
|
|
|
+ kfree(ename);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ err = p9pdu_readf(req->rc, c->proto_version, "d", &ecode);
|
|
|
+ err = -ecode;
|
|
|
+
|
|
|
+ P9_DPRINTK(P9_DEBUG_9P, "<<< RLERROR (%d)\n", -ecode);
|
|
|
+ }
|
|
|
|
|
|
- kfree(ename);
|
|
|
} else
|
|
|
err = 0;
|
|
|
|
|
|
return err;
|
|
|
+
|
|
|
+out_err:
|
|
|
+ P9_DPRINTK(P9_DEBUG_ERROR, "couldn't parse error%d\n", err);
|
|
|
+
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
/**
|