gfs2: Fix iomap write page reclaim deadlock
[sfrench/cifs-2.6.git] / fs / gfs2 / aops.c
index 05dd78f4b2b3b5aa6982d8475be770d4a37f712c..6210d4429d8454030f7a82b4f5c373ca56ccb986 100644 (file)
@@ -649,7 +649,7 @@ out_uninit:
  */
 void adjust_fs_space(struct inode *inode)
 {
-       struct gfs2_sbd *sdp = inode->i_sb->s_fs_info;
+       struct gfs2_sbd *sdp = GFS2_SB(inode);
        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;
@@ -657,10 +657,13 @@ void adjust_fs_space(struct inode *inode)
        struct buffer_head *m_bh, *l_bh;
        u64 fs_total, new_free;
 
+       if (gfs2_trans_begin(sdp, 2 * RES_STATFS, 0) != 0)
+               return;
+
        /* Total up the file system space, according to the latest rindex. */
        fs_total = gfs2_ri_total(sdp);
        if (gfs2_meta_inode_buffer(m_ip, &m_bh) != 0)
-               return;
+               goto out;
 
        spin_lock(&sdp->sd_statfs_spin);
        gfs2_statfs_change_in(m_sc, m_bh->b_data +
@@ -675,11 +678,14 @@ void adjust_fs_space(struct inode *inode)
        gfs2_statfs_change(sdp, new_free, new_free, 0);
 
        if (gfs2_meta_inode_buffer(l_ip, &l_bh) != 0)
-               goto out;
+               goto out2;
        update_statfs(sdp, m_bh, l_bh);
        brelse(l_bh);
-out:
+out2:
        brelse(m_bh);
+out:
+       sdp->sd_rindex_uptodate = 0;
+       gfs2_trans_end(sdp);
 }
 
 /**