37
37
/* Private pointer to registered efivars */
38
38
static struct efivars * __efivars ;
39
39
40
+ /*
41
+ * efivars_lock protects three things:
42
+ * 1) efivarfs_list and efivars_sysfs_list
43
+ * 2) ->ops calls
44
+ * 3) (un)registration of __efivars
45
+ */
46
+ static DEFINE_SPINLOCK (efivars_lock );
47
+
40
48
static bool efivar_wq_enabled = true;
41
49
DECLARE_WORK (efivar_work , NULL );
42
50
EXPORT_SYMBOL_GPL (efivar_work );
@@ -434,7 +442,7 @@ int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
434
442
return - ENOMEM ;
435
443
}
436
444
437
- spin_lock_irq (& __efivars -> lock );
445
+ spin_lock_irq (& efivars_lock );
438
446
439
447
/*
440
448
* Per EFI spec, the maximum storage allocated for both
@@ -450,7 +458,7 @@ int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
450
458
switch (status ) {
451
459
case EFI_SUCCESS :
452
460
if (duplicates )
453
- spin_unlock_irq (& __efivars -> lock );
461
+ spin_unlock_irq (& efivars_lock );
454
462
455
463
variable_name_size = var_name_strnsize (variable_name ,
456
464
variable_name_size );
@@ -477,7 +485,7 @@ int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
477
485
}
478
486
479
487
if (duplicates )
480
- spin_lock_irq (& __efivars -> lock );
488
+ spin_lock_irq (& efivars_lock );
481
489
482
490
break ;
483
491
case EFI_NOT_FOUND :
@@ -491,7 +499,7 @@ int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
491
499
492
500
} while (status != EFI_NOT_FOUND );
493
501
494
- spin_unlock_irq (& __efivars -> lock );
502
+ spin_unlock_irq (& efivars_lock );
495
503
496
504
kfree (variable_name );
497
505
@@ -506,9 +514,9 @@ EXPORT_SYMBOL_GPL(efivar_init);
506
514
*/
507
515
void efivar_entry_add (struct efivar_entry * entry , struct list_head * head )
508
516
{
509
- spin_lock_irq (& __efivars -> lock );
517
+ spin_lock_irq (& efivars_lock );
510
518
list_add (& entry -> list , head );
511
- spin_unlock_irq (& __efivars -> lock );
519
+ spin_unlock_irq (& efivars_lock );
512
520
}
513
521
EXPORT_SYMBOL_GPL (efivar_entry_add );
514
522
@@ -518,9 +526,9 @@ EXPORT_SYMBOL_GPL(efivar_entry_add);
518
526
*/
519
527
void efivar_entry_remove (struct efivar_entry * entry )
520
528
{
521
- spin_lock_irq (& __efivars -> lock );
529
+ spin_lock_irq (& efivars_lock );
522
530
list_del (& entry -> list );
523
- spin_unlock_irq (& __efivars -> lock );
531
+ spin_unlock_irq (& efivars_lock );
524
532
}
525
533
EXPORT_SYMBOL_GPL (efivar_entry_remove );
526
534
@@ -537,10 +545,10 @@ EXPORT_SYMBOL_GPL(efivar_entry_remove);
537
545
*/
538
546
static void efivar_entry_list_del_unlock (struct efivar_entry * entry )
539
547
{
540
- lockdep_assert_held (& __efivars -> lock );
548
+ lockdep_assert_held (& efivars_lock );
541
549
542
550
list_del (& entry -> list );
543
- spin_unlock_irq (& __efivars -> lock );
551
+ spin_unlock_irq (& efivars_lock );
544
552
}
545
553
546
554
/**
@@ -563,7 +571,7 @@ int __efivar_entry_delete(struct efivar_entry *entry)
563
571
const struct efivar_operations * ops = __efivars -> ops ;
564
572
efi_status_t status ;
565
573
566
- lockdep_assert_held (& __efivars -> lock );
574
+ lockdep_assert_held (& efivars_lock );
567
575
568
576
status = ops -> set_variable (entry -> var .VariableName ,
569
577
& entry -> var .VendorGuid ,
@@ -589,12 +597,12 @@ int efivar_entry_delete(struct efivar_entry *entry)
589
597
const struct efivar_operations * ops = __efivars -> ops ;
590
598
efi_status_t status ;
591
599
592
- spin_lock_irq (& __efivars -> lock );
600
+ spin_lock_irq (& efivars_lock );
593
601
status = ops -> set_variable (entry -> var .VariableName ,
594
602
& entry -> var .VendorGuid ,
595
603
0 , 0 , NULL );
596
604
if (!(status == EFI_SUCCESS || status == EFI_NOT_FOUND )) {
597
- spin_unlock_irq (& __efivars -> lock );
605
+ spin_unlock_irq (& efivars_lock );
598
606
return efi_status_to_err (status );
599
607
}
600
608
@@ -632,10 +640,10 @@ int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
632
640
efi_char16_t * name = entry -> var .VariableName ;
633
641
efi_guid_t vendor = entry -> var .VendorGuid ;
634
642
635
- spin_lock_irq (& __efivars -> lock );
643
+ spin_lock_irq (& efivars_lock );
636
644
637
645
if (head && efivar_entry_find (name , vendor , head , false)) {
638
- spin_unlock_irq (& __efivars -> lock );
646
+ spin_unlock_irq (& efivars_lock );
639
647
return - EEXIST ;
640
648
}
641
649
@@ -644,7 +652,7 @@ int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
644
652
status = ops -> set_variable (name , & vendor ,
645
653
attributes , size , data );
646
654
647
- spin_unlock_irq (& __efivars -> lock );
655
+ spin_unlock_irq (& efivars_lock );
648
656
649
657
return efi_status_to_err (status );
650
658
@@ -658,7 +666,7 @@ EXPORT_SYMBOL_GPL(efivar_entry_set);
658
666
* from crash/panic handlers.
659
667
*
660
668
* Crucially, this function will not block if it cannot acquire
661
- * __efivars->lock . Instead, it returns -EBUSY.
669
+ * efivars_lock . Instead, it returns -EBUSY.
662
670
*/
663
671
static int
664
672
efivar_entry_set_nonblocking (efi_char16_t * name , efi_guid_t vendor ,
@@ -668,20 +676,20 @@ efivar_entry_set_nonblocking(efi_char16_t *name, efi_guid_t vendor,
668
676
unsigned long flags ;
669
677
efi_status_t status ;
670
678
671
- if (!spin_trylock_irqsave (& __efivars -> lock , flags ))
679
+ if (!spin_trylock_irqsave (& efivars_lock , flags ))
672
680
return - EBUSY ;
673
681
674
682
status = check_var_size_nonblocking (attributes ,
675
683
size + ucs2_strsize (name , 1024 ));
676
684
if (status != EFI_SUCCESS ) {
677
- spin_unlock_irqrestore (& __efivars -> lock , flags );
685
+ spin_unlock_irqrestore (& efivars_lock , flags );
678
686
return - ENOSPC ;
679
687
}
680
688
681
689
status = ops -> set_variable_nonblocking (name , & vendor , attributes ,
682
690
size , data );
683
691
684
- spin_unlock_irqrestore (& __efivars -> lock , flags );
692
+ spin_unlock_irqrestore (& efivars_lock , flags );
685
693
return efi_status_to_err (status );
686
694
}
687
695
@@ -727,21 +735,21 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
727
735
size , data );
728
736
729
737
if (!block ) {
730
- if (!spin_trylock_irqsave (& __efivars -> lock , flags ))
738
+ if (!spin_trylock_irqsave (& efivars_lock , flags ))
731
739
return - EBUSY ;
732
740
} else {
733
- spin_lock_irqsave (& __efivars -> lock , flags );
741
+ spin_lock_irqsave (& efivars_lock , flags );
734
742
}
735
743
736
744
status = check_var_size (attributes , size + ucs2_strsize (name , 1024 ));
737
745
if (status != EFI_SUCCESS ) {
738
- spin_unlock_irqrestore (& __efivars -> lock , flags );
746
+ spin_unlock_irqrestore (& efivars_lock , flags );
739
747
return - ENOSPC ;
740
748
}
741
749
742
750
status = ops -> set_variable (name , & vendor , attributes , size , data );
743
751
744
- spin_unlock_irqrestore (& __efivars -> lock , flags );
752
+ spin_unlock_irqrestore (& efivars_lock , flags );
745
753
746
754
return efi_status_to_err (status );
747
755
}
@@ -771,7 +779,7 @@ struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
771
779
int strsize1 , strsize2 ;
772
780
bool found = false;
773
781
774
- lockdep_assert_held (& __efivars -> lock );
782
+ lockdep_assert_held (& efivars_lock );
775
783
776
784
list_for_each_entry_safe (entry , n , head , list ) {
777
785
strsize1 = ucs2_strsize (name , 1024 );
@@ -814,10 +822,10 @@ int efivar_entry_size(struct efivar_entry *entry, unsigned long *size)
814
822
815
823
* size = 0 ;
816
824
817
- spin_lock_irq (& __efivars -> lock );
825
+ spin_lock_irq (& efivars_lock );
818
826
status = ops -> get_variable (entry -> var .VariableName ,
819
827
& entry -> var .VendorGuid , NULL , size , NULL );
820
- spin_unlock_irq (& __efivars -> lock );
828
+ spin_unlock_irq (& efivars_lock );
821
829
822
830
if (status != EFI_BUFFER_TOO_SMALL )
823
831
return efi_status_to_err (status );
@@ -843,7 +851,7 @@ int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
843
851
const struct efivar_operations * ops = __efivars -> ops ;
844
852
efi_status_t status ;
845
853
846
- lockdep_assert_held (& __efivars -> lock );
854
+ lockdep_assert_held (& efivars_lock );
847
855
848
856
status = ops -> get_variable (entry -> var .VariableName ,
849
857
& entry -> var .VendorGuid ,
@@ -866,11 +874,11 @@ int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
866
874
const struct efivar_operations * ops = __efivars -> ops ;
867
875
efi_status_t status ;
868
876
869
- spin_lock_irq (& __efivars -> lock );
877
+ spin_lock_irq (& efivars_lock );
870
878
status = ops -> get_variable (entry -> var .VariableName ,
871
879
& entry -> var .VendorGuid ,
872
880
attributes , size , data );
873
- spin_unlock_irq (& __efivars -> lock );
881
+ spin_unlock_irq (& efivars_lock );
874
882
875
883
return efi_status_to_err (status );
876
884
}
@@ -917,7 +925,7 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
917
925
* set_variable call, and removal of the variable from the efivars
918
926
* list (in the case of an authenticated delete).
919
927
*/
920
- spin_lock_irq (& __efivars -> lock );
928
+ spin_lock_irq (& efivars_lock );
921
929
922
930
/*
923
931
* Ensure that the available space hasn't shrunk below the safe level
@@ -957,15 +965,15 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
957
965
if (status == EFI_NOT_FOUND )
958
966
efivar_entry_list_del_unlock (entry );
959
967
else
960
- spin_unlock_irq (& __efivars -> lock );
968
+ spin_unlock_irq (& efivars_lock );
961
969
962
970
if (status && status != EFI_BUFFER_TOO_SMALL )
963
971
return efi_status_to_err (status );
964
972
965
973
return 0 ;
966
974
967
975
out :
968
- spin_unlock_irq (& __efivars -> lock );
976
+ spin_unlock_irq (& efivars_lock );
969
977
return err ;
970
978
971
979
}
@@ -980,7 +988,7 @@ EXPORT_SYMBOL_GPL(efivar_entry_set_get_size);
980
988
*/
981
989
void efivar_entry_iter_begin (void )
982
990
{
983
- spin_lock_irq (& __efivars -> lock );
991
+ spin_lock_irq (& efivars_lock );
984
992
}
985
993
EXPORT_SYMBOL_GPL (efivar_entry_iter_begin );
986
994
@@ -991,7 +999,7 @@ EXPORT_SYMBOL_GPL(efivar_entry_iter_begin);
991
999
*/
992
1000
void efivar_entry_iter_end (void )
993
1001
{
994
- spin_unlock_irq (& __efivars -> lock );
1002
+ spin_unlock_irq (& efivars_lock );
995
1003
}
996
1004
EXPORT_SYMBOL_GPL (efivar_entry_iter_end );
997
1005
@@ -1112,11 +1120,12 @@ int efivars_register(struct efivars *efivars,
1112
1120
const struct efivar_operations * ops ,
1113
1121
struct kobject * kobject )
1114
1122
{
1115
- spin_lock_init ( & efivars -> lock );
1123
+ spin_lock_irq ( & efivars_lock );
1116
1124
efivars -> ops = ops ;
1117
1125
efivars -> kobject = kobject ;
1118
1126
1119
1127
__efivars = efivars ;
1128
+ spin_unlock_irq (& efivars_lock );
1120
1129
1121
1130
return 0 ;
1122
1131
}
@@ -1133,6 +1142,7 @@ int efivars_unregister(struct efivars *efivars)
1133
1142
{
1134
1143
int rv ;
1135
1144
1145
+ spin_lock_irq (& efivars_lock );
1136
1146
if (!__efivars ) {
1137
1147
printk (KERN_ERR "efivars not registered\n" );
1138
1148
rv = - EINVAL ;
@@ -1148,6 +1158,7 @@ int efivars_unregister(struct efivars *efivars)
1148
1158
1149
1159
rv = 0 ;
1150
1160
out :
1161
+ spin_unlock_irq (& efivars_lock );
1151
1162
return rv ;
1152
1163
}
1153
1164
EXPORT_SYMBOL_GPL (efivars_unregister );
0 commit comments