• Home
  • Raw
  • Download

Lines Matching full:sb

42 static int thaw_super_locked(struct super_block *sb, enum freeze_holder who);
53 static inline void __super_lock(struct super_block *sb, bool excl) in __super_lock() argument
56 down_write(&sb->s_umount); in __super_lock()
58 down_read(&sb->s_umount); in __super_lock()
61 static inline void super_unlock(struct super_block *sb, bool excl) in super_unlock() argument
64 up_write(&sb->s_umount); in super_unlock()
66 up_read(&sb->s_umount); in super_unlock()
69 static inline void __super_lock_excl(struct super_block *sb) in __super_lock_excl() argument
71 __super_lock(sb, true); in __super_lock_excl()
74 static inline void super_unlock_excl(struct super_block *sb) in super_unlock_excl() argument
76 super_unlock(sb, true); in super_unlock_excl()
79 static inline void super_unlock_shared(struct super_block *sb) in super_unlock_shared() argument
81 super_unlock(sb, false); in super_unlock_shared()
84 static inline bool wait_born(struct super_block *sb) in wait_born() argument
92 flags = smp_load_acquire(&sb->s_flags); in wait_born()
98 * @sb: superblock to wait for
106 * The caller must have acquired a temporary reference on @sb->s_count.
111 static __must_check bool super_lock(struct super_block *sb, bool excl) in super_lock() argument
114 lockdep_assert_not_held(&sb->s_umount); in super_lock()
117 __super_lock(sb, excl); in super_lock()
121 * @sb->s_root is NULL and @sb->s_active is 0. No one needs to in super_lock()
124 if (sb->s_flags & SB_DYING) in super_lock()
128 if (sb->s_flags & SB_BORN) in super_lock()
131 super_unlock(sb, excl); in super_lock()
134 wait_var_event(&sb->s_flags, wait_born(sb)); in super_lock()
138 * Just reacquire @sb->s_umount for the caller. in super_lock()
143 /* wait and acquire read-side of @sb->s_umount */
144 static inline bool super_lock_shared(struct super_block *sb) in super_lock_shared() argument
146 return super_lock(sb, false); in super_lock_shared()
149 /* wait and acquire write-side of @sb->s_umount */
150 static inline bool super_lock_excl(struct super_block *sb) in super_lock_excl() argument
152 return super_lock(sb, true); in super_lock_excl()
157 static void super_wake(struct super_block *sb, unsigned int flag) in super_wake() argument
167 smp_store_release(&sb->s_flags, sb->s_flags | flag); in super_wake()
174 wake_up_var(&sb->s_flags); in super_wake()
178 * One thing we have to be careful of with a per-sb shrinker is that we don't
187 struct super_block *sb; in super_cache_scan() local
194 sb = container_of(shrink, struct super_block, s_shrink); in super_cache_scan()
203 if (!super_trylock_shared(sb)) in super_cache_scan()
206 if (sb->s_op->nr_cached_objects) in super_cache_scan()
207 fs_objects = sb->s_op->nr_cached_objects(sb, sc); in super_cache_scan()
209 inodes = list_lru_shrink_count(&sb->s_inode_lru, sc); in super_cache_scan()
210 dentries = list_lru_shrink_count(&sb->s_dentry_lru, sc); in super_cache_scan()
228 freed = prune_dcache_sb(sb, sc); in super_cache_scan()
230 freed += prune_icache_sb(sb, sc); in super_cache_scan()
234 freed += sb->s_op->free_cached_objects(sb, sc); in super_cache_scan()
237 super_unlock_shared(sb); in super_cache_scan()
244 struct super_block *sb; in super_cache_count() local
247 sb = container_of(shrink, struct super_block, s_shrink); in super_cache_count()
263 if (!(sb->s_flags & SB_BORN)) in super_cache_count()
267 if (sb->s_op && sb->s_op->nr_cached_objects) in super_cache_count()
268 total_objects = sb->s_op->nr_cached_objects(sb, sc); in super_cache_count()
270 total_objects += list_lru_shrink_count(&sb->s_dentry_lru, sc); in super_cache_count()
271 total_objects += list_lru_shrink_count(&sb->s_inode_lru, sc); in super_cache_count()
340 * When it cannot find a suitable sb, it allocates a new in alloc_super()
391 if (prealloc_shrinker(&s->s_shrink, "sb-%s", type->name)) in alloc_super()
425 * @sb: superblock in question
430 void put_super(struct super_block *sb) in put_super() argument
433 __put_super(sb); in put_super()
437 static void kill_super_notify(struct super_block *sb) in kill_super_notify() argument
439 lockdep_assert_not_held(&sb->s_umount); in kill_super_notify()
442 if (sb->s_flags & SB_DEAD) in kill_super_notify()
453 hlist_del_init(&sb->s_instances); in kill_super_notify()
458 * We don't need @sb->s_umount here as every concurrent caller in kill_super_notify()
462 super_wake(sb, SB_DEAD); in kill_super_notify()
549 static inline bool wait_dead(struct super_block *sb) in wait_dead() argument
557 flags = smp_load_acquire(&sb->s_flags); in wait_dead()
563 * @sb: superblock to acquire
568 * sb->kill() and be marked as SB_DEAD.
573 static bool grab_super_dead(struct super_block *sb) in grab_super_dead() argument
576 sb->s_count++; in grab_super_dead()
577 if (grab_super(sb)) { in grab_super_dead()
578 put_super(sb); in grab_super_dead()
579 lockdep_assert_held(&sb->s_umount); in grab_super_dead()
582 wait_var_event(&sb->s_flags, wait_dead(sb)); in grab_super_dead()
583 lockdep_assert_not_held(&sb->s_umount); in grab_super_dead()
584 put_super(sb); in grab_super_dead()
590 * @sb: reference we are trying to grab
605 bool super_trylock_shared(struct super_block *sb) in super_trylock_shared() argument
607 if (down_read_trylock(&sb->s_umount)) { in super_trylock_shared()
608 if (!(sb->s_flags & SB_DYING) && sb->s_root && in super_trylock_shared()
609 (sb->s_flags & SB_BORN)) in super_trylock_shared()
611 super_unlock_shared(sb); in super_trylock_shared()
619 * @sb: superblock to retire
633 void retire_super(struct super_block *sb) in retire_super() argument
635 WARN_ON(!sb->s_bdev); in retire_super()
636 __super_lock_excl(sb); in retire_super()
637 if (sb->s_iflags & SB_I_PERSB_BDI) { in retire_super()
638 bdi_unregister(sb->s_bdi); in retire_super()
639 sb->s_iflags &= ~SB_I_PERSB_BDI; in retire_super()
641 sb->s_iflags |= SB_I_RETIRED; in retire_super()
642 super_unlock_excl(sb); in retire_super()
648 * @sb: superblock to kill
660 void generic_shutdown_super(struct super_block *sb) in generic_shutdown_super() argument
662 const struct super_operations *sop = sb->s_op; in generic_shutdown_super()
664 if (sb->s_root) { in generic_shutdown_super()
665 shrink_dcache_for_umount(sb); in generic_shutdown_super()
666 sync_filesystem(sb); in generic_shutdown_super()
667 sb->s_flags &= ~SB_ACTIVE; in generic_shutdown_super()
672 evict_inodes(sb); in generic_shutdown_super()
678 fsnotify_sb_delete(sb); in generic_shutdown_super()
679 security_sb_delete(sb); in generic_shutdown_super()
685 fscrypt_destroy_keyring(sb); in generic_shutdown_super()
687 if (sb->s_dio_done_wq) { in generic_shutdown_super()
688 destroy_workqueue(sb->s_dio_done_wq); in generic_shutdown_super()
689 sb->s_dio_done_wq = NULL; in generic_shutdown_super()
693 sop->put_super(sb); in generic_shutdown_super()
695 if (CHECK_DATA_CORRUPTION(!list_empty(&sb->s_inodes), in generic_shutdown_super()
697 sb->s_id, sb->s_type->name)) { in generic_shutdown_super()
705 spin_lock(&sb->s_inode_list_lock); in generic_shutdown_super()
706 list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { in generic_shutdown_super()
711 spin_unlock(&sb->s_inode_list_lock); in generic_shutdown_super()
721 * sget{_fc}() until we passed sb->kill_sb(). in generic_shutdown_super()
723 super_wake(sb, SB_DYING); in generic_shutdown_super()
724 super_unlock_excl(sb); in generic_shutdown_super()
725 if (sb->s_bdi != &noop_backing_dev_info) { in generic_shutdown_super()
726 if (sb->s_iflags & SB_I_PERSB_BDI) in generic_shutdown_super()
727 bdi_unregister(sb->s_bdi); in generic_shutdown_super()
728 bdi_put(sb->s_bdi); in generic_shutdown_super()
729 sb->s_bdi = &noop_backing_dev_info; in generic_shutdown_super()
920 void drop_super(struct super_block *sb) in drop_super() argument
922 super_unlock_shared(sb); in drop_super()
923 put_super(sb); in drop_super()
928 void drop_super_exclusive(struct super_block *sb) in drop_super_exclusive() argument
930 super_unlock_excl(sb); in drop_super_exclusive()
931 put_super(sb); in drop_super_exclusive()
937 struct super_block *sb, *p = NULL; in __iterate_supers() local
940 list_for_each_entry(sb, &super_blocks, s_list) { in __iterate_supers()
942 if (smp_load_acquire(&sb->s_flags) & SB_DYING) in __iterate_supers()
944 sb->s_count++; in __iterate_supers()
947 f(sb); in __iterate_supers()
952 p = sb; in __iterate_supers()
968 struct super_block *sb, *p = NULL; in iterate_supers() local
971 list_for_each_entry(sb, &super_blocks, s_list) { in iterate_supers()
974 sb->s_count++; in iterate_supers()
977 born = super_lock_shared(sb); in iterate_supers()
978 if (born && sb->s_root) in iterate_supers()
979 f(sb, arg); in iterate_supers()
980 super_unlock_shared(sb); in iterate_supers()
985 p = sb; in iterate_supers()
1004 struct super_block *sb, *p = NULL; in iterate_supers_type() local
1007 hlist_for_each_entry(sb, &type->fs_supers, s_instances) { in iterate_supers_type()
1010 sb->s_count++; in iterate_supers_type()
1013 born = super_lock_shared(sb); in iterate_supers_type()
1014 if (born && sb->s_root) in iterate_supers_type()
1015 f(sb, arg); in iterate_supers_type()
1016 super_unlock_shared(sb); in iterate_supers_type()
1021 p = sb; in iterate_supers_type()
1040 struct super_block *sb; in get_active_super() local
1046 list_for_each_entry(sb, &super_blocks, s_list) { in get_active_super()
1047 if (sb->s_bdev == bdev) { in get_active_super()
1048 if (!grab_super(sb)) in get_active_super()
1050 super_unlock_excl(sb); in get_active_super()
1051 return sb; in get_active_super()
1060 struct super_block *sb; in user_get_super() local
1063 list_for_each_entry(sb, &super_blocks, s_list) { in user_get_super()
1064 if (sb->s_dev == dev) { in user_get_super()
1067 sb->s_count++; in user_get_super()
1070 born = super_lock(sb, excl); in user_get_super()
1071 if (born && sb->s_root) in user_get_super()
1072 return sb; in user_get_super()
1073 super_unlock(sb, excl); in user_get_super()
1076 __put_super(sb); in user_get_super()
1092 struct super_block *sb = fc->root->d_sb; in reconfigure_super() local
1100 if (sb->s_writers.frozen != SB_UNFROZEN) in reconfigure_super()
1103 retval = security_sb_remount(sb, fc->security); in reconfigure_super()
1109 if (!(fc->sb_flags & SB_RDONLY) && sb->s_bdev && in reconfigure_super()
1110 bdev_read_only(sb->s_bdev)) in reconfigure_super()
1113 remount_rw = !(fc->sb_flags & SB_RDONLY) && sb_rdonly(sb); in reconfigure_super()
1114 remount_ro = (fc->sb_flags & SB_RDONLY) && !sb_rdonly(sb); in reconfigure_super()
1118 if (!hlist_empty(&sb->s_pins)) { in reconfigure_super()
1119 super_unlock_excl(sb); in reconfigure_super()
1120 group_pin_kill(&sb->s_pins); in reconfigure_super()
1121 __super_lock_excl(sb); in reconfigure_super()
1122 if (!sb->s_root) in reconfigure_super()
1124 if (sb->s_writers.frozen != SB_UNFROZEN) in reconfigure_super()
1126 remount_ro = !sb_rdonly(sb); in reconfigure_super()
1129 shrink_dcache_sb(sb); in reconfigure_super()
1131 /* If we are reconfiguring to RDONLY and current sb is read/write, in reconfigure_super()
1136 sb_start_ro_state_change(sb); in reconfigure_super()
1138 retval = sb_prepare_remount_readonly(sb); in reconfigure_super()
1147 sb_start_ro_state_change(sb); in reconfigure_super()
1157 sb->s_type->name, retval); in reconfigure_super()
1161 WRITE_ONCE(sb->s_flags, ((sb->s_flags & ~fc->sb_flags_mask) | in reconfigure_super()
1163 sb_end_ro_state_change(sb); in reconfigure_super()
1173 if (remount_ro && sb->s_bdev) in reconfigure_super()
1174 invalidate_bdev(sb->s_bdev); in reconfigure_super()
1178 sb_end_ro_state_change(sb); in reconfigure_super()
1182 static void do_emergency_remount_callback(struct super_block *sb) in do_emergency_remount_callback() argument
1184 bool born = super_lock_excl(sb); in do_emergency_remount_callback()
1186 if (born && sb->s_root && sb->s_bdev && !sb_rdonly(sb)) { in do_emergency_remount_callback()
1189 fc = fs_context_for_reconfigure(sb->s_root, in do_emergency_remount_callback()
1197 super_unlock_excl(sb); in do_emergency_remount_callback()
1218 static void do_thaw_all_callback(struct super_block *sb) in do_thaw_all_callback() argument
1220 bool born = super_lock_excl(sb); in do_thaw_all_callback()
1222 if (born && sb->s_root) { in do_thaw_all_callback()
1224 while (sb->s_bdev && !thaw_bdev(sb->s_bdev)) in do_thaw_all_callback()
1225 pr_warn("Emergency Thaw on %pg\n", sb->s_bdev); in do_thaw_all_callback()
1226 thaw_super_locked(sb, FREEZE_HOLDER_USERSPACE); in do_thaw_all_callback()
1228 super_unlock_excl(sb); in do_thaw_all_callback()
1300 void kill_anon_super(struct super_block *sb) in kill_anon_super() argument
1302 dev_t dev = sb->s_dev; in kill_anon_super()
1303 generic_shutdown_super(sb); in kill_anon_super()
1304 kill_super_notify(sb); in kill_anon_super()
1309 void kill_litter_super(struct super_block *sb) in kill_litter_super() argument
1311 if (sb->s_root) in kill_litter_super()
1312 d_genocide(sb->s_root); in kill_litter_super()
1313 kill_anon_super(sb); in kill_litter_super()
1317 int set_anon_super_fc(struct super_block *sb, struct fs_context *fc) in set_anon_super_fc() argument
1319 return set_anon_super(sb, NULL); in set_anon_super_fc()
1323 static int test_keyed_super(struct super_block *sb, struct fs_context *fc) in test_keyed_super() argument
1325 return sb->s_fs_info == fc->s_fs_info; in test_keyed_super()
1335 int (*fill_super)(struct super_block *sb, in vfs_get_super() argument
1338 struct super_block *sb; in vfs_get_super() local
1341 sb = sget_fc(fc, test, set_anon_super_fc); in vfs_get_super()
1342 if (IS_ERR(sb)) in vfs_get_super()
1343 return PTR_ERR(sb); in vfs_get_super()
1345 if (!sb->s_root) { in vfs_get_super()
1346 err = fill_super(sb, fc); in vfs_get_super()
1350 sb->s_flags |= SB_ACTIVE; in vfs_get_super()
1353 fc->root = dget(sb->s_root); in vfs_get_super()
1357 deactivate_locked_super(sb); in vfs_get_super()
1362 int (*fill_super)(struct super_block *sb, in get_tree_nodev() argument
1370 int (*fill_super)(struct super_block *sb, in get_tree_single() argument
1378 int (*fill_super)(struct super_block *sb, in get_tree_keyed() argument
1440 static bool super_lock_shared_active(struct super_block *sb) in super_lock_shared_active() argument
1442 bool born = super_lock_shared(sb); in super_lock_shared_active()
1444 if (!born || !sb->s_root || !(sb->s_flags & SB_ACTIVE)) { in super_lock_shared_active()
1445 super_unlock_shared(sb); in super_lock_shared_active()
1453 struct super_block *sb = bdev->bd_holder; in fs_bdev_mark_dead() local
1455 /* bd_holder_lock ensures that the sb isn't freed */ in fs_bdev_mark_dead()
1458 if (!super_lock_shared_active(sb)) in fs_bdev_mark_dead()
1462 sync_filesystem(sb); in fs_bdev_mark_dead()
1463 shrink_dcache_sb(sb); in fs_bdev_mark_dead()
1464 invalidate_inodes(sb); in fs_bdev_mark_dead()
1465 if (sb->s_op->shutdown) in fs_bdev_mark_dead()
1466 sb->s_op->shutdown(sb); in fs_bdev_mark_dead()
1468 super_unlock_shared(sb); in fs_bdev_mark_dead()
1473 struct super_block *sb = bdev->bd_holder; in fs_bdev_sync() local
1477 if (!super_lock_shared_active(sb)) in fs_bdev_sync()
1479 sync_filesystem(sb); in fs_bdev_sync()
1480 super_unlock_shared(sb); in fs_bdev_sync()
1489 int setup_bdev_super(struct super_block *sb, int sb_flags, in setup_bdev_super() argument
1496 bdev_handle = bdev_open_by_dev(sb->s_dev, mode, sb, &fs_holder_ops); in setup_bdev_super()
1530 sb->s_bdev_handle = bdev_handle; in setup_bdev_super()
1531 sb->s_bdev = bdev; in setup_bdev_super()
1532 sb->s_bdi = bdi_get(bdev->bd_disk->bdi); in setup_bdev_super()
1534 sb->s_iflags |= SB_I_STABLE_WRITES; in setup_bdev_super()
1538 snprintf(sb->s_id, sizeof(sb->s_id), "%pg", bdev); in setup_bdev_super()
1539 shrinker_debugfs_rename(&sb->s_shrink, "sb-%s:%s", sb->s_type->name, in setup_bdev_super()
1540 sb->s_id); in setup_bdev_super()
1541 sb_set_blocksize(sb, block_size(bdev)); in setup_bdev_super()
1584 * bdev_mark_dead()). It is safe because we have active sb in get_tree_bdev()
1636 * bdev_mark_dead()). It is safe because we have active sb in mount_bdev()
1656 void kill_block_super(struct super_block *sb) in kill_block_super() argument
1658 struct block_device *bdev = sb->s_bdev; in kill_block_super()
1660 generic_shutdown_super(sb); in kill_block_super()
1663 bdev_release(sb->s_bdev_handle); in kill_block_super()
1755 struct super_block *sb; in vfs_get_tree() local
1777 sb = fc->root->d_sb; in vfs_get_tree()
1778 WARN_ON(!sb->s_bdi); in vfs_get_tree()
1787 super_wake(sb, SB_BORN); in vfs_get_tree()
1789 error = security_sb_set_mnt_opts(sb, fc->security, 0, NULL); in vfs_get_tree()
1801 WARN((sb->s_maxbytes < 0), "%s set sb->s_maxbytes to " in vfs_get_tree()
1802 "negative value (%lld)\n", fc->fs_type->name, sb->s_maxbytes); in vfs_get_tree()
1812 int super_setup_bdi_name(struct super_block *sb, char *fmt, ...) in super_setup_bdi_name() argument
1829 WARN_ON(sb->s_bdi != &noop_backing_dev_info); in super_setup_bdi_name()
1830 sb->s_bdi = bdi; in super_setup_bdi_name()
1831 sb->s_iflags |= SB_I_PERSB_BDI; in super_setup_bdi_name()
1841 int super_setup_bdi(struct super_block *sb) in super_setup_bdi() argument
1845 return super_setup_bdi_name(sb, "%.28s-%ld", sb->s_type->name, in super_setup_bdi()
1852 * @sb: the super for which we wait
1858 static void sb_wait_write(struct super_block *sb, int level) in sb_wait_write() argument
1860 percpu_down_write(sb->s_writers.rw_sem + level-1); in sb_wait_write()
1867 static void lockdep_sb_freeze_release(struct super_block *sb) in lockdep_sb_freeze_release() argument
1872 percpu_rwsem_release(sb->s_writers.rw_sem + level, 0, _THIS_IP_); in lockdep_sb_freeze_release()
1876 * Tell lockdep we are holding these locks before we call ->unfreeze_fs(sb).
1878 static void lockdep_sb_freeze_acquire(struct super_block *sb) in lockdep_sb_freeze_acquire() argument
1883 percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); in lockdep_sb_freeze_acquire()
1886 static void sb_freeze_unlock(struct super_block *sb, int level) in sb_freeze_unlock() argument
1889 percpu_up_write(sb->s_writers.rw_sem + level); in sb_freeze_unlock()
1892 static int wait_for_partially_frozen(struct super_block *sb) in wait_for_partially_frozen() argument
1897 unsigned short old = sb->s_writers.frozen; in wait_for_partially_frozen()
1899 up_write(&sb->s_umount); in wait_for_partially_frozen()
1900 ret = wait_var_event_killable(&sb->s_writers.frozen, in wait_for_partially_frozen()
1901 sb->s_writers.frozen != old); in wait_for_partially_frozen()
1902 down_write(&sb->s_umount); in wait_for_partially_frozen()
1904 sb->s_writers.frozen != SB_UNFROZEN && in wait_for_partially_frozen()
1905 sb->s_writers.frozen != SB_FREEZE_COMPLETE); in wait_for_partially_frozen()
1912 * @sb: the super to lock
1929 * During this function, sb->s_writers.frozen goes through these values:
1952 * sb->s_writers.frozen is protected by sb->s_umount.
1954 int freeze_super(struct super_block *sb, enum freeze_holder who) in freeze_super() argument
1958 atomic_inc(&sb->s_active); in freeze_super()
1959 if (!super_lock_excl(sb)) in freeze_super()
1963 if (sb->s_writers.frozen == SB_FREEZE_COMPLETE) { in freeze_super()
1964 if (sb->s_writers.freeze_holders & who) { in freeze_super()
1965 deactivate_locked_super(sb); in freeze_super()
1969 WARN_ON(sb->s_writers.freeze_holders == 0); in freeze_super()
1975 sb->s_writers.freeze_holders |= who; in freeze_super()
1976 super_unlock_excl(sb); in freeze_super()
1980 if (sb->s_writers.frozen != SB_UNFROZEN) { in freeze_super()
1981 ret = wait_for_partially_frozen(sb); in freeze_super()
1983 deactivate_locked_super(sb); in freeze_super()
1990 if (!(sb->s_flags & SB_BORN)) { in freeze_super()
1991 super_unlock_excl(sb); in freeze_super()
1995 if (sb_rdonly(sb)) { in freeze_super()
1997 sb->s_writers.freeze_holders |= who; in freeze_super()
1998 sb->s_writers.frozen = SB_FREEZE_COMPLETE; in freeze_super()
1999 wake_up_var(&sb->s_writers.frozen); in freeze_super()
2000 super_unlock_excl(sb); in freeze_super()
2004 sb->s_writers.frozen = SB_FREEZE_WRITE; in freeze_super()
2006 super_unlock_excl(sb); in freeze_super()
2007 sb_wait_write(sb, SB_FREEZE_WRITE); in freeze_super()
2008 if (!super_lock_excl(sb)) in freeze_super()
2012 sb->s_writers.frozen = SB_FREEZE_PAGEFAULT; in freeze_super()
2013 sb_wait_write(sb, SB_FREEZE_PAGEFAULT); in freeze_super()
2016 ret = sync_filesystem(sb); in freeze_super()
2018 sb->s_writers.frozen = SB_UNFROZEN; in freeze_super()
2019 sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT); in freeze_super()
2020 wake_up_var(&sb->s_writers.frozen); in freeze_super()
2021 deactivate_locked_super(sb); in freeze_super()
2026 sb->s_writers.frozen = SB_FREEZE_FS; in freeze_super()
2027 sb_wait_write(sb, SB_FREEZE_FS); in freeze_super()
2029 if (sb->s_op->freeze_fs) { in freeze_super()
2030 ret = sb->s_op->freeze_fs(sb); in freeze_super()
2034 sb->s_writers.frozen = SB_UNFROZEN; in freeze_super()
2035 sb_freeze_unlock(sb, SB_FREEZE_FS); in freeze_super()
2036 wake_up_var(&sb->s_writers.frozen); in freeze_super()
2037 deactivate_locked_super(sb); in freeze_super()
2045 sb->s_writers.freeze_holders |= who; in freeze_super()
2046 sb->s_writers.frozen = SB_FREEZE_COMPLETE; in freeze_super()
2047 wake_up_var(&sb->s_writers.frozen); in freeze_super()
2048 lockdep_sb_freeze_release(sb); in freeze_super()
2049 super_unlock_excl(sb); in freeze_super()
2060 static int thaw_super_locked(struct super_block *sb, enum freeze_holder who) in thaw_super_locked() argument
2064 if (sb->s_writers.frozen == SB_FREEZE_COMPLETE) { in thaw_super_locked()
2065 if (!(sb->s_writers.freeze_holders & who)) { in thaw_super_locked()
2066 super_unlock_excl(sb); in thaw_super_locked()
2075 if (sb->s_writers.freeze_holders & ~who) { in thaw_super_locked()
2076 sb->s_writers.freeze_holders &= ~who; in thaw_super_locked()
2077 deactivate_locked_super(sb); in thaw_super_locked()
2081 super_unlock_excl(sb); in thaw_super_locked()
2085 if (sb_rdonly(sb)) { in thaw_super_locked()
2086 sb->s_writers.freeze_holders &= ~who; in thaw_super_locked()
2087 sb->s_writers.frozen = SB_UNFROZEN; in thaw_super_locked()
2088 wake_up_var(&sb->s_writers.frozen); in thaw_super_locked()
2092 lockdep_sb_freeze_acquire(sb); in thaw_super_locked()
2094 if (sb->s_op->unfreeze_fs) { in thaw_super_locked()
2095 error = sb->s_op->unfreeze_fs(sb); in thaw_super_locked()
2098 lockdep_sb_freeze_release(sb); in thaw_super_locked()
2099 super_unlock_excl(sb); in thaw_super_locked()
2104 sb->s_writers.freeze_holders &= ~who; in thaw_super_locked()
2105 sb->s_writers.frozen = SB_UNFROZEN; in thaw_super_locked()
2106 wake_up_var(&sb->s_writers.frozen); in thaw_super_locked()
2107 sb_freeze_unlock(sb, SB_FREEZE_FS); in thaw_super_locked()
2109 deactivate_locked_super(sb); in thaw_super_locked()
2115 * @sb: the super to thaw
2125 int thaw_super(struct super_block *sb, enum freeze_holder who) in thaw_super() argument
2127 if (!super_lock_excl(sb)) in thaw_super()
2129 return thaw_super_locked(sb, who); in thaw_super()
2139 int sb_init_dio_done_wq(struct super_block *sb) in sb_init_dio_done_wq() argument
2144 sb->s_id); in sb_init_dio_done_wq()
2150 old = cmpxchg(&sb->s_dio_done_wq, NULL, wq); in sb_init_dio_done_wq()