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

Commit ebc1ac16 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro
Browse files

->write_super lock_super pushdown



Push down lock_super into ->write_super instances and remove it from the
caller.

Following filesystem don't need ->s_lock in ->write_super and are skipped:

 * bfs, nilfs2 - no other uses of s_lock and have internal locks in
	->write_super
 * ext2 - uses BKL in ext2_write_super and has internal calls without s_lock
 * reiserfs - no other uses of s_lock as has reiserfs_write_lock (BKL) in
 	->write_super
 * xfs - no other uses of s_lock and uses internal lock (buffer lock on
	superblock buffer) to serialize ->write_super.  Also xfs_fs_write_super
	is superflous and will go away in the next merge window

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 01ba6875
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ affs_write_super(struct super_block *sb)
	int clean = 2;
	struct affs_sb_info *sbi = AFFS_SB(sb);

	lock_super(sb);
	if (!(sb->s_flags & MS_RDONLY)) {
		//	if (sbi->s_bitmap[i].bm_bh) {
		//		if (buffer_dirty(sbi->s_bitmap[i].bm_bh)) {
@@ -66,6 +67,7 @@ affs_write_super(struct super_block *sb)
		sb->s_dirt = !clean;	/* redo until bitmap synced */
	} else
		sb->s_dirt = 0;
	unlock_super(sb);

	pr_debug("AFFS: write_super() at %lu, clean=%d\n", get_seconds(), clean);
}
+2 −0
Original line number Diff line number Diff line
@@ -214,6 +214,7 @@ static void exofs_write_super(struct super_block *sb)
		return;
	}

	lock_super(sb);
	lock_kernel();
	sbi = sb->s_fs_info;
	fscb->s_nextid = cpu_to_le64(sbi->s_nextid);
@@ -246,6 +247,7 @@ static void exofs_write_super(struct super_block *sb)
	if (or)
		osd_end_request(or);
	unlock_kernel();
	unlock_super(sb);
	kfree(fscb);
}

+3 −1
Original line number Diff line number Diff line
@@ -579,7 +579,7 @@ static void ext4_put_super(struct super_block *sb)
	lock_super(sb);
	lock_kernel();
	if (sb->s_dirt)
		ext4_write_super(sb);
		ext4_commit_super(sb, 1);

	ext4_release_system_zone(sb);
	ext4_mb_release(sb);
@@ -3336,7 +3336,9 @@ int ext4_force_commit(struct super_block *sb)

static void ext4_write_super(struct super_block *sb)
{
	lock_super(sb);
	ext4_commit_super(sb, 1);
	unlock_super(sb);
}

static int ext4_sync_fs(struct super_block *sb, int wait)
+2 −0
Original line number Diff line number Diff line
@@ -441,10 +441,12 @@ static void fat_clear_inode(struct inode *inode)

static void fat_write_super(struct super_block *sb)
{
	lock_super(sb);
	sb->s_dirt = 0;

	if (!(sb->s_flags & MS_RDONLY))
		fat_clusters_flush(sb);
	unlock_super(sb);
}

static void fat_put_super(struct super_block *sb)
+5 −3
Original line number Diff line number Diff line
@@ -49,11 +49,13 @@ MODULE_LICENSE("GPL");
 */
static void hfs_write_super(struct super_block *sb)
{
	lock_super(sb);
	sb->s_dirt = 0;
	if (sb->s_flags & MS_RDONLY)
		return;

	/* sync everything to the buffers */
	if (!(sb->s_flags & MS_RDONLY))
		hfs_mdb_commit(sb);
	unlock_super(sb);
}

/*
Loading