@@ -50,6 +50,42 @@ static char *sb_writers_name[SB_FREEZE_LEVELS] = {
50
50
"sb_internal" ,
51
51
};
52
52
53
+ static inline void super_lock (struct super_block * sb , bool excl )
54
+ {
55
+ if (excl )
56
+ down_write (& sb -> s_umount );
57
+ else
58
+ down_read (& sb -> s_umount );
59
+ }
60
+
61
+ static inline void super_unlock (struct super_block * sb , bool excl )
62
+ {
63
+ if (excl )
64
+ up_write (& sb -> s_umount );
65
+ else
66
+ up_read (& sb -> s_umount );
67
+ }
68
+
69
+ static inline void super_lock_excl (struct super_block * sb )
70
+ {
71
+ super_lock (sb , true);
72
+ }
73
+
74
+ static inline void super_lock_shared (struct super_block * sb )
75
+ {
76
+ super_lock (sb , false);
77
+ }
78
+
79
+ static inline void super_unlock_excl (struct super_block * sb )
80
+ {
81
+ super_unlock (sb , true);
82
+ }
83
+
84
+ static inline void super_unlock_shared (struct super_block * sb )
85
+ {
86
+ super_unlock (sb , false);
87
+ }
88
+
53
89
/*
54
90
* One thing we have to be careful of with a per-sb shrinker is that we don't
55
91
* drop the last active reference to the superblock from within the shrinker.
@@ -110,7 +146,7 @@ static unsigned long super_cache_scan(struct shrinker *shrink,
110
146
freed += sb -> s_op -> free_cached_objects (sb , sc );
111
147
}
112
148
113
- up_read ( & sb -> s_umount );
149
+ super_unlock_shared ( sb );
114
150
return freed ;
115
151
}
116
152
@@ -176,7 +212,7 @@ static void destroy_unused_super(struct super_block *s)
176
212
{
177
213
if (!s )
178
214
return ;
179
- up_write ( & s -> s_umount );
215
+ super_unlock_excl ( s );
180
216
list_lru_destroy (& s -> s_dentry_lru );
181
217
list_lru_destroy (& s -> s_inode_lru );
182
218
security_sb_free (s );
@@ -340,7 +376,7 @@ void deactivate_locked_super(struct super_block *s)
340
376
put_filesystem (fs );
341
377
put_super (s );
342
378
} else {
343
- up_write ( & s -> s_umount );
379
+ super_unlock_excl ( s );
344
380
}
345
381
}
346
382
@@ -357,7 +393,7 @@ EXPORT_SYMBOL(deactivate_locked_super);
357
393
void deactivate_super (struct super_block * s )
358
394
{
359
395
if (!atomic_add_unless (& s -> s_active , -1 , 1 )) {
360
- down_write ( & s -> s_umount );
396
+ super_lock_excl ( s );
361
397
deactivate_locked_super (s );
362
398
}
363
399
}
@@ -381,12 +417,12 @@ static int grab_super(struct super_block *s) __releases(sb_lock)
381
417
{
382
418
s -> s_count ++ ;
383
419
spin_unlock (& sb_lock );
384
- down_write ( & s -> s_umount );
420
+ super_lock_excl ( s );
385
421
if ((s -> s_flags & SB_BORN ) && atomic_inc_not_zero (& s -> s_active )) {
386
422
put_super (s );
387
423
return 1 ;
388
424
}
389
- up_write ( & s -> s_umount );
425
+ super_unlock_excl ( s );
390
426
put_super (s );
391
427
return 0 ;
392
428
}
@@ -414,7 +450,7 @@ bool trylock_super(struct super_block *sb)
414
450
if (!hlist_unhashed (& sb -> s_instances ) &&
415
451
sb -> s_root && (sb -> s_flags & SB_BORN ))
416
452
return true;
417
- up_read ( & sb -> s_umount );
453
+ super_unlock_shared ( sb );
418
454
}
419
455
420
456
return false;
@@ -439,13 +475,13 @@ bool trylock_super(struct super_block *sb)
439
475
void retire_super (struct super_block * sb )
440
476
{
441
477
WARN_ON (!sb -> s_bdev );
442
- down_write ( & sb -> s_umount );
478
+ super_lock_excl ( sb );
443
479
if (sb -> s_iflags & SB_I_PERSB_BDI ) {
444
480
bdi_unregister (sb -> s_bdi );
445
481
sb -> s_iflags &= ~SB_I_PERSB_BDI ;
446
482
}
447
483
sb -> s_iflags |= SB_I_RETIRED ;
448
- up_write ( & sb -> s_umount );
484
+ super_unlock_excl ( sb );
449
485
}
450
486
EXPORT_SYMBOL (retire_super );
451
487
@@ -521,7 +557,7 @@ void generic_shutdown_super(struct super_block *sb)
521
557
/* should be initialized for __put_super_and_need_restart() */
522
558
hlist_del_init (& sb -> s_instances );
523
559
spin_unlock (& sb_lock );
524
- up_write ( & sb -> s_umount );
560
+ super_unlock_excl ( sb );
525
561
if (sb -> s_bdi != & noop_backing_dev_info ) {
526
562
if (sb -> s_iflags & SB_I_PERSB_BDI )
527
563
bdi_unregister (sb -> s_bdi );
@@ -685,15 +721,15 @@ EXPORT_SYMBOL(sget);
685
721
686
722
void drop_super (struct super_block * sb )
687
723
{
688
- up_read ( & sb -> s_umount );
724
+ super_unlock_shared ( sb );
689
725
put_super (sb );
690
726
}
691
727
692
728
EXPORT_SYMBOL (drop_super );
693
729
694
730
void drop_super_exclusive (struct super_block * sb )
695
731
{
696
- up_write ( & sb -> s_umount );
732
+ super_unlock_excl ( sb );
697
733
put_super (sb );
698
734
}
699
735
EXPORT_SYMBOL (drop_super_exclusive );
@@ -739,10 +775,10 @@ void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
739
775
sb -> s_count ++ ;
740
776
spin_unlock (& sb_lock );
741
777
742
- down_read ( & sb -> s_umount );
778
+ super_lock_shared ( sb );
743
779
if (sb -> s_root && (sb -> s_flags & SB_BORN ))
744
780
f (sb , arg );
745
- up_read ( & sb -> s_umount );
781
+ super_unlock_shared ( sb );
746
782
747
783
spin_lock (& sb_lock );
748
784
if (p )
@@ -773,10 +809,10 @@ void iterate_supers_type(struct file_system_type *type,
773
809
sb -> s_count ++ ;
774
810
spin_unlock (& sb_lock );
775
811
776
- down_read ( & sb -> s_umount );
812
+ super_lock_shared ( sb );
777
813
if (sb -> s_root && (sb -> s_flags & SB_BORN ))
778
814
f (sb , arg );
779
- up_read ( & sb -> s_umount );
815
+ super_unlock_shared ( sb );
780
816
781
817
spin_lock (& sb_lock );
782
818
if (p )
@@ -813,7 +849,7 @@ struct super_block *get_active_super(struct block_device *bdev)
813
849
if (sb -> s_bdev == bdev ) {
814
850
if (!grab_super (sb ))
815
851
goto restart ;
816
- up_write ( & sb -> s_umount );
852
+ super_unlock_excl ( sb );
817
853
return sb ;
818
854
}
819
855
}
@@ -833,17 +869,11 @@ struct super_block *user_get_super(dev_t dev, bool excl)
833
869
if (sb -> s_dev == dev ) {
834
870
sb -> s_count ++ ;
835
871
spin_unlock (& sb_lock );
836
- if (excl )
837
- down_write (& sb -> s_umount );
838
- else
839
- down_read (& sb -> s_umount );
872
+ super_lock (sb , excl );
840
873
/* still alive? */
841
874
if (sb -> s_root && (sb -> s_flags & SB_BORN ))
842
875
return sb ;
843
- if (excl )
844
- up_write (& sb -> s_umount );
845
- else
846
- up_read (& sb -> s_umount );
876
+ super_unlock (sb , excl );
847
877
/* nope, got unmounted */
848
878
spin_lock (& sb_lock );
849
879
__put_super (sb );
@@ -889,9 +919,9 @@ int reconfigure_super(struct fs_context *fc)
889
919
890
920
if (remount_ro ) {
891
921
if (!hlist_empty (& sb -> s_pins )) {
892
- up_write ( & sb -> s_umount );
922
+ super_unlock_excl ( sb );
893
923
group_pin_kill (& sb -> s_pins );
894
- down_write ( & sb -> s_umount );
924
+ super_lock_excl ( sb );
895
925
if (!sb -> s_root )
896
926
return 0 ;
897
927
if (sb -> s_writers .frozen != SB_UNFROZEN )
@@ -954,7 +984,7 @@ int reconfigure_super(struct fs_context *fc)
954
984
955
985
static void do_emergency_remount_callback (struct super_block * sb )
956
986
{
957
- down_write ( & sb -> s_umount );
987
+ super_lock_excl ( sb );
958
988
if (sb -> s_root && sb -> s_bdev && (sb -> s_flags & SB_BORN ) &&
959
989
!sb_rdonly (sb )) {
960
990
struct fs_context * fc ;
@@ -967,7 +997,7 @@ static void do_emergency_remount_callback(struct super_block *sb)
967
997
put_fs_context (fc );
968
998
}
969
999
}
970
- up_write ( & sb -> s_umount );
1000
+ super_unlock_excl ( sb );
971
1001
}
972
1002
973
1003
static void do_emergency_remount (struct work_struct * work )
@@ -990,12 +1020,12 @@ void emergency_remount(void)
990
1020
991
1021
static void do_thaw_all_callback (struct super_block * sb )
992
1022
{
993
- down_write ( & sb -> s_umount );
1023
+ super_lock_excl ( sb );
994
1024
if (sb -> s_root && sb -> s_flags & SB_BORN ) {
995
1025
emergency_thaw_bdev (sb );
996
1026
thaw_super_locked (sb );
997
1027
} else {
998
- up_write ( & sb -> s_umount );
1028
+ super_unlock_excl ( sb );
999
1029
}
1000
1030
}
1001
1031
@@ -1182,10 +1212,10 @@ EXPORT_SYMBOL(get_tree_keyed);
1182
1212
*/
1183
1213
static bool lock_active_super (struct super_block * sb )
1184
1214
{
1185
- down_read ( & sb -> s_umount );
1215
+ super_lock_shared ( sb );
1186
1216
if (!sb -> s_root ||
1187
1217
(sb -> s_flags & (SB_ACTIVE | SB_BORN )) != (SB_ACTIVE | SB_BORN )) {
1188
- up_read ( & sb -> s_umount );
1218
+ super_unlock_shared ( sb );
1189
1219
return false;
1190
1220
}
1191
1221
return true;
@@ -1208,7 +1238,7 @@ static void fs_bdev_mark_dead(struct block_device *bdev, bool surprise)
1208
1238
if (sb -> s_op -> shutdown )
1209
1239
sb -> s_op -> shutdown (sb );
1210
1240
1211
- up_read ( & sb -> s_umount );
1241
+ super_unlock_shared ( sb );
1212
1242
}
1213
1243
1214
1244
static void fs_bdev_sync (struct block_device * bdev )
@@ -1220,7 +1250,7 @@ static void fs_bdev_sync(struct block_device *bdev)
1220
1250
if (!lock_active_super (sb ))
1221
1251
return ;
1222
1252
sync_filesystem (sb );
1223
- up_read ( & sb -> s_umount );
1253
+ super_unlock_shared ( sb );
1224
1254
}
1225
1255
1226
1256
const struct blk_holder_ops fs_holder_ops = {
@@ -1342,9 +1372,9 @@ int get_tree_bdev(struct fs_context *fc,
1342
1372
* bdev_mark_dead()). It is safe because we have active sb
1343
1373
* reference and SB_BORN is not set yet.
1344
1374
*/
1345
- up_write ( & s -> s_umount );
1375
+ super_unlock_excl ( s );
1346
1376
error = setup_bdev_super (s , fc -> sb_flags , fc );
1347
- down_write ( & s -> s_umount );
1377
+ super_lock_excl ( s );
1348
1378
if (!error )
1349
1379
error = fill_super (s , fc );
1350
1380
if (error ) {
@@ -1394,9 +1424,9 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
1394
1424
* bdev_mark_dead()). It is safe because we have active sb
1395
1425
* reference and SB_BORN is not set yet.
1396
1426
*/
1397
- up_write ( & s -> s_umount );
1427
+ super_unlock_excl ( s );
1398
1428
error = setup_bdev_super (s , flags , NULL );
1399
- down_write ( & s -> s_umount );
1429
+ super_lock_excl ( s );
1400
1430
if (!error )
1401
1431
error = fill_super (s , data , flags & SB_SILENT ? 1 : 0 );
1402
1432
if (error ) {
@@ -1685,29 +1715,29 @@ int freeze_super(struct super_block *sb)
1685
1715
int ret ;
1686
1716
1687
1717
atomic_inc (& sb -> s_active );
1688
- down_write ( & sb -> s_umount );
1718
+ super_lock_excl ( sb );
1689
1719
if (sb -> s_writers .frozen != SB_UNFROZEN ) {
1690
1720
deactivate_locked_super (sb );
1691
1721
return - EBUSY ;
1692
1722
}
1693
1723
1694
1724
if (!(sb -> s_flags & SB_BORN )) {
1695
- up_write ( & sb -> s_umount );
1725
+ super_unlock_excl ( sb );
1696
1726
return 0 ; /* sic - it's "nothing to do" */
1697
1727
}
1698
1728
1699
1729
if (sb_rdonly (sb )) {
1700
1730
/* Nothing to do really... */
1701
1731
sb -> s_writers .frozen = SB_FREEZE_COMPLETE ;
1702
- up_write ( & sb -> s_umount );
1732
+ super_unlock_excl ( sb );
1703
1733
return 0 ;
1704
1734
}
1705
1735
1706
1736
sb -> s_writers .frozen = SB_FREEZE_WRITE ;
1707
1737
/* Release s_umount to preserve sb_start_write -> s_umount ordering */
1708
- up_write ( & sb -> s_umount );
1738
+ super_unlock_excl ( sb );
1709
1739
sb_wait_write (sb , SB_FREEZE_WRITE );
1710
- down_write ( & sb -> s_umount );
1740
+ super_lock_excl ( sb );
1711
1741
1712
1742
/* Now we go and block page faults... */
1713
1743
sb -> s_writers .frozen = SB_FREEZE_PAGEFAULT ;
@@ -1743,7 +1773,7 @@ int freeze_super(struct super_block *sb)
1743
1773
*/
1744
1774
sb -> s_writers .frozen = SB_FREEZE_COMPLETE ;
1745
1775
lockdep_sb_freeze_release (sb );
1746
- up_write ( & sb -> s_umount );
1776
+ super_unlock_excl ( sb );
1747
1777
return 0 ;
1748
1778
}
1749
1779
EXPORT_SYMBOL (freeze_super );
@@ -1753,7 +1783,7 @@ static int thaw_super_locked(struct super_block *sb)
1753
1783
int error ;
1754
1784
1755
1785
if (sb -> s_writers .frozen != SB_FREEZE_COMPLETE ) {
1756
- up_write ( & sb -> s_umount );
1786
+ super_unlock_excl ( sb );
1757
1787
return - EINVAL ;
1758
1788
}
1759
1789
@@ -1770,7 +1800,7 @@ static int thaw_super_locked(struct super_block *sb)
1770
1800
printk (KERN_ERR
1771
1801
"VFS:Filesystem thaw failed\n" );
1772
1802
lockdep_sb_freeze_release (sb );
1773
- up_write ( & sb -> s_umount );
1803
+ super_unlock_excl ( sb );
1774
1804
return error ;
1775
1805
}
1776
1806
}
@@ -1790,7 +1820,7 @@ static int thaw_super_locked(struct super_block *sb)
1790
1820
*/
1791
1821
int thaw_super (struct super_block * sb )
1792
1822
{
1793
- down_write ( & sb -> s_umount );
1823
+ super_lock_excl ( sb );
1794
1824
return thaw_super_locked (sb );
1795
1825
}
1796
1826
EXPORT_SYMBOL (thaw_super );
0 commit comments