diff options
Diffstat (limited to 'fs/lockd/mon.c')
-rw-r--r-- | fs/lockd/mon.c | 110 |
1 files changed, 42 insertions, 68 deletions
diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c index e0c918949644..23d7451b2938 100644 --- a/fs/lockd/mon.c +++ b/fs/lockd/mon.c | |||
@@ -401,26 +401,22 @@ void nsm_release(struct nsm_handle *nsm) | |||
401 | * Status Monitor wire protocol. | 401 | * Status Monitor wire protocol. |
402 | */ | 402 | */ |
403 | 403 | ||
404 | static int encode_nsm_string(struct xdr_stream *xdr, const char *string) | 404 | static void encode_nsm_string(struct xdr_stream *xdr, const char *string) |
405 | { | 405 | { |
406 | const u32 len = strlen(string); | 406 | const u32 len = strlen(string); |
407 | __be32 *p; | 407 | __be32 *p; |
408 | 408 | ||
409 | if (unlikely(len > SM_MAXSTRLEN)) | 409 | BUG_ON(len > SM_MAXSTRLEN); |
410 | return -EIO; | 410 | p = xdr_reserve_space(xdr, 4 + len); |
411 | p = xdr_reserve_space(xdr, sizeof(u32) + len); | ||
412 | if (unlikely(p == NULL)) | ||
413 | return -EIO; | ||
414 | xdr_encode_opaque(p, string, len); | 411 | xdr_encode_opaque(p, string, len); |
415 | return 0; | ||
416 | } | 412 | } |
417 | 413 | ||
418 | /* | 414 | /* |
419 | * "mon_name" specifies the host to be monitored. | 415 | * "mon_name" specifies the host to be monitored. |
420 | */ | 416 | */ |
421 | static int encode_mon_name(struct xdr_stream *xdr, const struct nsm_args *argp) | 417 | static void encode_mon_name(struct xdr_stream *xdr, const struct nsm_args *argp) |
422 | { | 418 | { |
423 | return encode_nsm_string(xdr, argp->mon_name); | 419 | encode_nsm_string(xdr, argp->mon_name); |
424 | } | 420 | } |
425 | 421 | ||
426 | /* | 422 | /* |
@@ -429,35 +425,25 @@ static int encode_mon_name(struct xdr_stream *xdr, const struct nsm_args *argp) | |||
429 | * (via the NLMPROC_SM_NOTIFY call) that the state of host "mon_name" | 425 | * (via the NLMPROC_SM_NOTIFY call) that the state of host "mon_name" |
430 | * has changed. | 426 | * has changed. |
431 | */ | 427 | */ |
432 | static int encode_my_id(struct xdr_stream *xdr, const struct nsm_args *argp) | 428 | static void encode_my_id(struct xdr_stream *xdr, const struct nsm_args *argp) |
433 | { | 429 | { |
434 | int status; | ||
435 | __be32 *p; | 430 | __be32 *p; |
436 | 431 | ||
437 | status = encode_nsm_string(xdr, utsname()->nodename); | 432 | encode_nsm_string(xdr, utsname()->nodename); |
438 | if (unlikely(status != 0)) | 433 | p = xdr_reserve_space(xdr, 4 + 4 + 4); |
439 | return status; | 434 | *p++ = cpu_to_be32(argp->prog); |
440 | p = xdr_reserve_space(xdr, 3 * sizeof(u32)); | 435 | *p++ = cpu_to_be32(argp->vers); |
441 | if (unlikely(p == NULL)) | 436 | *p = cpu_to_be32(argp->proc); |
442 | return -EIO; | ||
443 | *p++ = htonl(argp->prog); | ||
444 | *p++ = htonl(argp->vers); | ||
445 | *p++ = htonl(argp->proc); | ||
446 | return 0; | ||
447 | } | 437 | } |
448 | 438 | ||
449 | /* | 439 | /* |
450 | * The "mon_id" argument specifies the non-private arguments | 440 | * The "mon_id" argument specifies the non-private arguments |
451 | * of an NSMPROC_MON or NSMPROC_UNMON call. | 441 | * of an NSMPROC_MON or NSMPROC_UNMON call. |
452 | */ | 442 | */ |
453 | static int encode_mon_id(struct xdr_stream *xdr, const struct nsm_args *argp) | 443 | static void encode_mon_id(struct xdr_stream *xdr, const struct nsm_args *argp) |
454 | { | 444 | { |
455 | int status; | 445 | encode_mon_name(xdr, argp); |
456 | 446 | encode_my_id(xdr, argp); | |
457 | status = encode_mon_name(xdr, argp); | ||
458 | if (unlikely(status != 0)) | ||
459 | return status; | ||
460 | return encode_my_id(xdr, argp); | ||
461 | } | 447 | } |
462 | 448 | ||
463 | /* | 449 | /* |
@@ -465,68 +451,56 @@ static int encode_mon_id(struct xdr_stream *xdr, const struct nsm_args *argp) | |||
465 | * by the NSMPROC_MON call. This information will be supplied in the | 451 | * by the NSMPROC_MON call. This information will be supplied in the |
466 | * NLMPROC_SM_NOTIFY call. | 452 | * NLMPROC_SM_NOTIFY call. |
467 | */ | 453 | */ |
468 | static int encode_priv(struct xdr_stream *xdr, const struct nsm_args *argp) | 454 | static void encode_priv(struct xdr_stream *xdr, const struct nsm_args *argp) |
469 | { | 455 | { |
470 | __be32 *p; | 456 | __be32 *p; |
471 | 457 | ||
472 | p = xdr_reserve_space(xdr, SM_PRIV_SIZE); | 458 | p = xdr_reserve_space(xdr, SM_PRIV_SIZE); |
473 | if (unlikely(p == NULL)) | ||
474 | return -EIO; | ||
475 | xdr_encode_opaque_fixed(p, argp->priv->data, SM_PRIV_SIZE); | 459 | xdr_encode_opaque_fixed(p, argp->priv->data, SM_PRIV_SIZE); |
476 | return 0; | ||
477 | } | 460 | } |
478 | 461 | ||
479 | static int xdr_enc_mon(struct rpc_rqst *req, __be32 *p, | 462 | static void nsm_xdr_enc_mon(struct rpc_rqst *req, struct xdr_stream *xdr, |
480 | const struct nsm_args *argp) | 463 | const struct nsm_args *argp) |
481 | { | 464 | { |
482 | struct xdr_stream xdr; | 465 | encode_mon_id(xdr, argp); |
483 | int status; | 466 | encode_priv(xdr, argp); |
484 | |||
485 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | ||
486 | status = encode_mon_id(&xdr, argp); | ||
487 | if (unlikely(status)) | ||
488 | return status; | ||
489 | return encode_priv(&xdr, argp); | ||
490 | } | 467 | } |
491 | 468 | ||
492 | static int xdr_enc_unmon(struct rpc_rqst *req, __be32 *p, | 469 | static void nsm_xdr_enc_unmon(struct rpc_rqst *req, struct xdr_stream *xdr, |
493 | const struct nsm_args *argp) | 470 | const struct nsm_args *argp) |
494 | { | 471 | { |
495 | struct xdr_stream xdr; | 472 | encode_mon_id(xdr, argp); |
496 | |||
497 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | ||
498 | return encode_mon_id(&xdr, argp); | ||
499 | } | 473 | } |
500 | 474 | ||
501 | static int xdr_dec_stat_res(struct rpc_rqst *rqstp, __be32 *p, | 475 | static int nsm_xdr_dec_stat_res(struct rpc_rqst *rqstp, |
502 | struct nsm_res *resp) | 476 | struct xdr_stream *xdr, |
477 | struct nsm_res *resp) | ||
503 | { | 478 | { |
504 | struct xdr_stream xdr; | 479 | __be32 *p; |
505 | 480 | ||
506 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 481 | p = xdr_inline_decode(xdr, 4 + 4); |
507 | p = xdr_inline_decode(&xdr, 2 * sizeof(u32)); | ||
508 | if (unlikely(p == NULL)) | 482 | if (unlikely(p == NULL)) |
509 | return -EIO; | 483 | return -EIO; |
510 | resp->status = ntohl(*p++); | 484 | resp->status = be32_to_cpup(p++); |
511 | resp->state = ntohl(*p); | 485 | resp->state = be32_to_cpup(p); |
512 | 486 | ||
513 | dprintk("lockd: xdr_dec_stat_res status %d state %d\n", | 487 | dprintk("lockd: %s status %d state %d\n", |
514 | resp->status, resp->state); | 488 | __func__, resp->status, resp->state); |
515 | return 0; | 489 | return 0; |
516 | } | 490 | } |
517 | 491 | ||
518 | static int xdr_dec_stat(struct rpc_rqst *rqstp, __be32 *p, | 492 | static int nsm_xdr_dec_stat(struct rpc_rqst *rqstp, |
519 | struct nsm_res *resp) | 493 | struct xdr_stream *xdr, |
494 | struct nsm_res *resp) | ||
520 | { | 495 | { |
521 | struct xdr_stream xdr; | 496 | __be32 *p; |
522 | 497 | ||
523 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 498 | p = xdr_inline_decode(xdr, 4); |
524 | p = xdr_inline_decode(&xdr, sizeof(u32)); | ||
525 | if (unlikely(p == NULL)) | 499 | if (unlikely(p == NULL)) |
526 | return -EIO; | 500 | return -EIO; |
527 | resp->state = ntohl(*p); | 501 | resp->state = be32_to_cpup(p); |
528 | 502 | ||
529 | dprintk("lockd: xdr_dec_stat state %d\n", resp->state); | 503 | dprintk("lockd: %s state %d\n", __func__, resp->state); |
530 | return 0; | 504 | return 0; |
531 | } | 505 | } |
532 | 506 | ||
@@ -542,8 +516,8 @@ static int xdr_dec_stat(struct rpc_rqst *rqstp, __be32 *p, | |||
542 | static struct rpc_procinfo nsm_procedures[] = { | 516 | static struct rpc_procinfo nsm_procedures[] = { |
543 | [NSMPROC_MON] = { | 517 | [NSMPROC_MON] = { |
544 | .p_proc = NSMPROC_MON, | 518 | .p_proc = NSMPROC_MON, |
545 | .p_encode = (kxdrproc_t)xdr_enc_mon, | 519 | .p_encode = (kxdreproc_t)nsm_xdr_enc_mon, |
546 | .p_decode = (kxdrproc_t)xdr_dec_stat_res, | 520 | .p_decode = (kxdrdproc_t)nsm_xdr_dec_stat_res, |
547 | .p_arglen = SM_mon_sz, | 521 | .p_arglen = SM_mon_sz, |
548 | .p_replen = SM_monres_sz, | 522 | .p_replen = SM_monres_sz, |
549 | .p_statidx = NSMPROC_MON, | 523 | .p_statidx = NSMPROC_MON, |
@@ -551,8 +525,8 @@ static struct rpc_procinfo nsm_procedures[] = { | |||
551 | }, | 525 | }, |
552 | [NSMPROC_UNMON] = { | 526 | [NSMPROC_UNMON] = { |
553 | .p_proc = NSMPROC_UNMON, | 527 | .p_proc = NSMPROC_UNMON, |
554 | .p_encode = (kxdrproc_t)xdr_enc_unmon, | 528 | .p_encode = (kxdreproc_t)nsm_xdr_enc_unmon, |
555 | .p_decode = (kxdrproc_t)xdr_dec_stat, | 529 | .p_decode = (kxdrdproc_t)nsm_xdr_dec_stat, |
556 | .p_arglen = SM_mon_id_sz, | 530 | .p_arglen = SM_mon_id_sz, |
557 | .p_replen = SM_unmonres_sz, | 531 | .p_replen = SM_unmonres_sz, |
558 | .p_statidx = NSMPROC_UNMON, | 532 | .p_statidx = NSMPROC_UNMON, |