From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bob Peterson Date: Tue, 24 Nov 2020 15:26:49 -0500 (EST) Subject: [Cluster-devel] [GFS2 PATCH] gfs2: Remove sb_start_write from gfs2_statfs_sync In-Reply-To: <355304031.29450600.1606249586453.JavaMail.zimbra@redhat.com> Message-ID: <1409715771.29450602.1606249609812.JavaMail.zimbra@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 --- 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; }