|
@@ -1251,12 +1251,42 @@ error:
|
|
|
}
|
|
|
EXPORT_SYMBOL(p9_client_stat);
|
|
|
|
|
|
+static int p9_client_statsize(struct p9_wstat *wst, int optional)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /* size[2] type[2] dev[4] qid[13] */
|
|
|
+ /* mode[4] atime[4] mtime[4] length[8]*/
|
|
|
+ /* name[s] uid[s] gid[s] muid[s] */
|
|
|
+ ret = 2+2+4+13+4+4+4+8+2+2+2+2;
|
|
|
+
|
|
|
+ if (wst->name)
|
|
|
+ ret += strlen(wst->name);
|
|
|
+ if (wst->uid)
|
|
|
+ ret += strlen(wst->uid);
|
|
|
+ if (wst->gid)
|
|
|
+ ret += strlen(wst->gid);
|
|
|
+ if (wst->muid)
|
|
|
+ ret += strlen(wst->muid);
|
|
|
+
|
|
|
+ if (optional) {
|
|
|
+ ret += 2+4+4+4; /* extension[s] n_uid[4] n_gid[4] n_muid[4] */
|
|
|
+ if (wst->extension)
|
|
|
+ ret += strlen(wst->extension);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst)
|
|
|
{
|
|
|
int err;
|
|
|
struct p9_req_t *req;
|
|
|
struct p9_client *clnt;
|
|
|
|
|
|
+ err = 0;
|
|
|
+ clnt = fid->clnt;
|
|
|
+ wst->size = p9_client_statsize(wst, clnt->dotu);
|
|
|
P9_DPRINTK(P9_DEBUG_9P, ">>> TWSTAT fid %d\n", fid->fid);
|
|
|
P9_DPRINTK(P9_DEBUG_9P,
|
|
|
" sz=%x type=%x dev=%x qid=%x.%llx.%x\n"
|
|
@@ -1268,10 +1298,8 @@ int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst)
|
|
|
wst->atime, wst->mtime, (unsigned long long)wst->length,
|
|
|
wst->name, wst->uid, wst->gid, wst->muid, wst->extension,
|
|
|
wst->n_uid, wst->n_gid, wst->n_muid);
|
|
|
- err = 0;
|
|
|
- clnt = fid->clnt;
|
|
|
|
|
|
- req = p9_client_rpc(clnt, P9_TWSTAT, "dwS", fid->fid, 0, wst);
|
|
|
+ req = p9_client_rpc(clnt, P9_TWSTAT, "dwS", fid->fid, wst->size, wst);
|
|
|
if (IS_ERR(req)) {
|
|
|
err = PTR_ERR(req);
|
|
|
goto error;
|