hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/fs/lockd/svc4proc.c
....@@ -46,8 +46,14 @@
4646
4747 /* Set up the missing parts of the file_lock structure */
4848 lock->fl.fl_file = file->f_file;
49
- lock->fl.fl_owner = (fl_owner_t) host;
49
+ lock->fl.fl_pid = current->tgid;
5050 lock->fl.fl_lmops = &nlmsvc_lock_operations;
51
+ nlmsvc_locks_init_private(&lock->fl, host, (pid_t)lock->svid);
52
+ if (!lock->fl.fl_owner) {
53
+ /* lockowner allocation has failed */
54
+ nlmsvc_release_host(host);
55
+ return nlm_lck_denied_nolocks;
56
+ }
5157 }
5258
5359 return 0;
....@@ -94,6 +100,7 @@
94100 else
95101 dprintk("lockd: TEST4 status %d\n", ntohl(resp->status));
96102
103
+ nlmsvc_release_lockowner(&argp->lock);
97104 nlmsvc_release_host(host);
98105 nlm_release_file(file);
99106 return rc;
....@@ -142,6 +149,7 @@
142149 else
143150 dprintk("lockd: LOCK status %d\n", ntohl(resp->status));
144151
152
+ nlmsvc_release_lockowner(&argp->lock);
145153 nlmsvc_release_host(host);
146154 nlm_release_file(file);
147155 return rc;
....@@ -178,6 +186,7 @@
178186 resp->status = nlmsvc_cancel_blocked(SVC_NET(rqstp), file, &argp->lock);
179187
180188 dprintk("lockd: CANCEL status %d\n", ntohl(resp->status));
189
+ nlmsvc_release_lockowner(&argp->lock);
181190 nlmsvc_release_host(host);
182191 nlm_release_file(file);
183192 return rpc_success;
....@@ -217,6 +226,7 @@
217226 resp->status = nlmsvc_unlock(SVC_NET(rqstp), file, &argp->lock);
218227
219228 dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status));
229
+ nlmsvc_release_lockowner(&argp->lock);
220230 nlmsvc_release_host(host);
221231 nlm_release_file(file);
222232 return rpc_success;
....@@ -365,6 +375,7 @@
365375 resp->status = nlmsvc_share_file(host, file, argp);
366376
367377 dprintk("lockd: SHARE status %d\n", ntohl(resp->status));
378
+ nlmsvc_release_lockowner(&argp->lock);
368379 nlmsvc_release_host(host);
369380 nlm_release_file(file);
370381 return rpc_success;
....@@ -399,6 +410,7 @@
399410 resp->status = nlmsvc_unshare_file(host, file, argp);
400411
401412 dprintk("lockd: UNSHARE status %d\n", ntohl(resp->status));
413
+ nlmsvc_release_lockowner(&argp->lock);
402414 nlmsvc_release_host(host);
403415 nlm_release_file(file);
404416 return rpc_success;
....@@ -474,65 +486,215 @@
474486 return rpc_success;
475487 }
476488
489
+static __be32
490
+nlm4svc_proc_unused(struct svc_rqst *rqstp)
491
+{
492
+ return rpc_proc_unavail;
493
+}
494
+
477495
478496 /*
479497 * NLM Server procedures.
480498 */
481499
482
-#define nlm4svc_encode_norep nlm4svc_encode_void
483
-#define nlm4svc_decode_norep nlm4svc_decode_void
484
-#define nlm4svc_decode_testres nlm4svc_decode_void
485
-#define nlm4svc_decode_lockres nlm4svc_decode_void
486
-#define nlm4svc_decode_unlockres nlm4svc_decode_void
487
-#define nlm4svc_decode_cancelres nlm4svc_decode_void
488
-#define nlm4svc_decode_grantedres nlm4svc_decode_void
489
-
490
-#define nlm4svc_proc_none nlm4svc_proc_null
491
-#define nlm4svc_proc_test_res nlm4svc_proc_null
492
-#define nlm4svc_proc_lock_res nlm4svc_proc_null
493
-#define nlm4svc_proc_cancel_res nlm4svc_proc_null
494
-#define nlm4svc_proc_unlock_res nlm4svc_proc_null
495
-
496500 struct nlm_void { int dummy; };
497501
498
-#define PROC(name, xargt, xrest, argt, rest, respsize) \
499
- { .pc_func = nlm4svc_proc_##name, \
500
- .pc_decode = nlm4svc_decode_##xargt, \
501
- .pc_encode = nlm4svc_encode_##xrest, \
502
- .pc_release = NULL, \
503
- .pc_argsize = sizeof(struct nlm_##argt), \
504
- .pc_ressize = sizeof(struct nlm_##rest), \
505
- .pc_xdrressize = respsize, \
506
- }
507502 #define Ck (1+XDR_QUADLEN(NLM_MAXCOOKIELEN)) /* cookie */
508503 #define No (1+1024/4) /* netobj */
509504 #define St 1 /* status */
510505 #define Rg 4 /* range (offset + length) */
511
-const struct svc_procedure nlmsvc_procedures4[] = {
512
- PROC(null, void, void, void, void, 1),
513
- PROC(test, testargs, testres, args, res, Ck+St+2+No+Rg),
514
- PROC(lock, lockargs, res, args, res, Ck+St),
515
- PROC(cancel, cancargs, res, args, res, Ck+St),
516
- PROC(unlock, unlockargs, res, args, res, Ck+St),
517
- PROC(granted, testargs, res, args, res, Ck+St),
518
- PROC(test_msg, testargs, norep, args, void, 1),
519
- PROC(lock_msg, lockargs, norep, args, void, 1),
520
- PROC(cancel_msg, cancargs, norep, args, void, 1),
521
- PROC(unlock_msg, unlockargs, norep, args, void, 1),
522
- PROC(granted_msg, testargs, norep, args, void, 1),
523
- PROC(test_res, testres, norep, res, void, 1),
524
- PROC(lock_res, lockres, norep, res, void, 1),
525
- PROC(cancel_res, cancelres, norep, res, void, 1),
526
- PROC(unlock_res, unlockres, norep, res, void, 1),
527
- PROC(granted_res, res, norep, res, void, 1),
528
- /* statd callback */
529
- PROC(sm_notify, reboot, void, reboot, void, 1),
530
- PROC(none, void, void, void, void, 0),
531
- PROC(none, void, void, void, void, 0),
532
- PROC(none, void, void, void, void, 0),
533
- PROC(share, shareargs, shareres, args, res, Ck+St+1),
534
- PROC(unshare, shareargs, shareres, args, res, Ck+St+1),
535
- PROC(nm_lock, lockargs, res, args, res, Ck+St),
536
- PROC(free_all, notify, void, args, void, 1),
537506
507
+const struct svc_procedure nlmsvc_procedures4[24] = {
508
+ [NLMPROC_NULL] = {
509
+ .pc_func = nlm4svc_proc_null,
510
+ .pc_decode = nlm4svc_decode_void,
511
+ .pc_encode = nlm4svc_encode_void,
512
+ .pc_argsize = sizeof(struct nlm_void),
513
+ .pc_ressize = sizeof(struct nlm_void),
514
+ .pc_xdrressize = St,
515
+ },
516
+ [NLMPROC_TEST] = {
517
+ .pc_func = nlm4svc_proc_test,
518
+ .pc_decode = nlm4svc_decode_testargs,
519
+ .pc_encode = nlm4svc_encode_testres,
520
+ .pc_argsize = sizeof(struct nlm_args),
521
+ .pc_ressize = sizeof(struct nlm_res),
522
+ .pc_xdrressize = Ck+St+2+No+Rg,
523
+ },
524
+ [NLMPROC_LOCK] = {
525
+ .pc_func = nlm4svc_proc_lock,
526
+ .pc_decode = nlm4svc_decode_lockargs,
527
+ .pc_encode = nlm4svc_encode_res,
528
+ .pc_argsize = sizeof(struct nlm_args),
529
+ .pc_ressize = sizeof(struct nlm_res),
530
+ .pc_xdrressize = Ck+St,
531
+ },
532
+ [NLMPROC_CANCEL] = {
533
+ .pc_func = nlm4svc_proc_cancel,
534
+ .pc_decode = nlm4svc_decode_cancargs,
535
+ .pc_encode = nlm4svc_encode_res,
536
+ .pc_argsize = sizeof(struct nlm_args),
537
+ .pc_ressize = sizeof(struct nlm_res),
538
+ .pc_xdrressize = Ck+St,
539
+ },
540
+ [NLMPROC_UNLOCK] = {
541
+ .pc_func = nlm4svc_proc_unlock,
542
+ .pc_decode = nlm4svc_decode_unlockargs,
543
+ .pc_encode = nlm4svc_encode_res,
544
+ .pc_argsize = sizeof(struct nlm_args),
545
+ .pc_ressize = sizeof(struct nlm_res),
546
+ .pc_xdrressize = Ck+St,
547
+ },
548
+ [NLMPROC_GRANTED] = {
549
+ .pc_func = nlm4svc_proc_granted,
550
+ .pc_decode = nlm4svc_decode_testargs,
551
+ .pc_encode = nlm4svc_encode_res,
552
+ .pc_argsize = sizeof(struct nlm_args),
553
+ .pc_ressize = sizeof(struct nlm_res),
554
+ .pc_xdrressize = Ck+St,
555
+ },
556
+ [NLMPROC_TEST_MSG] = {
557
+ .pc_func = nlm4svc_proc_test_msg,
558
+ .pc_decode = nlm4svc_decode_testargs,
559
+ .pc_encode = nlm4svc_encode_void,
560
+ .pc_argsize = sizeof(struct nlm_args),
561
+ .pc_ressize = sizeof(struct nlm_void),
562
+ .pc_xdrressize = St,
563
+ },
564
+ [NLMPROC_LOCK_MSG] = {
565
+ .pc_func = nlm4svc_proc_lock_msg,
566
+ .pc_decode = nlm4svc_decode_lockargs,
567
+ .pc_encode = nlm4svc_encode_void,
568
+ .pc_argsize = sizeof(struct nlm_args),
569
+ .pc_ressize = sizeof(struct nlm_void),
570
+ .pc_xdrressize = St,
571
+ },
572
+ [NLMPROC_CANCEL_MSG] = {
573
+ .pc_func = nlm4svc_proc_cancel_msg,
574
+ .pc_decode = nlm4svc_decode_cancargs,
575
+ .pc_encode = nlm4svc_encode_void,
576
+ .pc_argsize = sizeof(struct nlm_args),
577
+ .pc_ressize = sizeof(struct nlm_void),
578
+ .pc_xdrressize = St,
579
+ },
580
+ [NLMPROC_UNLOCK_MSG] = {
581
+ .pc_func = nlm4svc_proc_unlock_msg,
582
+ .pc_decode = nlm4svc_decode_unlockargs,
583
+ .pc_encode = nlm4svc_encode_void,
584
+ .pc_argsize = sizeof(struct nlm_args),
585
+ .pc_ressize = sizeof(struct nlm_void),
586
+ .pc_xdrressize = St,
587
+ },
588
+ [NLMPROC_GRANTED_MSG] = {
589
+ .pc_func = nlm4svc_proc_granted_msg,
590
+ .pc_decode = nlm4svc_decode_testargs,
591
+ .pc_encode = nlm4svc_encode_void,
592
+ .pc_argsize = sizeof(struct nlm_args),
593
+ .pc_ressize = sizeof(struct nlm_void),
594
+ .pc_xdrressize = St,
595
+ },
596
+ [NLMPROC_TEST_RES] = {
597
+ .pc_func = nlm4svc_proc_null,
598
+ .pc_decode = nlm4svc_decode_void,
599
+ .pc_encode = nlm4svc_encode_void,
600
+ .pc_argsize = sizeof(struct nlm_res),
601
+ .pc_ressize = sizeof(struct nlm_void),
602
+ .pc_xdrressize = St,
603
+ },
604
+ [NLMPROC_LOCK_RES] = {
605
+ .pc_func = nlm4svc_proc_null,
606
+ .pc_decode = nlm4svc_decode_void,
607
+ .pc_encode = nlm4svc_encode_void,
608
+ .pc_argsize = sizeof(struct nlm_res),
609
+ .pc_ressize = sizeof(struct nlm_void),
610
+ .pc_xdrressize = St,
611
+ },
612
+ [NLMPROC_CANCEL_RES] = {
613
+ .pc_func = nlm4svc_proc_null,
614
+ .pc_decode = nlm4svc_decode_void,
615
+ .pc_encode = nlm4svc_encode_void,
616
+ .pc_argsize = sizeof(struct nlm_res),
617
+ .pc_ressize = sizeof(struct nlm_void),
618
+ .pc_xdrressize = St,
619
+ },
620
+ [NLMPROC_UNLOCK_RES] = {
621
+ .pc_func = nlm4svc_proc_null,
622
+ .pc_decode = nlm4svc_decode_void,
623
+ .pc_encode = nlm4svc_encode_void,
624
+ .pc_argsize = sizeof(struct nlm_res),
625
+ .pc_ressize = sizeof(struct nlm_void),
626
+ .pc_xdrressize = St,
627
+ },
628
+ [NLMPROC_GRANTED_RES] = {
629
+ .pc_func = nlm4svc_proc_granted_res,
630
+ .pc_decode = nlm4svc_decode_res,
631
+ .pc_encode = nlm4svc_encode_void,
632
+ .pc_argsize = sizeof(struct nlm_res),
633
+ .pc_ressize = sizeof(struct nlm_void),
634
+ .pc_xdrressize = St,
635
+ },
636
+ [NLMPROC_NSM_NOTIFY] = {
637
+ .pc_func = nlm4svc_proc_sm_notify,
638
+ .pc_decode = nlm4svc_decode_reboot,
639
+ .pc_encode = nlm4svc_encode_void,
640
+ .pc_argsize = sizeof(struct nlm_reboot),
641
+ .pc_ressize = sizeof(struct nlm_void),
642
+ .pc_xdrressize = St,
643
+ },
644
+ [17] = {
645
+ .pc_func = nlm4svc_proc_unused,
646
+ .pc_decode = nlm4svc_decode_void,
647
+ .pc_encode = nlm4svc_encode_void,
648
+ .pc_argsize = sizeof(struct nlm_void),
649
+ .pc_ressize = sizeof(struct nlm_void),
650
+ .pc_xdrressize = 0,
651
+ },
652
+ [18] = {
653
+ .pc_func = nlm4svc_proc_unused,
654
+ .pc_decode = nlm4svc_decode_void,
655
+ .pc_encode = nlm4svc_encode_void,
656
+ .pc_argsize = sizeof(struct nlm_void),
657
+ .pc_ressize = sizeof(struct nlm_void),
658
+ .pc_xdrressize = 0,
659
+ },
660
+ [19] = {
661
+ .pc_func = nlm4svc_proc_unused,
662
+ .pc_decode = nlm4svc_decode_void,
663
+ .pc_encode = nlm4svc_encode_void,
664
+ .pc_argsize = sizeof(struct nlm_void),
665
+ .pc_ressize = sizeof(struct nlm_void),
666
+ .pc_xdrressize = 0,
667
+ },
668
+ [NLMPROC_SHARE] = {
669
+ .pc_func = nlm4svc_proc_share,
670
+ .pc_decode = nlm4svc_decode_shareargs,
671
+ .pc_encode = nlm4svc_encode_shareres,
672
+ .pc_argsize = sizeof(struct nlm_args),
673
+ .pc_ressize = sizeof(struct nlm_res),
674
+ .pc_xdrressize = Ck+St+1,
675
+ },
676
+ [NLMPROC_UNSHARE] = {
677
+ .pc_func = nlm4svc_proc_unshare,
678
+ .pc_decode = nlm4svc_decode_shareargs,
679
+ .pc_encode = nlm4svc_encode_shareres,
680
+ .pc_argsize = sizeof(struct nlm_args),
681
+ .pc_ressize = sizeof(struct nlm_res),
682
+ .pc_xdrressize = Ck+St+1,
683
+ },
684
+ [NLMPROC_NM_LOCK] = {
685
+ .pc_func = nlm4svc_proc_nm_lock,
686
+ .pc_decode = nlm4svc_decode_lockargs,
687
+ .pc_encode = nlm4svc_encode_res,
688
+ .pc_argsize = sizeof(struct nlm_args),
689
+ .pc_ressize = sizeof(struct nlm_res),
690
+ .pc_xdrressize = Ck+St,
691
+ },
692
+ [NLMPROC_FREE_ALL] = {
693
+ .pc_func = nlm4svc_proc_free_all,
694
+ .pc_decode = nlm4svc_decode_notify,
695
+ .pc_encode = nlm4svc_encode_void,
696
+ .pc_argsize = sizeof(struct nlm_args),
697
+ .pc_ressize = sizeof(struct nlm_void),
698
+ .pc_xdrressize = St,
699
+ },
538700 };