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); | ||
