diff options
-rw-r--r-- | net/9p/client.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index 1eb580c38fbb..93f442aaa119 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -1251,12 +1251,42 @@ error: | |||
1251 | } | 1251 | } |
1252 | EXPORT_SYMBOL(p9_client_stat); | 1252 | EXPORT_SYMBOL(p9_client_stat); |
1253 | 1253 | ||
1254 | static int p9_client_statsize(struct p9_wstat *wst, int optional) | ||
1255 | { | ||
1256 | int ret; | ||
1257 | |||
1258 | /* size[2] type[2] dev[4] qid[13] */ | ||
1259 | /* mode[4] atime[4] mtime[4] length[8]*/ | ||
1260 | /* name[s] uid[s] gid[s] muid[s] */ | ||
1261 | ret = 2+2+4+13+4+4+4+8+2+2+2+2; | ||
1262 | |||
1263 | if (wst->name) | ||
1264 | ret += strlen(wst->name); | ||
1265 | if (wst->uid) | ||
1266 | ret += strlen(wst->uid); | ||
1267 | if (wst->gid) | ||
1268 | ret += strlen(wst->gid); | ||
1269 | if (wst->muid) | ||
1270 | ret += strlen(wst->muid); | ||
1271 | |||
1272 | if (optional) { | ||
1273 | ret += 2+4+4+4; /* extension[s] n_uid[4] n_gid[4] n_muid[4] */ | ||
1274 | if (wst->extension) | ||
1275 | ret += strlen(wst->extension); | ||
1276 | } | ||
1277 | |||
1278 | return ret; | ||
1279 | } | ||
1280 | |||
1254 | int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst) | 1281 | int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst) |
1255 | { | 1282 | { |
1256 | int err; | 1283 | int err; |
1257 | struct p9_req_t *req; | 1284 | struct p9_req_t *req; |
1258 | struct p9_client *clnt; | 1285 | struct p9_client *clnt; |
1259 | 1286 | ||
1287 | err = 0; | ||
1288 | clnt = fid->clnt; | ||
1289 | wst->size = p9_client_statsize(wst, clnt->dotu); | ||
1260 | P9_DPRINTK(P9_DEBUG_9P, ">>> TWSTAT fid %d\n", fid->fid); | 1290 | P9_DPRINTK(P9_DEBUG_9P, ">>> TWSTAT fid %d\n", fid->fid); |
1261 | P9_DPRINTK(P9_DEBUG_9P, | 1291 | P9_DPRINTK(P9_DEBUG_9P, |
1262 | " sz=%x type=%x dev=%x qid=%x.%llx.%x\n" | 1292 | " 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) | |||
1268 | wst->atime, wst->mtime, (unsigned long long)wst->length, | 1298 | wst->atime, wst->mtime, (unsigned long long)wst->length, |
1269 | wst->name, wst->uid, wst->gid, wst->muid, wst->extension, | 1299 | wst->name, wst->uid, wst->gid, wst->muid, wst->extension, |
1270 | wst->n_uid, wst->n_gid, wst->n_muid); | 1300 | wst->n_uid, wst->n_gid, wst->n_muid); |
1271 | err = 0; | ||
1272 | clnt = fid->clnt; | ||
1273 | 1301 | ||
1274 | req = p9_client_rpc(clnt, P9_TWSTAT, "dwS", fid->fid, 0, wst); | 1302 | req = p9_client_rpc(clnt, P9_TWSTAT, "dwS", fid->fid, wst->size, wst); |
1275 | if (IS_ERR(req)) { | 1303 | if (IS_ERR(req)) { |
1276 | err = PTR_ERR(req); | 1304 | err = PTR_ERR(req); |
1277 | goto error; | 1305 | goto error; |