hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/fs/lockd/svcproc.c
....@@ -76,8 +76,14 @@
7676
7777 /* Set up the missing parts of the file_lock structure */
7878 lock->fl.fl_file = file->f_file;
79
- lock->fl.fl_owner = (fl_owner_t) host;
79
+ lock->fl.fl_pid = current->tgid;
8080 lock->fl.fl_lmops = &nlmsvc_lock_operations;
81
+ nlmsvc_locks_init_private(&lock->fl, host, (pid_t)lock->svid);
82
+ if (!lock->fl.fl_owner) {
83
+ /* lockowner allocation has failed */
84
+ nlmsvc_release_host(host);
85
+ return nlm_lck_denied_nolocks;
86
+ }
8187 }
8288
8389 return 0;
....@@ -125,6 +131,7 @@
125131 dprintk("lockd: TEST status %d vers %d\n",
126132 ntohl(resp->status), rqstp->rq_vers);
127133
134
+ nlmsvc_release_lockowner(&argp->lock);
128135 nlmsvc_release_host(host);
129136 nlm_release_file(file);
130137 return rc;
....@@ -173,6 +180,7 @@
173180 else
174181 dprintk("lockd: LOCK status %d\n", ntohl(resp->status));
175182
183
+ nlmsvc_release_lockowner(&argp->lock);
176184 nlmsvc_release_host(host);
177185 nlm_release_file(file);
178186 return rc;
....@@ -210,6 +218,7 @@
210218 resp->status = cast_status(nlmsvc_cancel_blocked(net, file, &argp->lock));
211219
212220 dprintk("lockd: CANCEL status %d\n", ntohl(resp->status));
221
+ nlmsvc_release_lockowner(&argp->lock);
213222 nlmsvc_release_host(host);
214223 nlm_release_file(file);
215224 return rpc_success;
....@@ -250,6 +259,7 @@
250259 resp->status = cast_status(nlmsvc_unlock(net, file, &argp->lock));
251260
252261 dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status));
262
+ nlmsvc_release_lockowner(&argp->lock);
253263 nlmsvc_release_host(host);
254264 nlm_release_file(file);
255265 return rpc_success;
....@@ -408,6 +418,7 @@
408418 resp->status = cast_status(nlmsvc_share_file(host, file, argp));
409419
410420 dprintk("lockd: SHARE status %d\n", ntohl(resp->status));
421
+ nlmsvc_release_lockowner(&argp->lock);
411422 nlmsvc_release_host(host);
412423 nlm_release_file(file);
413424 return rpc_success;
....@@ -442,6 +453,7 @@
442453 resp->status = cast_status(nlmsvc_unshare_file(host, file, argp));
443454
444455 dprintk("lockd: UNSHARE status %d\n", ntohl(resp->status));
456
+ nlmsvc_release_lockowner(&argp->lock);
445457 nlmsvc_release_host(host);
446458 nlm_release_file(file);
447459 return rpc_success;
....@@ -517,66 +529,214 @@
517529 return rpc_success;
518530 }
519531
532
+static __be32
533
+nlmsvc_proc_unused(struct svc_rqst *rqstp)
534
+{
535
+ return rpc_proc_unavail;
536
+}
537
+
520538 /*
521539 * NLM Server procedures.
522540 */
523541
524
-#define nlmsvc_encode_norep nlmsvc_encode_void
525
-#define nlmsvc_decode_norep nlmsvc_decode_void
526
-#define nlmsvc_decode_testres nlmsvc_decode_void
527
-#define nlmsvc_decode_lockres nlmsvc_decode_void
528
-#define nlmsvc_decode_unlockres nlmsvc_decode_void
529
-#define nlmsvc_decode_cancelres nlmsvc_decode_void
530
-#define nlmsvc_decode_grantedres nlmsvc_decode_void
531
-
532
-#define nlmsvc_proc_none nlmsvc_proc_null
533
-#define nlmsvc_proc_test_res nlmsvc_proc_null
534
-#define nlmsvc_proc_lock_res nlmsvc_proc_null
535
-#define nlmsvc_proc_cancel_res nlmsvc_proc_null
536
-#define nlmsvc_proc_unlock_res nlmsvc_proc_null
537
-
538542 struct nlm_void { int dummy; };
539
-
540
-#define PROC(name, xargt, xrest, argt, rest, respsize) \
541
- { .pc_func = nlmsvc_proc_##name, \
542
- .pc_decode = nlmsvc_decode_##xargt, \
543
- .pc_encode = nlmsvc_encode_##xrest, \
544
- .pc_release = NULL, \
545
- .pc_argsize = sizeof(struct nlm_##argt), \
546
- .pc_ressize = sizeof(struct nlm_##rest), \
547
- .pc_xdrressize = respsize, \
548
- }
549543
550544 #define Ck (1+XDR_QUADLEN(NLM_MAXCOOKIELEN)) /* cookie */
551545 #define St 1 /* status */
552546 #define No (1+1024/4) /* Net Obj */
553547 #define Rg 2 /* range - offset + size */
554548
555
-const struct svc_procedure nlmsvc_procedures[] = {
556
- PROC(null, void, void, void, void, 1),
557
- PROC(test, testargs, testres, args, res, Ck+St+2+No+Rg),
558
- PROC(lock, lockargs, res, args, res, Ck+St),
559
- PROC(cancel, cancargs, res, args, res, Ck+St),
560
- PROC(unlock, unlockargs, res, args, res, Ck+St),
561
- PROC(granted, testargs, res, args, res, Ck+St),
562
- PROC(test_msg, testargs, norep, args, void, 1),
563
- PROC(lock_msg, lockargs, norep, args, void, 1),
564
- PROC(cancel_msg, cancargs, norep, args, void, 1),
565
- PROC(unlock_msg, unlockargs, norep, args, void, 1),
566
- PROC(granted_msg, testargs, norep, args, void, 1),
567
- PROC(test_res, testres, norep, res, void, 1),
568
- PROC(lock_res, lockres, norep, res, void, 1),
569
- PROC(cancel_res, cancelres, norep, res, void, 1),
570
- PROC(unlock_res, unlockres, norep, res, void, 1),
571
- PROC(granted_res, res, norep, res, void, 1),
572
- /* statd callback */
573
- PROC(sm_notify, reboot, void, reboot, void, 1),
574
- PROC(none, void, void, void, void, 1),
575
- PROC(none, void, void, void, void, 1),
576
- PROC(none, void, void, void, void, 1),
577
- PROC(share, shareargs, shareres, args, res, Ck+St+1),
578
- PROC(unshare, shareargs, shareres, args, res, Ck+St+1),
579
- PROC(nm_lock, lockargs, res, args, res, Ck+St),
580
- PROC(free_all, notify, void, args, void, 0),
581
-
549
+const struct svc_procedure nlmsvc_procedures[24] = {
550
+ [NLMPROC_NULL] = {
551
+ .pc_func = nlmsvc_proc_null,
552
+ .pc_decode = nlmsvc_decode_void,
553
+ .pc_encode = nlmsvc_encode_void,
554
+ .pc_argsize = sizeof(struct nlm_void),
555
+ .pc_ressize = sizeof(struct nlm_void),
556
+ .pc_xdrressize = St,
557
+ },
558
+ [NLMPROC_TEST] = {
559
+ .pc_func = nlmsvc_proc_test,
560
+ .pc_decode = nlmsvc_decode_testargs,
561
+ .pc_encode = nlmsvc_encode_testres,
562
+ .pc_argsize = sizeof(struct nlm_args),
563
+ .pc_ressize = sizeof(struct nlm_res),
564
+ .pc_xdrressize = Ck+St+2+No+Rg,
565
+ },
566
+ [NLMPROC_LOCK] = {
567
+ .pc_func = nlmsvc_proc_lock,
568
+ .pc_decode = nlmsvc_decode_lockargs,
569
+ .pc_encode = nlmsvc_encode_res,
570
+ .pc_argsize = sizeof(struct nlm_args),
571
+ .pc_ressize = sizeof(struct nlm_res),
572
+ .pc_xdrressize = Ck+St,
573
+ },
574
+ [NLMPROC_CANCEL] = {
575
+ .pc_func = nlmsvc_proc_cancel,
576
+ .pc_decode = nlmsvc_decode_cancargs,
577
+ .pc_encode = nlmsvc_encode_res,
578
+ .pc_argsize = sizeof(struct nlm_args),
579
+ .pc_ressize = sizeof(struct nlm_res),
580
+ .pc_xdrressize = Ck+St,
581
+ },
582
+ [NLMPROC_UNLOCK] = {
583
+ .pc_func = nlmsvc_proc_unlock,
584
+ .pc_decode = nlmsvc_decode_unlockargs,
585
+ .pc_encode = nlmsvc_encode_res,
586
+ .pc_argsize = sizeof(struct nlm_args),
587
+ .pc_ressize = sizeof(struct nlm_res),
588
+ .pc_xdrressize = Ck+St,
589
+ },
590
+ [NLMPROC_GRANTED] = {
591
+ .pc_func = nlmsvc_proc_granted,
592
+ .pc_decode = nlmsvc_decode_testargs,
593
+ .pc_encode = nlmsvc_encode_res,
594
+ .pc_argsize = sizeof(struct nlm_args),
595
+ .pc_ressize = sizeof(struct nlm_res),
596
+ .pc_xdrressize = Ck+St,
597
+ },
598
+ [NLMPROC_TEST_MSG] = {
599
+ .pc_func = nlmsvc_proc_test_msg,
600
+ .pc_decode = nlmsvc_decode_testargs,
601
+ .pc_encode = nlmsvc_encode_void,
602
+ .pc_argsize = sizeof(struct nlm_args),
603
+ .pc_ressize = sizeof(struct nlm_void),
604
+ .pc_xdrressize = St,
605
+ },
606
+ [NLMPROC_LOCK_MSG] = {
607
+ .pc_func = nlmsvc_proc_lock_msg,
608
+ .pc_decode = nlmsvc_decode_lockargs,
609
+ .pc_encode = nlmsvc_encode_void,
610
+ .pc_argsize = sizeof(struct nlm_args),
611
+ .pc_ressize = sizeof(struct nlm_void),
612
+ .pc_xdrressize = St,
613
+ },
614
+ [NLMPROC_CANCEL_MSG] = {
615
+ .pc_func = nlmsvc_proc_cancel_msg,
616
+ .pc_decode = nlmsvc_decode_cancargs,
617
+ .pc_encode = nlmsvc_encode_void,
618
+ .pc_argsize = sizeof(struct nlm_args),
619
+ .pc_ressize = sizeof(struct nlm_void),
620
+ .pc_xdrressize = St,
621
+ },
622
+ [NLMPROC_UNLOCK_MSG] = {
623
+ .pc_func = nlmsvc_proc_unlock_msg,
624
+ .pc_decode = nlmsvc_decode_unlockargs,
625
+ .pc_encode = nlmsvc_encode_void,
626
+ .pc_argsize = sizeof(struct nlm_args),
627
+ .pc_ressize = sizeof(struct nlm_void),
628
+ .pc_xdrressize = St,
629
+ },
630
+ [NLMPROC_GRANTED_MSG] = {
631
+ .pc_func = nlmsvc_proc_granted_msg,
632
+ .pc_decode = nlmsvc_decode_testargs,
633
+ .pc_encode = nlmsvc_encode_void,
634
+ .pc_argsize = sizeof(struct nlm_args),
635
+ .pc_ressize = sizeof(struct nlm_void),
636
+ .pc_xdrressize = St,
637
+ },
638
+ [NLMPROC_TEST_RES] = {
639
+ .pc_func = nlmsvc_proc_null,
640
+ .pc_decode = nlmsvc_decode_void,
641
+ .pc_encode = nlmsvc_encode_void,
642
+ .pc_argsize = sizeof(struct nlm_res),
643
+ .pc_ressize = sizeof(struct nlm_void),
644
+ .pc_xdrressize = St,
645
+ },
646
+ [NLMPROC_LOCK_RES] = {
647
+ .pc_func = nlmsvc_proc_null,
648
+ .pc_decode = nlmsvc_decode_void,
649
+ .pc_encode = nlmsvc_encode_void,
650
+ .pc_argsize = sizeof(struct nlm_res),
651
+ .pc_ressize = sizeof(struct nlm_void),
652
+ .pc_xdrressize = St,
653
+ },
654
+ [NLMPROC_CANCEL_RES] = {
655
+ .pc_func = nlmsvc_proc_null,
656
+ .pc_decode = nlmsvc_decode_void,
657
+ .pc_encode = nlmsvc_encode_void,
658
+ .pc_argsize = sizeof(struct nlm_res),
659
+ .pc_ressize = sizeof(struct nlm_void),
660
+ .pc_xdrressize = St,
661
+ },
662
+ [NLMPROC_UNLOCK_RES] = {
663
+ .pc_func = nlmsvc_proc_null,
664
+ .pc_decode = nlmsvc_decode_void,
665
+ .pc_encode = nlmsvc_encode_void,
666
+ .pc_argsize = sizeof(struct nlm_res),
667
+ .pc_ressize = sizeof(struct nlm_void),
668
+ .pc_xdrressize = St,
669
+ },
670
+ [NLMPROC_GRANTED_RES] = {
671
+ .pc_func = nlmsvc_proc_granted_res,
672
+ .pc_decode = nlmsvc_decode_res,
673
+ .pc_encode = nlmsvc_encode_void,
674
+ .pc_argsize = sizeof(struct nlm_res),
675
+ .pc_ressize = sizeof(struct nlm_void),
676
+ .pc_xdrressize = St,
677
+ },
678
+ [NLMPROC_NSM_NOTIFY] = {
679
+ .pc_func = nlmsvc_proc_sm_notify,
680
+ .pc_decode = nlmsvc_decode_reboot,
681
+ .pc_encode = nlmsvc_encode_void,
682
+ .pc_argsize = sizeof(struct nlm_reboot),
683
+ .pc_ressize = sizeof(struct nlm_void),
684
+ .pc_xdrressize = St,
685
+ },
686
+ [17] = {
687
+ .pc_func = nlmsvc_proc_unused,
688
+ .pc_decode = nlmsvc_decode_void,
689
+ .pc_encode = nlmsvc_encode_void,
690
+ .pc_argsize = sizeof(struct nlm_void),
691
+ .pc_ressize = sizeof(struct nlm_void),
692
+ .pc_xdrressize = St,
693
+ },
694
+ [18] = {
695
+ .pc_func = nlmsvc_proc_unused,
696
+ .pc_decode = nlmsvc_decode_void,
697
+ .pc_encode = nlmsvc_encode_void,
698
+ .pc_argsize = sizeof(struct nlm_void),
699
+ .pc_ressize = sizeof(struct nlm_void),
700
+ .pc_xdrressize = St,
701
+ },
702
+ [19] = {
703
+ .pc_func = nlmsvc_proc_unused,
704
+ .pc_decode = nlmsvc_decode_void,
705
+ .pc_encode = nlmsvc_encode_void,
706
+ .pc_argsize = sizeof(struct nlm_void),
707
+ .pc_ressize = sizeof(struct nlm_void),
708
+ .pc_xdrressize = St,
709
+ },
710
+ [NLMPROC_SHARE] = {
711
+ .pc_func = nlmsvc_proc_share,
712
+ .pc_decode = nlmsvc_decode_shareargs,
713
+ .pc_encode = nlmsvc_encode_shareres,
714
+ .pc_argsize = sizeof(struct nlm_args),
715
+ .pc_ressize = sizeof(struct nlm_res),
716
+ .pc_xdrressize = Ck+St+1,
717
+ },
718
+ [NLMPROC_UNSHARE] = {
719
+ .pc_func = nlmsvc_proc_unshare,
720
+ .pc_decode = nlmsvc_decode_shareargs,
721
+ .pc_encode = nlmsvc_encode_shareres,
722
+ .pc_argsize = sizeof(struct nlm_args),
723
+ .pc_ressize = sizeof(struct nlm_res),
724
+ .pc_xdrressize = Ck+St+1,
725
+ },
726
+ [NLMPROC_NM_LOCK] = {
727
+ .pc_func = nlmsvc_proc_nm_lock,
728
+ .pc_decode = nlmsvc_decode_lockargs,
729
+ .pc_encode = nlmsvc_encode_res,
730
+ .pc_argsize = sizeof(struct nlm_args),
731
+ .pc_ressize = sizeof(struct nlm_res),
732
+ .pc_xdrressize = Ck+St,
733
+ },
734
+ [NLMPROC_FREE_ALL] = {
735
+ .pc_func = nlmsvc_proc_free_all,
736
+ .pc_decode = nlmsvc_decode_notify,
737
+ .pc_encode = nlmsvc_encode_void,
738
+ .pc_argsize = sizeof(struct nlm_args),
739
+ .pc_ressize = sizeof(struct nlm_void),
740
+ .pc_xdrressize = 0,
741
+ },
582742 };