diff options
Diffstat (limited to 'fs/gfs2/super.c')
| -rw-r--r-- | fs/gfs2/super.c | 40 | 
1 files changed, 26 insertions, 14 deletions
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 0a680133647..f522bb01797 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -353,7 +353,7 @@ fail:  	return error;  } -static void gfs2_statfs_change_in(struct gfs2_statfs_change_host *sc, const void *buf) +void gfs2_statfs_change_in(struct gfs2_statfs_change_host *sc, const void *buf)  {  	const struct gfs2_statfs_change *str = buf; @@ -441,6 +441,29 @@ void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free,  	brelse(l_bh);  } +void update_statfs(struct gfs2_sbd *sdp, struct buffer_head *m_bh, +		   struct buffer_head *l_bh) +{ +	struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode); +	struct gfs2_inode *l_ip = GFS2_I(sdp->sd_sc_inode); +	struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master; +	struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local; + +	gfs2_trans_add_bh(l_ip->i_gl, l_bh, 1); + +	spin_lock(&sdp->sd_statfs_spin); +	m_sc->sc_total += l_sc->sc_total; +	m_sc->sc_free += l_sc->sc_free; +	m_sc->sc_dinodes += l_sc->sc_dinodes; +	memset(l_sc, 0, sizeof(struct gfs2_statfs_change)); +	memset(l_bh->b_data + sizeof(struct gfs2_dinode), +	       0, sizeof(struct gfs2_statfs_change)); +	spin_unlock(&sdp->sd_statfs_spin); + +	gfs2_trans_add_bh(m_ip->i_gl, m_bh, 1); +	gfs2_statfs_change_out(m_sc, m_bh->b_data + sizeof(struct gfs2_dinode)); +} +  int gfs2_statfs_sync(struct gfs2_sbd *sdp)  {  	struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode); @@ -477,19 +500,7 @@ int gfs2_statfs_sync(struct gfs2_sbd *sdp)  	if (error)  		goto out_bh2; -	gfs2_trans_add_bh(l_ip->i_gl, l_bh, 1); - -	spin_lock(&sdp->sd_statfs_spin); -	m_sc->sc_total += l_sc->sc_total; -	m_sc->sc_free += l_sc->sc_free; -	m_sc->sc_dinodes += l_sc->sc_dinodes; -	memset(l_sc, 0, sizeof(struct gfs2_statfs_change)); -	memset(l_bh->b_data + sizeof(struct gfs2_dinode), -	       0, sizeof(struct gfs2_statfs_change)); -	spin_unlock(&sdp->sd_statfs_spin); - -	gfs2_trans_add_bh(m_ip->i_gl, m_bh, 1); -	gfs2_statfs_change_out(m_sc, m_bh->b_data + sizeof(struct gfs2_dinode)); +	update_statfs(sdp, m_bh, l_bh);  	gfs2_trans_end(sdp); @@ -680,6 +691,7 @@ static int gfs2_make_fs_ro(struct gfs2_sbd *sdp)  	struct gfs2_holder t_gh;  	int error; +	flush_workqueue(gfs2_delete_workqueue);  	gfs2_quota_sync(sdp);  	gfs2_statfs_sync(sdp);  |