@@ -405,10 +405,11 @@ static efi_status_t
405
405
get_var_data (struct efivars * efivars , struct efi_variable * var )
406
406
{
407
407
efi_status_t status ;
408
+ unsigned long flags ;
408
409
409
- spin_lock (& efivars -> lock );
410
+ spin_lock_irqsave (& efivars -> lock , flags );
410
411
status = get_var_data_locked (efivars , var );
411
- spin_unlock (& efivars -> lock );
412
+ spin_unlock_irqrestore (& efivars -> lock , flags );
412
413
413
414
if (status != EFI_SUCCESS ) {
414
415
printk (KERN_WARNING "efivars: get_variable() failed 0x%lx!\n" ,
@@ -537,14 +538,14 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
537
538
return - EINVAL ;
538
539
}
539
540
540
- spin_lock (& efivars -> lock );
541
+ spin_lock_irq (& efivars -> lock );
541
542
status = efivars -> ops -> set_variable (new_var -> VariableName ,
542
543
& new_var -> VendorGuid ,
543
544
new_var -> Attributes ,
544
545
new_var -> DataSize ,
545
546
new_var -> Data );
546
547
547
- spin_unlock (& efivars -> lock );
548
+ spin_unlock_irq (& efivars -> lock );
548
549
549
550
if (status != EFI_SUCCESS ) {
550
551
printk (KERN_WARNING "efivars: set_variable() failed: status=%lx\n" ,
@@ -713,7 +714,7 @@ static ssize_t efivarfs_file_write(struct file *file,
713
714
* amounts of memory. Pick a default size of 64K if
714
715
* QueryVariableInfo() isn't supported by the firmware.
715
716
*/
716
- spin_lock (& efivars -> lock );
717
+ spin_lock_irq (& efivars -> lock );
717
718
718
719
if (!efivars -> ops -> query_variable_info )
719
720
status = EFI_UNSUPPORTED ;
@@ -723,7 +724,7 @@ static ssize_t efivarfs_file_write(struct file *file,
723
724
& remaining_size , & max_size );
724
725
}
725
726
726
- spin_unlock (& efivars -> lock );
727
+ spin_unlock_irq (& efivars -> lock );
727
728
728
729
if (status != EFI_SUCCESS ) {
729
730
if (status != EFI_UNSUPPORTED )
@@ -754,15 +755,15 @@ static ssize_t efivarfs_file_write(struct file *file,
754
755
* set_variable call, and removal of the variable from the efivars
755
756
* list (in the case of an authenticated delete).
756
757
*/
757
- spin_lock (& efivars -> lock );
758
+ spin_lock_irq (& efivars -> lock );
758
759
759
760
status = efivars -> ops -> set_variable (var -> var .VariableName ,
760
761
& var -> var .VendorGuid ,
761
762
attributes , datasize ,
762
763
data );
763
764
764
765
if (status != EFI_SUCCESS ) {
765
- spin_unlock (& efivars -> lock );
766
+ spin_unlock_irq (& efivars -> lock );
766
767
kfree (data );
767
768
768
769
return efi_status_to_err (status );
@@ -783,20 +784,20 @@ static ssize_t efivarfs_file_write(struct file *file,
783
784
NULL );
784
785
785
786
if (status == EFI_BUFFER_TOO_SMALL ) {
786
- spin_unlock (& efivars -> lock );
787
+ spin_unlock_irq (& efivars -> lock );
787
788
mutex_lock (& inode -> i_mutex );
788
789
i_size_write (inode , newdatasize + sizeof (attributes ));
789
790
mutex_unlock (& inode -> i_mutex );
790
791
791
792
} else if (status == EFI_NOT_FOUND ) {
792
793
list_del (& var -> list );
793
- spin_unlock (& efivars -> lock );
794
+ spin_unlock_irq (& efivars -> lock );
794
795
efivar_unregister (var );
795
796
drop_nlink (inode );
796
797
dput (file -> f_dentry );
797
798
798
799
} else {
799
- spin_unlock (& efivars -> lock );
800
+ spin_unlock_irq (& efivars -> lock );
800
801
pr_warn ("efivarfs: inconsistent EFI variable implementation? "
801
802
"status = %lx\n" , status );
802
803
}
@@ -818,11 +819,11 @@ static ssize_t efivarfs_file_read(struct file *file, char __user *userbuf,
818
819
void * data ;
819
820
ssize_t size = 0 ;
820
821
821
- spin_lock (& efivars -> lock );
822
+ spin_lock_irq (& efivars -> lock );
822
823
status = efivars -> ops -> get_variable (var -> var .VariableName ,
823
824
& var -> var .VendorGuid ,
824
825
& attributes , & datasize , NULL );
825
- spin_unlock (& efivars -> lock );
826
+ spin_unlock_irq (& efivars -> lock );
826
827
827
828
if (status != EFI_BUFFER_TOO_SMALL )
828
829
return efi_status_to_err (status );
@@ -832,12 +833,12 @@ static ssize_t efivarfs_file_read(struct file *file, char __user *userbuf,
832
833
if (!data )
833
834
return - ENOMEM ;
834
835
835
- spin_lock (& efivars -> lock );
836
+ spin_lock_irq (& efivars -> lock );
836
837
status = efivars -> ops -> get_variable (var -> var .VariableName ,
837
838
& var -> var .VendorGuid ,
838
839
& attributes , & datasize ,
839
840
(data + sizeof (attributes )));
840
- spin_unlock (& efivars -> lock );
841
+ spin_unlock_irq (& efivars -> lock );
841
842
842
843
if (status != EFI_SUCCESS ) {
843
844
size = efi_status_to_err (status );
@@ -965,9 +966,9 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry,
965
966
goto out ;
966
967
967
968
kobject_uevent (& var -> kobj , KOBJ_ADD );
968
- spin_lock (& efivars -> lock );
969
+ spin_lock_irq (& efivars -> lock );
969
970
list_add (& var -> list , & efivars -> list );
970
- spin_unlock (& efivars -> lock );
971
+ spin_unlock_irq (& efivars -> lock );
971
972
d_instantiate (dentry , inode );
972
973
dget (dentry );
973
974
out :
@@ -984,22 +985,22 @@ static int efivarfs_unlink(struct inode *dir, struct dentry *dentry)
984
985
struct efivars * efivars = var -> efivars ;
985
986
efi_status_t status ;
986
987
987
- spin_lock (& efivars -> lock );
988
+ spin_lock_irq (& efivars -> lock );
988
989
989
990
status = efivars -> ops -> set_variable (var -> var .VariableName ,
990
991
& var -> var .VendorGuid ,
991
992
0 , 0 , NULL );
992
993
993
994
if (status == EFI_SUCCESS || status == EFI_NOT_FOUND ) {
994
995
list_del (& var -> list );
995
- spin_unlock (& efivars -> lock );
996
+ spin_unlock_irq (& efivars -> lock );
996
997
efivar_unregister (var );
997
998
drop_nlink (dir );
998
999
dput (dentry );
999
1000
return 0 ;
1000
1001
}
1001
1002
1002
- spin_unlock (& efivars -> lock );
1003
+ spin_unlock_irq (& efivars -> lock );
1003
1004
return - EINVAL ;
1004
1005
};
1005
1006
@@ -1065,13 +1066,13 @@ static int efivarfs_fill_super(struct super_block *sb, void *data, int silent)
1065
1066
/* copied by the above to local storage in the dentry. */
1066
1067
kfree (name );
1067
1068
1068
- spin_lock (& efivars -> lock );
1069
+ spin_lock_irq (& efivars -> lock );
1069
1070
efivars -> ops -> get_variable (entry -> var .VariableName ,
1070
1071
& entry -> var .VendorGuid ,
1071
1072
& entry -> var .Attributes ,
1072
1073
& size ,
1073
1074
NULL );
1074
- spin_unlock (& efivars -> lock );
1075
+ spin_unlock_irq (& efivars -> lock );
1075
1076
1076
1077
mutex_lock (& inode -> i_mutex );
1077
1078
inode -> i_private = entry ;
@@ -1122,7 +1123,7 @@ static int efi_pstore_open(struct pstore_info *psi)
1122
1123
{
1123
1124
struct efivars * efivars = psi -> data ;
1124
1125
1125
- spin_lock (& efivars -> lock );
1126
+ spin_lock_irq (& efivars -> lock );
1126
1127
efivars -> walk_entry = list_first_entry (& efivars -> list ,
1127
1128
struct efivar_entry , list );
1128
1129
return 0 ;
@@ -1132,7 +1133,7 @@ static int efi_pstore_close(struct pstore_info *psi)
1132
1133
{
1133
1134
struct efivars * efivars = psi -> data ;
1134
1135
1135
- spin_unlock (& efivars -> lock );
1136
+ spin_unlock_irq (& efivars -> lock );
1136
1137
return 0 ;
1137
1138
}
1138
1139
@@ -1208,17 +1209,18 @@ static int efi_pstore_write(enum pstore_type_id type,
1208
1209
int i , ret = 0 ;
1209
1210
u64 storage_space , remaining_space , max_variable_size ;
1210
1211
efi_status_t status = EFI_NOT_FOUND ;
1212
+ unsigned long flags ;
1211
1213
1212
1214
if (pstore_cannot_block_path (reason )) {
1213
1215
/*
1214
1216
* If the lock is taken by another cpu in non-blocking path,
1215
1217
* this driver returns without entering firmware to avoid
1216
1218
* hanging up.
1217
1219
*/
1218
- if (!spin_trylock (& efivars -> lock ))
1220
+ if (!spin_trylock_irqsave (& efivars -> lock , flags ))
1219
1221
return - EBUSY ;
1220
1222
} else
1221
- spin_lock (& efivars -> lock );
1223
+ spin_lock_irqsave (& efivars -> lock , flags );
1222
1224
1223
1225
/*
1224
1226
* Check if there is a space enough to log.
@@ -1230,7 +1232,7 @@ static int efi_pstore_write(enum pstore_type_id type,
1230
1232
& remaining_space ,
1231
1233
& max_variable_size );
1232
1234
if (status || remaining_space < size + DUMP_NAME_LEN * 2 ) {
1233
- spin_unlock (& efivars -> lock );
1235
+ spin_unlock_irqrestore (& efivars -> lock , flags );
1234
1236
* id = part ;
1235
1237
return - ENOSPC ;
1236
1238
}
@@ -1244,7 +1246,7 @@ static int efi_pstore_write(enum pstore_type_id type,
1244
1246
efivars -> ops -> set_variable (efi_name , & vendor , PSTORE_EFI_ATTRIBUTES ,
1245
1247
size , psi -> buf );
1246
1248
1247
- spin_unlock (& efivars -> lock );
1249
+ spin_unlock_irqrestore (& efivars -> lock , flags );
1248
1250
1249
1251
if (size )
1250
1252
ret = efivar_create_sysfs_entry (efivars ,
@@ -1271,7 +1273,7 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,
1271
1273
sprintf (name , "dump-type%u-%u-%d-%lu" , type , (unsigned int )id , count ,
1272
1274
time .tv_sec );
1273
1275
1274
- spin_lock (& efivars -> lock );
1276
+ spin_lock_irq (& efivars -> lock );
1275
1277
1276
1278
for (i = 0 ; i < DUMP_NAME_LEN ; i ++ )
1277
1279
efi_name [i ] = name [i ];
@@ -1315,7 +1317,7 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,
1315
1317
if (found )
1316
1318
list_del (& found -> list );
1317
1319
1318
- spin_unlock (& efivars -> lock );
1320
+ spin_unlock_irq (& efivars -> lock );
1319
1321
1320
1322
if (found )
1321
1323
efivar_unregister (found );
@@ -1385,7 +1387,7 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
1385
1387
return - EINVAL ;
1386
1388
}
1387
1389
1388
- spin_lock (& efivars -> lock );
1390
+ spin_lock_irq (& efivars -> lock );
1389
1391
1390
1392
/*
1391
1393
* Does this variable already exist?
@@ -1403,7 +1405,7 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
1403
1405
}
1404
1406
}
1405
1407
if (found ) {
1406
- spin_unlock (& efivars -> lock );
1408
+ spin_unlock_irq (& efivars -> lock );
1407
1409
return - EINVAL ;
1408
1410
}
1409
1411
@@ -1417,10 +1419,10 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
1417
1419
if (status != EFI_SUCCESS ) {
1418
1420
printk (KERN_WARNING "efivars: set_variable() failed: status=%lx\n" ,
1419
1421
status );
1420
- spin_unlock (& efivars -> lock );
1422
+ spin_unlock_irq (& efivars -> lock );
1421
1423
return - EIO ;
1422
1424
}
1423
- spin_unlock (& efivars -> lock );
1425
+ spin_unlock_irq (& efivars -> lock );
1424
1426
1425
1427
/* Create the entry in sysfs. Locking is not required here */
1426
1428
status = efivar_create_sysfs_entry (efivars ,
@@ -1448,7 +1450,7 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
1448
1450
if (!capable (CAP_SYS_ADMIN ))
1449
1451
return - EACCES ;
1450
1452
1451
- spin_lock (& efivars -> lock );
1453
+ spin_lock_irq (& efivars -> lock );
1452
1454
1453
1455
/*
1454
1456
* Does this variable already exist?
@@ -1466,7 +1468,7 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
1466
1468
}
1467
1469
}
1468
1470
if (!found ) {
1469
- spin_unlock (& efivars -> lock );
1471
+ spin_unlock_irq (& efivars -> lock );
1470
1472
return - EINVAL ;
1471
1473
}
1472
1474
/* force the Attributes/DataSize to 0 to ensure deletion */
@@ -1482,12 +1484,12 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
1482
1484
if (status != EFI_SUCCESS ) {
1483
1485
printk (KERN_WARNING "efivars: set_variable() failed: status=%lx\n" ,
1484
1486
status );
1485
- spin_unlock (& efivars -> lock );
1487
+ spin_unlock_irq (& efivars -> lock );
1486
1488
return - EIO ;
1487
1489
}
1488
1490
list_del (& search_efivar -> list );
1489
1491
/* We need to release this lock before unregistering. */
1490
- spin_unlock (& efivars -> lock );
1492
+ spin_unlock_irq (& efivars -> lock );
1491
1493
efivar_unregister (search_efivar );
1492
1494
1493
1495
/* It's dead Jim.... */
@@ -1602,9 +1604,9 @@ efivar_create_sysfs_entry(struct efivars *efivars,
1602
1604
kfree (short_name );
1603
1605
short_name = NULL ;
1604
1606
1605
- spin_lock (& efivars -> lock );
1607
+ spin_lock_irq (& efivars -> lock );
1606
1608
list_add (& new_efivar -> list , & efivars -> list );
1607
- spin_unlock (& efivars -> lock );
1609
+ spin_unlock_irq (& efivars -> lock );
1608
1610
1609
1611
return 0 ;
1610
1612
}
@@ -1673,9 +1675,9 @@ void unregister_efivars(struct efivars *efivars)
1673
1675
struct efivar_entry * entry , * n ;
1674
1676
1675
1677
list_for_each_entry_safe (entry , n , & efivars -> list , list ) {
1676
- spin_lock (& efivars -> lock );
1678
+ spin_lock_irq (& efivars -> lock );
1677
1679
list_del (& entry -> list );
1678
- spin_unlock (& efivars -> lock );
1680
+ spin_unlock_irq (& efivars -> lock );
1679
1681
efivar_unregister (entry );
1680
1682
}
1681
1683
if (efivars -> new_var )
0 commit comments