Lines Matching refs:s
144 static void destroy_super(struct super_block *s) in destroy_super() argument
147 list_lru_destroy(&s->s_dentry_lru); in destroy_super()
148 list_lru_destroy(&s->s_inode_lru); in destroy_super()
150 percpu_counter_destroy(&s->s_writers.counter[i]); in destroy_super()
151 security_sb_free(s); in destroy_super()
152 WARN_ON(!list_empty(&s->s_mounts)); in destroy_super()
153 kfree(s->s_subtype); in destroy_super()
154 kfree(s->s_options); in destroy_super()
155 kfree_rcu(s, rcu); in destroy_super()
168 struct super_block *s = kzalloc(sizeof(struct super_block), GFP_USER); in alloc_super() local
172 if (!s) in alloc_super()
175 INIT_LIST_HEAD(&s->s_mounts); in alloc_super()
177 if (security_sb_alloc(s)) in alloc_super()
181 if (percpu_counter_init(&s->s_writers.counter[i], 0, in alloc_super()
184 lockdep_init_map(&s->s_writers.lock_map[i], sb_writers_name[i], in alloc_super()
187 init_waitqueue_head(&s->s_writers.wait); in alloc_super()
188 init_waitqueue_head(&s->s_writers.wait_unfrozen); in alloc_super()
189 s->s_bdi = &noop_backing_dev_info; in alloc_super()
190 s->s_flags = flags; in alloc_super()
191 INIT_HLIST_NODE(&s->s_instances); in alloc_super()
192 INIT_HLIST_BL_HEAD(&s->s_anon); in alloc_super()
193 INIT_LIST_HEAD(&s->s_inodes); in alloc_super()
195 if (list_lru_init_memcg(&s->s_dentry_lru)) in alloc_super()
197 if (list_lru_init_memcg(&s->s_inode_lru)) in alloc_super()
200 init_rwsem(&s->s_umount); in alloc_super()
201 lockdep_set_class(&s->s_umount, &type->s_umount_key); in alloc_super()
217 down_write_nested(&s->s_umount, SINGLE_DEPTH_NESTING); in alloc_super()
218 s->s_count = 1; in alloc_super()
219 atomic_set(&s->s_active, 1); in alloc_super()
220 mutex_init(&s->s_vfs_rename_mutex); in alloc_super()
221 lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key); in alloc_super()
222 mutex_init(&s->s_dquot.dqio_mutex); in alloc_super()
223 mutex_init(&s->s_dquot.dqonoff_mutex); in alloc_super()
224 s->s_maxbytes = MAX_NON_LFS; in alloc_super()
225 s->s_op = &default_op; in alloc_super()
226 s->s_time_gran = 1000000000; in alloc_super()
227 s->cleancache_poolid = CLEANCACHE_NO_POOL; in alloc_super()
229 s->s_shrink.seeks = DEFAULT_SEEKS; in alloc_super()
230 s->s_shrink.scan_objects = super_cache_scan; in alloc_super()
231 s->s_shrink.count_objects = super_cache_count; in alloc_super()
232 s->s_shrink.batch = 1024; in alloc_super()
233 s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE; in alloc_super()
234 return s; in alloc_super()
237 destroy_super(s); in alloc_super()
280 void deactivate_locked_super(struct super_block *s) in deactivate_locked_super() argument
282 struct file_system_type *fs = s->s_type; in deactivate_locked_super()
283 if (atomic_dec_and_test(&s->s_active)) { in deactivate_locked_super()
284 cleancache_invalidate_fs(s); in deactivate_locked_super()
285 unregister_shrinker(&s->s_shrink); in deactivate_locked_super()
286 fs->kill_sb(s); in deactivate_locked_super()
293 list_lru_destroy(&s->s_dentry_lru); in deactivate_locked_super()
294 list_lru_destroy(&s->s_inode_lru); in deactivate_locked_super()
297 put_super(s); in deactivate_locked_super()
299 up_write(&s->s_umount); in deactivate_locked_super()
313 void deactivate_super(struct super_block *s) in deactivate_super() argument
315 if (!atomic_add_unless(&s->s_active, -1, 1)) { in deactivate_super()
316 down_write(&s->s_umount); in deactivate_super()
317 deactivate_locked_super(s); in deactivate_super()
336 static int grab_super(struct super_block *s) __releases(sb_lock) in grab_super() argument
338 s->s_count++; in grab_super()
340 down_write(&s->s_umount); in grab_super()
341 if ((s->s_flags & MS_BORN) && atomic_inc_not_zero(&s->s_active)) { in grab_super()
342 put_super(s); in grab_super()
345 up_write(&s->s_umount); in grab_super()
346 put_super(s); in grab_super()
443 struct super_block *s = NULL; in sget() local
455 if (s) { in sget()
456 up_write(&s->s_umount); in sget()
457 destroy_super(s); in sget()
458 s = NULL; in sget()
463 if (!s) { in sget()
465 s = alloc_super(type, flags); in sget()
466 if (!s) in sget()
471 err = set(s, data); in sget()
474 up_write(&s->s_umount); in sget()
475 destroy_super(s); in sget()
478 s->s_type = type; in sget()
479 strlcpy(s->s_id, type->name, sizeof(s->s_id)); in sget()
480 list_add_tail(&s->s_list, &super_blocks); in sget()
481 hlist_add_head(&s->s_instances, &type->fs_supers); in sget()
484 register_shrinker(&s->s_shrink); in sget()
485 return s; in sget()
620 struct super_block *s = get_super(bdev); in get_super_thawed() local
621 if (!s || s->s_writers.frozen == SB_UNFROZEN) in get_super_thawed()
622 return s; in get_super_thawed()
623 up_read(&s->s_umount); in get_super_thawed()
624 wait_event(s->s_writers.wait_unfrozen, in get_super_thawed()
625 s->s_writers.frozen == SB_UNFROZEN); in get_super_thawed()
626 put_super(s); in get_super_thawed()
869 int set_anon_super(struct super_block *s, void *data) in set_anon_super() argument
871 return get_anon_bdev(&s->s_dev); in set_anon_super()
931 static int set_bdev_super(struct super_block *s, void *data) in set_bdev_super() argument
933 s->s_bdev = data; in set_bdev_super()
934 s->s_dev = s->s_bdev->bd_dev; in set_bdev_super()
940 s->s_bdi = &bdev_get_queue(s->s_bdev)->backing_dev_info; in set_bdev_super()
944 static int test_bdev_super(struct super_block *s, void *data) in test_bdev_super() argument
946 return (void *)s->s_bdev == data; in test_bdev_super()
954 struct super_block *s; in mount_bdev() local
976 s = sget(fs_type, test_bdev_super, set_bdev_super, flags | MS_NOSEC, in mount_bdev()
979 if (IS_ERR(s)) in mount_bdev()
982 if (s->s_root) { in mount_bdev()
983 if ((flags ^ s->s_flags) & MS_RDONLY) { in mount_bdev()
984 deactivate_locked_super(s); in mount_bdev()
996 up_write(&s->s_umount); in mount_bdev()
998 down_write(&s->s_umount); in mount_bdev()
1002 s->s_mode = mode; in mount_bdev()
1003 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); in mount_bdev()
1004 sb_set_blocksize(s, block_size(bdev)); in mount_bdev()
1005 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); in mount_bdev()
1007 deactivate_locked_super(s); in mount_bdev()
1011 s->s_flags |= MS_ACTIVE; in mount_bdev()
1012 bdev->bd_super = s; in mount_bdev()
1015 return dget(s->s_root); in mount_bdev()
1018 error = PTR_ERR(s); in mount_bdev()
1046 struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL); in mount_nodev() local
1048 if (IS_ERR(s)) in mount_nodev()
1049 return ERR_CAST(s); in mount_nodev()
1051 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); in mount_nodev()
1053 deactivate_locked_super(s); in mount_nodev()
1056 s->s_flags |= MS_ACTIVE; in mount_nodev()
1057 return dget(s->s_root); in mount_nodev()
1061 static int compare_single(struct super_block *s, void *p) in compare_single() argument
1070 struct super_block *s; in mount_single() local
1073 s = sget(fs_type, compare_single, set_anon_super, flags, NULL); in mount_single()
1074 if (IS_ERR(s)) in mount_single()
1075 return ERR_CAST(s); in mount_single()
1076 if (!s->s_root) { in mount_single()
1077 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); in mount_single()
1079 deactivate_locked_super(s); in mount_single()
1082 s->s_flags |= MS_ACTIVE; in mount_single()
1084 do_remount_sb(s, flags, data, 0); in mount_single()
1086 return dget(s->s_root); in mount_single()