@@ -867,19 +867,40 @@ static int blocks_are_unmapped_or_clean(struct dm_cache_metadata *cmd,
867
867
return 0 ;
868
868
}
869
869
870
- #define WRITE_LOCK (cmd ) \
871
- if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) \
870
+ #define WRITE_LOCK (cmd ) \
871
+ down_write(&cmd->root_lock); \
872
+ if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
873
+ up_write(&cmd->root_lock); \
872
874
return -EINVAL; \
873
- down_write(&cmd->root_lock)
875
+ }
874
876
875
877
#define WRITE_LOCK_VOID (cmd ) \
876
- if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) \
878
+ down_write(&cmd->root_lock); \
879
+ if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
880
+ up_write(&cmd->root_lock); \
877
881
return; \
878
- down_write(&cmd->root_lock)
882
+ }
879
883
880
884
#define WRITE_UNLOCK (cmd ) \
881
885
up_write(&cmd->root_lock)
882
886
887
+ #define READ_LOCK (cmd ) \
888
+ down_read(&cmd->root_lock); \
889
+ if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
890
+ up_read(&cmd->root_lock); \
891
+ return -EINVAL; \
892
+ }
893
+
894
+ #define READ_LOCK_VOID (cmd ) \
895
+ down_read(&cmd->root_lock); \
896
+ if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
897
+ up_read(&cmd->root_lock); \
898
+ return; \
899
+ }
900
+
901
+ #define READ_UNLOCK (cmd ) \
902
+ up_read(&cmd->root_lock)
903
+
883
904
int dm_cache_resize (struct dm_cache_metadata * cmd , dm_cblock_t new_cache_size )
884
905
{
885
906
int r ;
@@ -1015,22 +1036,20 @@ int dm_cache_load_discards(struct dm_cache_metadata *cmd,
1015
1036
{
1016
1037
int r ;
1017
1038
1018
- down_read ( & cmd -> root_lock );
1039
+ READ_LOCK ( cmd );
1019
1040
r = __load_discards (cmd , fn , context );
1020
- up_read ( & cmd -> root_lock );
1041
+ READ_UNLOCK ( cmd );
1021
1042
1022
1043
return r ;
1023
1044
}
1024
1045
1025
- dm_cblock_t dm_cache_size (struct dm_cache_metadata * cmd )
1046
+ int dm_cache_size (struct dm_cache_metadata * cmd , dm_cblock_t * result )
1026
1047
{
1027
- dm_cblock_t r ;
1048
+ READ_LOCK (cmd );
1049
+ * result = cmd -> cache_blocks ;
1050
+ READ_UNLOCK (cmd );
1028
1051
1029
- down_read (& cmd -> root_lock );
1030
- r = cmd -> cache_blocks ;
1031
- up_read (& cmd -> root_lock );
1032
-
1033
- return r ;
1052
+ return 0 ;
1034
1053
}
1035
1054
1036
1055
static int __remove (struct dm_cache_metadata * cmd , dm_cblock_t cblock )
@@ -1188,9 +1207,9 @@ int dm_cache_load_mappings(struct dm_cache_metadata *cmd,
1188
1207
{
1189
1208
int r ;
1190
1209
1191
- down_read ( & cmd -> root_lock );
1210
+ READ_LOCK ( cmd );
1192
1211
r = __load_mappings (cmd , policy , fn , context );
1193
- up_read ( & cmd -> root_lock );
1212
+ READ_UNLOCK ( cmd );
1194
1213
1195
1214
return r ;
1196
1215
}
@@ -1215,18 +1234,18 @@ static int __dump_mappings(struct dm_cache_metadata *cmd)
1215
1234
1216
1235
void dm_cache_dump (struct dm_cache_metadata * cmd )
1217
1236
{
1218
- down_read ( & cmd -> root_lock );
1237
+ READ_LOCK_VOID ( cmd );
1219
1238
__dump_mappings (cmd );
1220
- up_read ( & cmd -> root_lock );
1239
+ READ_UNLOCK ( cmd );
1221
1240
}
1222
1241
1223
1242
int dm_cache_changed_this_transaction (struct dm_cache_metadata * cmd )
1224
1243
{
1225
1244
int r ;
1226
1245
1227
- down_read ( & cmd -> root_lock );
1246
+ READ_LOCK ( cmd );
1228
1247
r = cmd -> changed ;
1229
- up_read ( & cmd -> root_lock );
1248
+ READ_UNLOCK ( cmd );
1230
1249
1231
1250
return r ;
1232
1251
}
@@ -1276,9 +1295,9 @@ int dm_cache_set_dirty(struct dm_cache_metadata *cmd,
1276
1295
void dm_cache_metadata_get_stats (struct dm_cache_metadata * cmd ,
1277
1296
struct dm_cache_statistics * stats )
1278
1297
{
1279
- down_read ( & cmd -> root_lock );
1298
+ READ_LOCK_VOID ( cmd );
1280
1299
* stats = cmd -> stats ;
1281
- up_read ( & cmd -> root_lock );
1300
+ READ_UNLOCK ( cmd );
1282
1301
}
1283
1302
1284
1303
void dm_cache_metadata_set_stats (struct dm_cache_metadata * cmd ,
@@ -1312,9 +1331,9 @@ int dm_cache_get_free_metadata_block_count(struct dm_cache_metadata *cmd,
1312
1331
{
1313
1332
int r = - EINVAL ;
1314
1333
1315
- down_read ( & cmd -> root_lock );
1334
+ READ_LOCK ( cmd );
1316
1335
r = dm_sm_get_nr_free (cmd -> metadata_sm , result );
1317
- up_read ( & cmd -> root_lock );
1336
+ READ_UNLOCK ( cmd );
1318
1337
1319
1338
return r ;
1320
1339
}
@@ -1324,9 +1343,9 @@ int dm_cache_get_metadata_dev_size(struct dm_cache_metadata *cmd,
1324
1343
{
1325
1344
int r = - EINVAL ;
1326
1345
1327
- down_read ( & cmd -> root_lock );
1346
+ READ_LOCK ( cmd );
1328
1347
r = dm_sm_get_nr_blocks (cmd -> metadata_sm , result );
1329
- up_read ( & cmd -> root_lock );
1348
+ READ_UNLOCK ( cmd );
1330
1349
1331
1350
return r ;
1332
1351
}
@@ -1417,7 +1436,13 @@ int dm_cache_write_hints(struct dm_cache_metadata *cmd, struct dm_cache_policy *
1417
1436
1418
1437
int dm_cache_metadata_all_clean (struct dm_cache_metadata * cmd , bool * result )
1419
1438
{
1420
- return blocks_are_unmapped_or_clean (cmd , 0 , cmd -> cache_blocks , result );
1439
+ int r ;
1440
+
1441
+ READ_LOCK (cmd );
1442
+ r = blocks_are_unmapped_or_clean (cmd , 0 , cmd -> cache_blocks , result );
1443
+ READ_UNLOCK (cmd );
1444
+
1445
+ return r ;
1421
1446
}
1422
1447
1423
1448
void dm_cache_metadata_set_read_only (struct dm_cache_metadata * cmd )
@@ -1440,10 +1465,7 @@ int dm_cache_metadata_set_needs_check(struct dm_cache_metadata *cmd)
1440
1465
struct dm_block * sblock ;
1441
1466
struct cache_disk_superblock * disk_super ;
1442
1467
1443
- /*
1444
- * We ignore fail_io for this function.
1445
- */
1446
- down_write (& cmd -> root_lock );
1468
+ WRITE_LOCK (cmd );
1447
1469
set_bit (NEEDS_CHECK , & cmd -> flags );
1448
1470
1449
1471
r = superblock_lock (cmd , & sblock );
@@ -1458,19 +1480,17 @@ int dm_cache_metadata_set_needs_check(struct dm_cache_metadata *cmd)
1458
1480
dm_bm_unlock (sblock );
1459
1481
1460
1482
out :
1461
- up_write ( & cmd -> root_lock );
1483
+ WRITE_UNLOCK ( cmd );
1462
1484
return r ;
1463
1485
}
1464
1486
1465
- bool dm_cache_metadata_needs_check (struct dm_cache_metadata * cmd )
1487
+ int dm_cache_metadata_needs_check (struct dm_cache_metadata * cmd , bool * result )
1466
1488
{
1467
- bool needs_check ;
1489
+ READ_LOCK (cmd );
1490
+ * result = !!test_bit (NEEDS_CHECK , & cmd -> flags );
1491
+ READ_UNLOCK (cmd );
1468
1492
1469
- down_read (& cmd -> root_lock );
1470
- needs_check = !!test_bit (NEEDS_CHECK , & cmd -> flags );
1471
- up_read (& cmd -> root_lock );
1472
-
1473
- return needs_check ;
1493
+ return 0 ;
1474
1494
}
1475
1495
1476
1496
int dm_cache_metadata_abort (struct dm_cache_metadata * cmd )
0 commit comments