diff options
Diffstat (limited to 'net/9p/protocol.c')
-rw-r--r-- | net/9p/protocol.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/net/9p/protocol.c b/net/9p/protocol.c index 149f82160130..3acd3afb20c8 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)) |
@@ -488,6 +516,23 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, | |||
488 | } | 516 | } |
489 | } | 517 | } |
490 | break; | 518 | break; |
519 | case 'I':{ | ||
520 | struct p9_iattr_dotl *p9attr = va_arg(ap, | ||
521 | struct p9_iattr_dotl *); | ||
522 | |||
523 | errcode = p9pdu_writef(pdu, proto_version, | ||
524 | "ddddqqqqq", | ||
525 | p9attr->valid, | ||
526 | p9attr->mode, | ||
527 | p9attr->uid, | ||
528 | p9attr->gid, | ||
529 | p9attr->size, | ||
530 | p9attr->atime_sec, | ||
531 | p9attr->atime_nsec, | ||
532 | p9attr->mtime_sec, | ||
533 | p9attr->mtime_nsec); | ||
534 | } | ||
535 | break; | ||
491 | case '?': | 536 | case '?': |
492 | if ((proto_version != p9_proto_2000u) && | 537 | if ((proto_version != p9_proto_2000u) && |
493 | (proto_version != p9_proto_2000L)) | 538 | (proto_version != p9_proto_2000L)) |
@@ -580,3 +625,30 @@ void p9pdu_reset(struct p9_fcall *pdu) | |||
580 | pdu->offset = 0; | 625 | pdu->offset = 0; |
581 | pdu->size = 0; | 626 | pdu->size = 0; |
582 | } | 627 | } |
628 | |||
629 | int p9dirent_read(char *buf, int len, struct p9_dirent *dirent, | ||
630 | int proto_version) | ||
631 | { | ||
632 | struct p9_fcall fake_pdu; | ||
633 | int ret; | ||
634 | char *nameptr; | ||
635 | |||
636 | fake_pdu.size = len; | ||
637 | fake_pdu.capacity = len; | ||
638 | fake_pdu.sdata = buf; | ||
639 | fake_pdu.offset = 0; | ||
640 | |||
641 | ret = p9pdu_readf(&fake_pdu, proto_version, "Qqbs", &dirent->qid, | ||
642 | &dirent->d_off, &dirent->d_type, &nameptr); | ||
643 | if (ret) { | ||
644 | P9_DPRINTK(P9_DEBUG_9P, "<<< p9dirent_read failed: %d\n", ret); | ||
645 | p9pdu_dump(1, &fake_pdu); | ||
646 | goto out; | ||
647 | } | ||
648 | |||
649 | strcpy(dirent->d_name, nameptr); | ||
650 | |||
651 | out: | ||
652 | return fake_pdu.offset; | ||
653 | } | ||
654 | EXPORT_SYMBOL(p9dirent_read); | ||