GFS2: Fix "truncate in progress" hang
[linux-2.6.git] / fs / gfs2 / glops.c
index 68ee665..8ebff8e 100644 (file)
@@ -227,6 +227,7 @@ static int inode_go_demote_ok(struct gfs2_glock *gl)
 static int inode_go_lock(struct gfs2_holder *gh)
 {
        struct gfs2_glock *gl = gh->gh_gl;
+       struct gfs2_sbd *sdp = gl->gl_sbd;
        struct gfs2_inode *ip = gl->gl_object;
        int error = 0;
 
@@ -241,8 +242,14 @@ static int inode_go_lock(struct gfs2_holder *gh)
 
        if ((ip->i_diskflags & GFS2_DIF_TRUNC_IN_PROG) &&
            (gl->gl_state == LM_ST_EXCLUSIVE) &&
-           (gh->gh_state == LM_ST_EXCLUSIVE))
-               error = gfs2_truncatei_resume(ip);
+           (gh->gh_state == LM_ST_EXCLUSIVE)) {
+               spin_lock(&sdp->sd_trunc_lock);
+               if (list_empty(&ip->i_trunc_list))
+                       list_add(&sdp->sd_trunc_list, &ip->i_trunc_list);
+               spin_unlock(&sdp->sd_trunc_lock);
+               wake_up(&sdp->sd_quota_wait);
+               return 1;
+       }
 
        return error;
 }