Hi, Before this patch, function gfs2_statfs_sync called sb_start_write. This is a violation of the basic vfs rules that state that sb_start_write should always be taken before s_umount. See this document:
https://www.kernel.org/doc/htmldocs/filesystems/API-sb-start-write.html "Since freeze protection behaves as a lock, users have to preserve ordering of freeze protection and other filesystem locks. Generally, freeze protection should be the outermost lock. In particular, we have: sb_start_write -> i_mutex (write path, truncate, directory ops, ...) -> s_umount (freeze_super, thaw_super)" deactivate_super down_write(&s->s_umount); <------------------------------------ s_umount deactivate_locked_super gfs2_kill_sb kill_block_super generic_shutdown_super gfs2_put_super gfs2_make_fs_ro gfs2_statfs_sync(sdp->sd_vfs, 0); sb_start_write <--------------------- sb_start_write As far as I can tell, gfs2_statfs_sync doesn't need to call sb_start_write any more than any other write to the file system, which are policed by glocks. None of the other functions in gfs2 lock sb_start_write so it only affects how vfs calls gfs2. This patch simply removes the call to sb_start_write. Signed-off-by: Bob Peterson <[email protected]> --- fs/gfs2/super.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index b3d951ab8068..2f56acc41c04 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -353,7 +353,6 @@ int gfs2_statfs_sync(struct super_block *sb, int type) struct buffer_head *m_bh, *l_bh; int error; - sb_start_write(sb); error = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE, GL_NOCACHE, &gh); if (error) @@ -392,7 +391,6 @@ int gfs2_statfs_sync(struct super_block *sb, int type) out_unlock: gfs2_glock_dq_uninit(&gh); out: - sb_end_write(sb); return error; }
