@@ -47,7 +47,7 @@ struct dm_exception_table {
47
47
};
48
48
49
49
struct dm_snapshot {
50
- struct rw_semaphore lock ;
50
+ struct mutex lock ;
51
51
52
52
struct dm_dev * origin ;
53
53
struct dm_dev * cow ;
@@ -439,9 +439,9 @@ static int __find_snapshots_sharing_cow(struct dm_snapshot *snap,
439
439
if (!bdev_equal (s -> cow -> bdev , snap -> cow -> bdev ))
440
440
continue ;
441
441
442
- down_read (& s -> lock );
442
+ mutex_lock (& s -> lock );
443
443
active = s -> active ;
444
- up_read (& s -> lock );
444
+ mutex_unlock (& s -> lock );
445
445
446
446
if (active ) {
447
447
if (snap_src )
@@ -909,7 +909,7 @@ static int remove_single_exception_chunk(struct dm_snapshot *s)
909
909
int r ;
910
910
chunk_t old_chunk = s -> first_merging_chunk + s -> num_merging_chunks - 1 ;
911
911
912
- down_write (& s -> lock );
912
+ mutex_lock (& s -> lock );
913
913
914
914
/*
915
915
* Process chunks (and associated exceptions) in reverse order
@@ -924,7 +924,7 @@ static int remove_single_exception_chunk(struct dm_snapshot *s)
924
924
b = __release_queued_bios_after_merge (s );
925
925
926
926
out :
927
- up_write (& s -> lock );
927
+ mutex_unlock (& s -> lock );
928
928
if (b )
929
929
flush_bios (b );
930
930
@@ -983,9 +983,9 @@ static void snapshot_merge_next_chunks(struct dm_snapshot *s)
983
983
if (linear_chunks < 0 ) {
984
984
DMERR ("Read error in exception store: "
985
985
"shutting down merge" );
986
- down_write (& s -> lock );
986
+ mutex_lock (& s -> lock );
987
987
s -> merge_failed = 1 ;
988
- up_write (& s -> lock );
988
+ mutex_unlock (& s -> lock );
989
989
}
990
990
goto shut ;
991
991
}
@@ -1026,10 +1026,10 @@ static void snapshot_merge_next_chunks(struct dm_snapshot *s)
1026
1026
previous_count = read_pending_exceptions_done_count ();
1027
1027
}
1028
1028
1029
- down_write (& s -> lock );
1029
+ mutex_lock (& s -> lock );
1030
1030
s -> first_merging_chunk = old_chunk ;
1031
1031
s -> num_merging_chunks = linear_chunks ;
1032
- up_write (& s -> lock );
1032
+ mutex_unlock (& s -> lock );
1033
1033
1034
1034
/* Wait until writes to all 'linear_chunks' drain */
1035
1035
for (i = 0 ; i < linear_chunks ; i ++ )
@@ -1071,10 +1071,10 @@ static void merge_callback(int read_err, unsigned long write_err, void *context)
1071
1071
return ;
1072
1072
1073
1073
shut :
1074
- down_write (& s -> lock );
1074
+ mutex_lock (& s -> lock );
1075
1075
s -> merge_failed = 1 ;
1076
1076
b = __release_queued_bios_after_merge (s );
1077
- up_write (& s -> lock );
1077
+ mutex_unlock (& s -> lock );
1078
1078
error_bios (b );
1079
1079
1080
1080
merge_shutdown (s );
@@ -1173,7 +1173,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1173
1173
s -> exception_start_sequence = 0 ;
1174
1174
s -> exception_complete_sequence = 0 ;
1175
1175
INIT_LIST_HEAD (& s -> out_of_order_list );
1176
- init_rwsem (& s -> lock );
1176
+ mutex_init (& s -> lock );
1177
1177
INIT_LIST_HEAD (& s -> list );
1178
1178
spin_lock_init (& s -> pe_lock );
1179
1179
s -> state_bits = 0 ;
@@ -1338,9 +1338,9 @@ static void snapshot_dtr(struct dm_target *ti)
1338
1338
/* Check whether exception handover must be cancelled */
1339
1339
(void ) __find_snapshots_sharing_cow (s , & snap_src , & snap_dest , NULL );
1340
1340
if (snap_src && snap_dest && (s == snap_src )) {
1341
- down_write (& snap_dest -> lock );
1341
+ mutex_lock (& snap_dest -> lock );
1342
1342
snap_dest -> valid = 0 ;
1343
- up_write (& snap_dest -> lock );
1343
+ mutex_unlock (& snap_dest -> lock );
1344
1344
DMERR ("Cancelling snapshot handover." );
1345
1345
}
1346
1346
up_read (& _origins_lock );
@@ -1371,6 +1371,8 @@ static void snapshot_dtr(struct dm_target *ti)
1371
1371
1372
1372
dm_exception_store_destroy (s -> store );
1373
1373
1374
+ mutex_destroy (& s -> lock );
1375
+
1374
1376
dm_put_device (ti , s -> cow );
1375
1377
1376
1378
dm_put_device (ti , s -> origin );
@@ -1458,22 +1460,22 @@ static void pending_complete(void *context, int success)
1458
1460
1459
1461
if (!success ) {
1460
1462
/* Read/write error - snapshot is unusable */
1461
- down_write (& s -> lock );
1463
+ mutex_lock (& s -> lock );
1462
1464
__invalidate_snapshot (s , - EIO );
1463
1465
error = 1 ;
1464
1466
goto out ;
1465
1467
}
1466
1468
1467
1469
e = alloc_completed_exception (GFP_NOIO );
1468
1470
if (!e ) {
1469
- down_write (& s -> lock );
1471
+ mutex_lock (& s -> lock );
1470
1472
__invalidate_snapshot (s , - ENOMEM );
1471
1473
error = 1 ;
1472
1474
goto out ;
1473
1475
}
1474
1476
* e = pe -> e ;
1475
1477
1476
- down_write (& s -> lock );
1478
+ mutex_lock (& s -> lock );
1477
1479
if (!s -> valid ) {
1478
1480
free_completed_exception (e );
1479
1481
error = 1 ;
@@ -1498,7 +1500,7 @@ static void pending_complete(void *context, int success)
1498
1500
full_bio -> bi_end_io = pe -> full_bio_end_io ;
1499
1501
increment_pending_exceptions_done_count ();
1500
1502
1501
- up_write (& s -> lock );
1503
+ mutex_unlock (& s -> lock );
1502
1504
1503
1505
/* Submit any pending write bios */
1504
1506
if (error ) {
@@ -1694,7 +1696,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
1694
1696
1695
1697
/* FIXME: should only take write lock if we need
1696
1698
* to copy an exception */
1697
- down_write (& s -> lock );
1699
+ mutex_lock (& s -> lock );
1698
1700
1699
1701
if (!s -> valid || (unlikely (s -> snapshot_overflowed ) &&
1700
1702
bio_data_dir (bio ) == WRITE )) {
@@ -1717,9 +1719,9 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
1717
1719
if (bio_data_dir (bio ) == WRITE ) {
1718
1720
pe = __lookup_pending_exception (s , chunk );
1719
1721
if (!pe ) {
1720
- up_write (& s -> lock );
1722
+ mutex_unlock (& s -> lock );
1721
1723
pe = alloc_pending_exception (s );
1722
- down_write (& s -> lock );
1724
+ mutex_lock (& s -> lock );
1723
1725
1724
1726
if (!s -> valid || s -> snapshot_overflowed ) {
1725
1727
free_pending_exception (pe );
@@ -1754,7 +1756,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
1754
1756
bio -> bi_iter .bi_size ==
1755
1757
(s -> store -> chunk_size << SECTOR_SHIFT )) {
1756
1758
pe -> started = 1 ;
1757
- up_write (& s -> lock );
1759
+ mutex_unlock (& s -> lock );
1758
1760
start_full_bio (pe , bio );
1759
1761
goto out ;
1760
1762
}
@@ -1764,7 +1766,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
1764
1766
if (!pe -> started ) {
1765
1767
/* this is protected by snap->lock */
1766
1768
pe -> started = 1 ;
1767
- up_write (& s -> lock );
1769
+ mutex_unlock (& s -> lock );
1768
1770
start_copy (pe );
1769
1771
goto out ;
1770
1772
}
@@ -1774,7 +1776,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
1774
1776
}
1775
1777
1776
1778
out_unlock :
1777
- up_write (& s -> lock );
1779
+ mutex_unlock (& s -> lock );
1778
1780
out :
1779
1781
return r ;
1780
1782
}
@@ -1810,7 +1812,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
1810
1812
1811
1813
chunk = sector_to_chunk (s -> store , bio -> bi_iter .bi_sector );
1812
1814
1813
- down_write (& s -> lock );
1815
+ mutex_lock (& s -> lock );
1814
1816
1815
1817
/* Full merging snapshots are redirected to the origin */
1816
1818
if (!s -> valid )
@@ -1841,12 +1843,12 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
1841
1843
bio_set_dev (bio , s -> origin -> bdev );
1842
1844
1843
1845
if (bio_data_dir (bio ) == WRITE ) {
1844
- up_write (& s -> lock );
1846
+ mutex_unlock (& s -> lock );
1845
1847
return do_origin (s -> origin , bio );
1846
1848
}
1847
1849
1848
1850
out_unlock :
1849
- up_write (& s -> lock );
1851
+ mutex_unlock (& s -> lock );
1850
1852
1851
1853
return r ;
1852
1854
}
@@ -1878,7 +1880,7 @@ static int snapshot_preresume(struct dm_target *ti)
1878
1880
down_read (& _origins_lock );
1879
1881
(void ) __find_snapshots_sharing_cow (s , & snap_src , & snap_dest , NULL );
1880
1882
if (snap_src && snap_dest ) {
1881
- down_read (& snap_src -> lock );
1883
+ mutex_lock (& snap_src -> lock );
1882
1884
if (s == snap_src ) {
1883
1885
DMERR ("Unable to resume snapshot source until "
1884
1886
"handover completes." );
@@ -1888,7 +1890,7 @@ static int snapshot_preresume(struct dm_target *ti)
1888
1890
"source is suspended." );
1889
1891
r = - EINVAL ;
1890
1892
}
1891
- up_read (& snap_src -> lock );
1893
+ mutex_unlock (& snap_src -> lock );
1892
1894
}
1893
1895
up_read (& _origins_lock );
1894
1896
@@ -1934,11 +1936,11 @@ static void snapshot_resume(struct dm_target *ti)
1934
1936
1935
1937
(void ) __find_snapshots_sharing_cow (s , & snap_src , & snap_dest , NULL );
1936
1938
if (snap_src && snap_dest ) {
1937
- down_write (& snap_src -> lock );
1938
- down_write_nested (& snap_dest -> lock , SINGLE_DEPTH_NESTING );
1939
+ mutex_lock (& snap_src -> lock );
1940
+ mutex_lock_nested (& snap_dest -> lock , SINGLE_DEPTH_NESTING );
1939
1941
__handover_exceptions (snap_src , snap_dest );
1940
- up_write (& snap_dest -> lock );
1941
- up_write (& snap_src -> lock );
1942
+ mutex_unlock (& snap_dest -> lock );
1943
+ mutex_unlock (& snap_src -> lock );
1942
1944
}
1943
1945
1944
1946
up_read (& _origins_lock );
@@ -1953,9 +1955,9 @@ static void snapshot_resume(struct dm_target *ti)
1953
1955
/* Now we have correct chunk size, reregister */
1954
1956
reregister_snapshot (s );
1955
1957
1956
- down_write (& s -> lock );
1958
+ mutex_lock (& s -> lock );
1957
1959
s -> active = 1 ;
1958
- up_write (& s -> lock );
1960
+ mutex_unlock (& s -> lock );
1959
1961
}
1960
1962
1961
1963
static uint32_t get_origin_minimum_chunksize (struct block_device * bdev )
@@ -1995,7 +1997,7 @@ static void snapshot_status(struct dm_target *ti, status_type_t type,
1995
1997
switch (type ) {
1996
1998
case STATUSTYPE_INFO :
1997
1999
1998
- down_write (& snap -> lock );
2000
+ mutex_lock (& snap -> lock );
1999
2001
2000
2002
if (!snap -> valid )
2001
2003
DMEMIT ("Invalid" );
@@ -2020,7 +2022,7 @@ static void snapshot_status(struct dm_target *ti, status_type_t type,
2020
2022
DMEMIT ("Unknown" );
2021
2023
}
2022
2024
2023
- up_write (& snap -> lock );
2025
+ mutex_unlock (& snap -> lock );
2024
2026
2025
2027
break ;
2026
2028
@@ -2086,7 +2088,7 @@ static int __origin_write(struct list_head *snapshots, sector_t sector,
2086
2088
if (dm_target_is_snapshot_merge (snap -> ti ))
2087
2089
continue ;
2088
2090
2089
- down_write (& snap -> lock );
2091
+ mutex_lock (& snap -> lock );
2090
2092
2091
2093
/* Only deal with valid and active snapshots */
2092
2094
if (!snap -> valid || !snap -> active )
@@ -2113,9 +2115,9 @@ static int __origin_write(struct list_head *snapshots, sector_t sector,
2113
2115
2114
2116
pe = __lookup_pending_exception (snap , chunk );
2115
2117
if (!pe ) {
2116
- up_write (& snap -> lock );
2118
+ mutex_unlock (& snap -> lock );
2117
2119
pe = alloc_pending_exception (snap );
2118
- down_write (& snap -> lock );
2120
+ mutex_lock (& snap -> lock );
2119
2121
2120
2122
if (!snap -> valid ) {
2121
2123
free_pending_exception (pe );
@@ -2158,7 +2160,7 @@ static int __origin_write(struct list_head *snapshots, sector_t sector,
2158
2160
}
2159
2161
2160
2162
next_snapshot :
2161
- up_write (& snap -> lock );
2163
+ mutex_unlock (& snap -> lock );
2162
2164
2163
2165
if (pe_to_start_now ) {
2164
2166
start_copy (pe_to_start_now );
0 commit comments