diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index f58716567972ec121762db4ce94a4da4245b6a8d..66e7172e013409370ed4abfd3a41cd7d43ac340f 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -747,18 +747,21 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, put_page(page); gfs2_trans_end(sdp); - if (pos + len > ip->i_inode.i_size) - gfs2_trim_blocks(&ip->i_inode); - goto out_trans_fail; + if (alloc_required) { + gfs2_inplace_release(ip); + if (pos + len > ip->i_inode.i_size) + gfs2_trim_blocks(&ip->i_inode); + } + goto out_qunlock; out_endtrans: gfs2_trans_end(sdp); out_trans_fail: - if (alloc_required) { + if (alloc_required) gfs2_inplace_release(ip); out_qunlock: + if (alloc_required) gfs2_quota_unlock(ip); - } out_unlock: if (&ip->i_inode == sdp->sd_rindex) { gfs2_glock_dq(&m_ip->i_gh);