Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 551de6f3 authored by Al Viro's avatar Al Viro
Browse files

Leave superblocks on s_list until the end



We used to remove from s_list and s_instances at the same
time.  So let's *not* do the former and skip superblocks
that have empty s_instances in the loops over s_list.

The next step, of course, will be to get rid of rescan logics
in those loops.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1712ac8f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -568,6 +568,8 @@ static void do_thaw_all(struct work_struct *work)
	spin_lock(&sb_lock);
restart:
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		sb->s_count++;
		spin_unlock(&sb_lock);
		down_read(&sb->s_umount);
+2 −0
Original line number Diff line number Diff line
@@ -552,6 +552,8 @@ static void prune_dcache(int count)
		prune_ratio = unused / count;
	spin_lock(&sb_lock);
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		if (sb->s_nr_dentry_unused == 0)
			continue;
		sb->s_count++;
+2 −0
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ static void drop_pagecache(void)
	spin_lock(&sb_lock);
restart:
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		sb->s_count++;
		spin_unlock(&sb_lock);
		down_read(&sb->s_umount);
+2 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ static int quota_sync_all(int type)
	spin_lock(&sb_lock);
restart:
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		if (!sb->s_qcop || !sb->s_qcop->quota_sync)
			continue;

+13 −3
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ static int __put_super(struct super_block *sb)
	int ret = 0;

	if (!--sb->s_count) {
		list_del_init(&sb->s_list);
		destroy_super(sb);
		ret = 1;
	}
@@ -151,7 +152,7 @@ static int __put_super(struct super_block *sb)
int __put_super_and_need_restart(struct super_block *sb)
{
	/* check for race with generic_shutdown_super() */
	if (list_empty(&sb->s_list)) {
	if (list_empty(&sb->s_instances)) {
		/* super block is removed, need to restart... */
		__put_super(sb);
		return 1;
@@ -308,8 +309,7 @@ void generic_shutdown_super(struct super_block *sb)
	}
	spin_lock(&sb_lock);
	/* should be initialized for __put_super_and_need_restart() */
	list_del_init(&sb->s_list);
	list_del(&sb->s_instances);
	list_del_init(&sb->s_instances);
	spin_unlock(&sb_lock);
	up_write(&sb->s_umount);
}
@@ -400,6 +400,8 @@ void sync_supers(void)
	spin_lock(&sb_lock);
restart:
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		if (sb->s_op->write_super && sb->s_dirt) {
			sb->s_count++;
			spin_unlock(&sb_lock);
@@ -435,6 +437,8 @@ struct super_block * get_super(struct block_device *bdev)
	spin_lock(&sb_lock);
rescan:
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		if (sb->s_bdev == bdev) {
			sb->s_count++;
			spin_unlock(&sb_lock);
@@ -471,6 +475,8 @@ struct super_block *get_active_super(struct block_device *bdev)

	spin_lock(&sb_lock);
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		if (sb->s_bdev != bdev)
			continue;

@@ -490,6 +496,8 @@ struct super_block * user_get_super(dev_t dev)
	spin_lock(&sb_lock);
rescan:
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		if (sb->s_dev ==  dev) {
			sb->s_count++;
			spin_unlock(&sb_lock);
@@ -600,6 +608,8 @@ static void do_emergency_remount(struct work_struct *work)

	spin_lock(&sb_lock);
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (list_empty(&sb->s_instances))
			continue;
		sb->s_count++;
		spin_unlock(&sb_lock);
		down_write(&sb->s_umount);
Loading