diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/9p/client.c | 59 | ||||
-rw-r--r-- | net/9p/protocol.c | 28 |
2 files changed, 87 insertions, 0 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index 4ff068e98f76..5e97118da3bf 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -1303,6 +1303,65 @@ error: | |||
1303 | } | 1303 | } |
1304 | EXPORT_SYMBOL(p9_client_stat); | 1304 | EXPORT_SYMBOL(p9_client_stat); |
1305 | 1305 | ||
1306 | struct p9_stat_dotl *p9_client_getattr_dotl(struct p9_fid *fid, | ||
1307 | u64 request_mask) | ||
1308 | { | ||
1309 | int err; | ||
1310 | struct p9_client *clnt; | ||
1311 | struct p9_stat_dotl *ret = kmalloc(sizeof(struct p9_stat_dotl), | ||
1312 | GFP_KERNEL); | ||
1313 | struct p9_req_t *req; | ||
1314 | |||
1315 | P9_DPRINTK(P9_DEBUG_9P, ">>> TGETATTR fid %d, request_mask %lld\n", | ||
1316 | fid->fid, request_mask); | ||
1317 | |||
1318 | if (!ret) | ||
1319 | return ERR_PTR(-ENOMEM); | ||
1320 | |||
1321 | err = 0; | ||
1322 | clnt = fid->clnt; | ||
1323 | |||
1324 | req = p9_client_rpc(clnt, P9_TGETATTR, "dq", fid->fid, request_mask); | ||
1325 | if (IS_ERR(req)) { | ||
1326 | err = PTR_ERR(req); | ||
1327 | goto error; | ||
1328 | } | ||
1329 | |||
1330 | err = p9pdu_readf(req->rc, clnt->proto_version, "A", ret); | ||
1331 | if (err) { | ||
1332 | p9pdu_dump(1, req->rc); | ||
1333 | p9_free_req(clnt, req); | ||
1334 | goto error; | ||
1335 | } | ||
1336 | |||
1337 | P9_DPRINTK(P9_DEBUG_9P, | ||
1338 | "<<< RGETATTR st_result_mask=%lld\n" | ||
1339 | "<<< qid=%x.%llx.%x\n" | ||
1340 | "<<< st_mode=%8.8x st_nlink=%llu\n" | ||
1341 | "<<< st_uid=%d st_gid=%d\n" | ||
1342 | "<<< st_rdev=%llx st_size=%llx st_blksize=%llu st_blocks=%llu\n" | ||
1343 | "<<< st_atime_sec=%lld st_atime_nsec=%lld\n" | ||
1344 | "<<< st_mtime_sec=%lld st_mtime_nsec=%lld\n" | ||
1345 | "<<< st_ctime_sec=%lld st_ctime_nsec=%lld\n" | ||
1346 | "<<< st_btime_sec=%lld st_btime_nsec=%lld\n" | ||
1347 | "<<< st_gen=%lld st_data_version=%lld", | ||
1348 | ret->st_result_mask, ret->qid.type, ret->qid.path, | ||
1349 | ret->qid.version, ret->st_mode, ret->st_nlink, ret->st_uid, | ||
1350 | ret->st_gid, ret->st_rdev, ret->st_size, ret->st_blksize, | ||
1351 | ret->st_blocks, ret->st_atime_sec, ret->st_atime_nsec, | ||
1352 | ret->st_mtime_sec, ret->st_mtime_nsec, ret->st_ctime_sec, | ||
1353 | ret->st_ctime_nsec, ret->st_btime_sec, ret->st_btime_nsec, | ||
1354 | ret->st_gen, ret->st_data_version); | ||
1355 | |||
1356 | p9_free_req(clnt, req); | ||
1357 | return ret; | ||
1358 | |||
1359 | error: | ||
1360 | kfree(ret); | ||
1361 | return ERR_PTR(err); | ||
1362 | } | ||
1363 | EXPORT_SYMBOL(p9_client_getattr_dotl); | ||
1364 | |||
1306 | static int p9_client_statsize(struct p9_wstat *wst, int proto_version) | 1365 | static int p9_client_statsize(struct p9_wstat *wst, int proto_version) |
1307 | { | 1366 | { |
1308 | int ret; | 1367 | int ret; |
diff --git a/net/9p/protocol.c b/net/9p/protocol.c index b645c8263538..3e4f77695891 100644 --- a/net/9p/protocol.c +++ b/net/9p/protocol.c | |||
@@ -141,6 +141,7 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size) | |||
141 | D - data blob (int32_t size followed by void *, results are not freed) | 141 | D - data blob (int32_t size followed by void *, results are not freed) |
142 | T - array of strings (int16_t count, followed by strings) | 142 | T - array of strings (int16_t count, followed by strings) |
143 | R - array of qids (int16_t count, followed by qids) | 143 | R - array of qids (int16_t count, followed by qids) |
144 | A - stat for 9p2000.L (p9_stat_dotl) | ||
144 | ? - if optional = 1, continue parsing | 145 | ? - if optional = 1, continue parsing |
145 | */ | 146 | */ |
146 | 147 | ||
@@ -340,6 +341,33 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt, | |||
340 | } | 341 | } |
341 | } | 342 | } |
342 | break; | 343 | break; |
344 | case 'A': { | ||
345 | struct p9_stat_dotl *stbuf = | ||
346 | va_arg(ap, struct p9_stat_dotl *); | ||
347 | |||
348 | memset(stbuf, 0, sizeof(struct p9_stat_dotl)); | ||
349 | errcode = | ||
350 | p9pdu_readf(pdu, proto_version, | ||
351 | "qQdddqqqqqqqqqqqqqqq", | ||
352 | &stbuf->st_result_mask, | ||
353 | &stbuf->qid, | ||
354 | &stbuf->st_mode, | ||
355 | &stbuf->st_uid, &stbuf->st_gid, | ||
356 | &stbuf->st_nlink, | ||
357 | &stbuf->st_rdev, &stbuf->st_size, | ||
358 | &stbuf->st_blksize, &stbuf->st_blocks, | ||
359 | &stbuf->st_atime_sec, | ||
360 | &stbuf->st_atime_nsec, | ||
361 | &stbuf->st_mtime_sec, | ||
362 | &stbuf->st_mtime_nsec, | ||
363 | &stbuf->st_ctime_sec, | ||
364 | &stbuf->st_ctime_nsec, | ||
365 | &stbuf->st_btime_sec, | ||
366 | &stbuf->st_btime_nsec, | ||
367 | &stbuf->st_gen, | ||
368 | &stbuf->st_data_version); | ||
369 | } | ||
370 | break; | ||
343 | case '?': | 371 | case '?': |
344 | if ((proto_version != p9_proto_2000u) && | 372 | if ((proto_version != p9_proto_2000u) && |
345 | (proto_version != p9_proto_2000L)) | 373 | (proto_version != p9_proto_2000L)) |